1. Current Statistics Method

Data Flow

[Worker 进程]                                  [EngineCore / Scheduler]              [Metrics Output]
     │                                                   │                                 │
     │ post_forward()                                    │                                 │
     │   └─ get_finished()                               │                                 │
     │        └─ record_transfer()                       │                                 │
     │             (收集 op_size, op_time, transfer_type) │                                 │
     │                                                   │                                 │
     │ get_kv_connector_stats()                          │                                 │
     │   └─ OffloadingConnectorStats ───────────────────→│ update_from_output()            │
     │                                                   │   └─ aggregate()                │
     │                                                   │   └─ make_stats()               │
     │                                                   │       └─ SchedulerStats         │
     │                                                   │           └─ kv_connector_stats │
     │                                                   │              ↓                  │
     │                                                   │    EngineCoreOutputs ──────────→│ StatLogger
     │                                                   │                                 │ ├─ LoggingStatLogger (stdout)
     │                                                   │                                 │ └─ PrometheusStatLogger (/metrics)

关键实现层级

层级 核心类 职责
数据容器 OffloadingConnectorStats 在 Worker 端暂存原始传输数据({类型: [MetricsList]})。
日志输出 LoggingStatLogger + KVConnectorLogging 周期性聚合数据并打印到标准输出。
指标暴露 PrometheusStatLogger + OffloadPromMetrics 将统计数据更新到 prometheus_client 提供的 /metrics 端点。

PrometheusStatLogger

本质就是解析内容,然后调用 prometheus_client SDK,这个 SDK 会自动提供 /metrics 端点(通过 make_asgi_app() 挂载到 Starlette 应用)。

2. Current Statistics Metrics

OffloadingConnectorStats

最终会生成以下 4 个核心指标:

  1. GPU_to_CPU_total_bytes: 累计卸载字节数。
  2. GPU_to_CPU_total_time: 累计卸载耗时。
  3. CPU_to_GPU_total_bytes: 累计加载字节数。
  4. CPU_to_GPU_total_time: 累计加载耗时。

内部数据结构:

@dataclass
class OffloadingOperationMetrics:
    op_size: int      # 传输的字节数
    op_time: float    # 传输耗时(秒)

class OffloadingConnectorStats:
    data: dict[str, list[OffloadingOperationMetrics]]
    # 示例: { "GPU_to_CPU": [Metrics(op_size=1024, op_time=0.5)], ... }

局限性: 缺乏 Offloading 特有的调度状态指标(如 Cache 使用率、Store 跳过数等)。

3. Significance of RFC #44008

RFC #44008 (Offloading Metrics Redesign) 旨在解决现有指标系统”硬编码且难以扩展”的问题。

3.1 核心痛点

  1. 可扩展性差:当前逻辑是写死在 Connector 里的,新增 Manager 层指标(如 stores_skipped)需要修改多处代码。
  2. 缺乏调度视角:目前只能看到”搬运了多少数据”,看不到”CPU 缓存用了多少”或”有多少请求被阻塞等待”。

3.2 改进方案

提出 Metadata-driven 的通用指标设计:

3.3 后续指标扩展

通过 RFC 的实施,未来将增加关键的可观测性指标:

3.4 相关 PR

PR 状态 内容
#35669 Open, Changes Requested 实现 OffloadingManager.get_stats() + manager stats 聚合
#43877 Open 修复 scheduler 层 stats 收集时序(先 update 再提取)+ worker/scheduler 聚合
#44008 Open (RFC) 设计文档,定义 metadata-driven 架构