性能

公平性

师成师成· 更新于 2026-09-28· 阅读 7 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

什么是 FairCallQueue?

公平调用队列(Fair Call Queue,FCQ)是一种多级优先级队列,它根据用户身份来调度 RPC 请求。FCQ 配合调度器(通常是 DecayRpcScheduler)工作,由调度器跟踪每个用户的调用量随时间的变化情况,根据使用模式分配优先级级别,并使用加权轮询复用器在所有用户之间公平分配处理能力。

本文档介绍了在 Ozone 中配置 FairCallQueue 功能的相关信息。要启用并使用 FairCallQueue,OM - S3G 之间的通信必须使用 Hadoop RPC 作为传输协议,目前尚无 gRPC 的实现。

Ozone 有一个自定义的 IdentityProvider 实现,必须在配置中指定,否则将无法进行 S3G 身份模拟(impersonation),这会导致 FairCallQueue 失效,因为它只能读取到一个用户,即 S3G 特殊用户,而不是 S3G 客户端用户。

为什么公平性很重要?

在多租户环境中,多个用户或应用通过 S3 Gateway 访问 Ozone,公平性至关重要。如果没有公平调度:

  • 单个高流量用户或应用可能淹没请求队列,导致其他用户的请求无限期等待或超时
  • 具有合理但较低流量负载的用户可能会遇到难以接受的延迟,因为他们的请求被排在一个主导用户的大量请求之后
  • 系统资源可能被激进的客户端独占
  • 服务质量(QoS)保证无法得到维持

通过实现公平调用队列,Ozone 确保所有用户都能公平地访问 OM 资源,从而获得更可预测的性能和更好的多租户支持。

FCQ 应该应用在哪里?

FCQ 应应用于 Ozone Manager(OM) 层级的 S3 Gateway(S3G)→ Ozone Manager 通信路径。当 S3 Gateway 将来自多个 S3 客户端的请求转发给 Ozone Manager 时,FCQ 使用每个请求的 S3 访问 ID 来识别用户,并根据其最近的调用量对请求确定优先级,从而在所有用户之间公平分配资源。

Hadoop FCQ 框架

Ozone 借助 Hadoop 的 FairCallQueue 框架来实现公平性。有关 FairCallQueue 的工作原理、架构以及高级配置选项的详细信息,请参阅 Hadoop FairCallQueue 文档。

配置

必须指定一个端口,OM 将把所有活动转发到该端口,FairCallQueue 和 DecayRpcScheduler 也将监听该端口。此外,该端口必须出现在每一个配置项的名称中。

以下示例中使用的端口:9862

<property>
   <name>ozone.om.address</name>
   <value>OMDomain:9862</value>
</property>

<property>
    <name>ozone.om.s3.grpc.server_enabled</name>
    <value>false</value>
</property>

<property>
    <name>ozone.om.transport.class</name>
    <value>org.apache.hadoop.ozone.om.protocolPB.Hadoop3OmTransportFactory</value>
</property>

<property>
   <name>ipc.9862.callqueue.impl</name>
   <value>org.apache.hadoop.ipc_.FairCallQueue</value>
</property>

<property>
   <name>ipc.9862.scheduler.impl</name>
   <value>org.apache.hadoop.ipc_.DecayRpcScheduler</value>
</property>

<property>
   <name>ipc.9862.identity-provider.impl</name>
   <value>org.apache.hadoop.ozone.om.helpers.OzoneIdentityProvider</value>
</property>

<property>
   <name>ipc.9862.scheduler.priority.levels</name>
   <value>2</value>
</property>

<property>
   <name>ipc.9862.backoff.enable</name>
   <value>true</value>
</property>

<property>
   <name>ipc.9862.faircallqueue.multiplexer.weights</name>
   <value>2,1</value>
</property>

<property>
    <name>ipc.9862.decay-scheduler.thresholds</name>
    <value>50</value>
</property>

验证步骤

  1. 检查日志:启动 OM 后,在日志中确认 FCQ 已初始化:

    FairCallQueue is in use with <N> queues with total capacity of <capacity>
  2. 验证指标:检查 FCQ 指标是否正在采集(通过 JMX 或 metrics 端点):

    • 每个优先级的 FairCallQueueSize_p<N>
    • 溢出统计的 FairCallQueueOverflowedCalls_p<N>

故障排查

  1. FCQ 未生效:确认已配置 OzoneIdentityProvider,gRPC 已禁用(ozone.om.s3.grpc.server_enabled=false),并且所有 ipc.<port>.* 属性中的端口号一致。
  2. 延迟过高:增大队列容量(ipc.server.max.callqueue.length),或调整调度器阈值(ipc.<port>.decay-scheduler.thresholds)。
  3. 配置错误:确保 ozone.om.address 与 ipc.<port>.* 属性之间的端口一致,并核实所有类名拼写正确。
  4. 监控指标:通过 JMX 查看 FairCallQueueSize_p<N> 和 FairCallQueueOverflowedCalls_p<N>,以诊断队列行为。

评论

登录后参与评论

正在加载评论…