0. 为什么 P900 + HiCache 必须看 NUMA / PCIe / NIC
HiCache 把 KV Cache 放到 Host DRAM 上,当成一张「主机侧大 KV 池」。当某次请求命中 Host KV 时,它并不是直接就在 P900 上被用掉——通常还要走一层:
Host KV (Host DRAM)
│
│ H2D (Host → Device)
↓
PCIe
│
↓
P900
│
↓
HBM (Device Memory)
也就是说,Host KV 命中率高,不代表性能一定高。因为命中之后还有 PCIe 搬运成本。如果 PCIe 带宽不够 / 延迟高 / 或者 KV 跨 NUMA 节点访问,就可能出现:
Host KV Hit ↑
↓
PCIe 搬运
↓
TTFT ↑ / TPS ↓
所以在这个场景里,PCIe、NUMA、NIC 必须放到同一条链路里一起看。下面先用一张拓扑图把硬件关系画清楚,再用一张五层优化图把「怎么调」落到操作上。
1. 拓扑图:一台服务器里到底发生了什么
图 1:P900 + HiCache 的服务器拓扑。绿色 = P900 访问本 NUMA 节点的 Host KV(理想路径);红色虚线 = P900 跨 NUMA interconnect 去访问另一个节点的 Host KV(多一跳,延迟↑有效带宽↓)。
三者的分工一句话记:
- PCIe:P900 ↔ Host / CPU 之间的数据通道(负责 DMA、带宽、延迟,以及 device discovery / MMIO / BAR / P2P 等控制面)。
- NUMA:Host KV 放在哪个 CPU 内存节点、以及 P900 访问它够不够近。
- NIC:做 PD 分离 / Mooncake / RDMA / KV Transfer 时,NIC 也要和 P900、Host KV 待在同一个 NUMA。
核心数据链路(一句话版):
P900 HBM → PCIe → PCIe Root → NUMA Node → Host DRAM → Host KV
2. 五层优化图:从拓扑到绑定怎么落地
图 2:NUMA 优化五层。从「看清拓扑」到「绑 CPU、绑 KV、绑 NIC」,最后一步是别绑死——locality 和负载均衡之间找平衡。
3. 你现在最该测的不是「NUMA 开 / 关」
真正有价值的实验是对比不同 locality 配置,而不是简单的开/关:
| 配置 | 目的 |
|---|---|
| 正确 topology binding | 看 locality 优化的收益上限 |
| 自动 NUMA(系统分配) | baseline 对照 |
| 错误 / remote binding | 验证 NUMA 惩罚有多大 |
| Shared KV + NUMA ON | Shared KV 的最佳 locality |
| Shared KV + NUMA OFF | Shared KV 对 NUMA 的敏感性 |
如果结果呈现:
正确 NUMA > 自动 NUMA > Remote NUMA
基本就能证明:HiCache 的性能明显受 NUMA locality 影响——而这正是 --numa-node 0 0 2 2 这类参数存在的意义。
4. 一句话总结
PCIe 解决「P900 怎么和 Host / CPU 传数据」,NUMA 解决「这些 Host 数据放在哪个 CPU 内存节点、离 P900 够不够近」,NIC 在 PD / Mooncake 时也要就近。
所以你最终优化的是一整条链路:
P900 ↔ PCIe Root Complex ↔ NUMA Node ↔ Host DRAM ↔ Host KV
而不是单独一个 --numa-node 参数。
💬 留言
NaphJohn/LLM-blog尚未启用 Discussions:请在 GitHub 仓库 Settings → General → Features 勾选 Discussions 后刷新本页,评论区即自动显示。