[Docs] restore Phase 2 metric command guide

This commit is contained in:
Zhiyi Hong 2026-07-31 14:22:35 +08:00
parent 72bae06576
commit a583c337ba
2 changed files with 215 additions and 10 deletions

View File

@ -1,5 +1,9 @@
# sskj — 多平台大模型推理性能基准测试项目 # sskj — 多平台大模型推理性能基准测试项目
> **更新2026-07-31 14:15:00 CST**
>
> 恢复并完善 Phase 2 档案中的采集命令与指标解释。第 5 节现按实际实现记录时间 Marker、`nvidia-smi`、DCGM Field 10011005/1009/1010、`mpstat``pidstat``perf``numastat``sar``ethtool``mlx5_0/mlx5_3` HCA Counter并逐项说明字段含义、分析方法及对应原始/汇总文件。同步记录首轮线程级 1 秒 `pidstat` 日志过重,后续应改为进程级 5 秒采样。
>
> **更新2026-07-31 13:59:12 CST** > **更新2026-07-31 13:59:12 CST**
> >
> 补充 Phase 2 双节点执行边界:正式实验前仅需在 Worker `174.1.51.7` 启动并验证 `nvidia-dcgm` Host Engine完整 `run_hardware_contention_attribution.sh all` 入口仍然只在 Head `174.1.51.5` 执行,由其通过 SSH 管理 Worker 服务与采集器。文档明确列出两台节点分别需要运行的命令,避免在 Worker 重复启动整套实验。 > 补充 Phase 2 双节点执行边界:正式实验前仅需在 Worker `174.1.51.7` 启动并验证 `nvidia-dcgm` Host Engine完整 `run_hardware_contention_attribution.sh all` 入口仍然只在 Head `174.1.51.5` 执行,由其通过 SSH 管理 Worker 服务与采集器。文档明确列出两台节点分别需要运行的命令,避免在 Worker 重复启动整套实验。

View File

@ -135,7 +135,7 @@
<div class="meta"> <div class="meta">
<span>节点174.1.51.5 + 174.1.51.7</span> <span>节点174.1.51.5 + 174.1.51.7</span>
<span>拓扑SGLang TP16 / EP2</span> <span>拓扑SGLang TP16 / EP2</span>
<span>更新2026-07-31 13:59:12 CST</span> <span>更新2026-07-31 14:15:00 CST</span>
</div> </div>
</div> </div>
</header> </header>
@ -273,16 +273,217 @@ tmux attach -t dsv4pro-phase2</code></pre>
</p> </p>
<h2>5. 采集指标</h2> <h2>5. 采集指标</h2>
<p>
本节记录正式实现使用的命令,而不是建议性伪代码。命令由
<code>run_hardware_contention_attribution.sh</code> 在 Head 和 Worker 同时启动;
每条展开后的命令会另外保存在
<code>results/&lt;RUN_ID&gt;/head|worker/collector_commands/</code>
</p>
<table> <table>
<thead> <thead>
<tr><th>层级</th><th>连续采样</th><th>静态或前后快照</th><th>局限</th></tr> <tr><th>层级</th><th>连续采样</th><th>静态或前后快照</th></tr>
</thead> </thead>
<tbody> <tbody>
<tr><td>GPU</td><td>利用率、Memory Utilization、显存、功耗、SM/Memory Clock、温度、P-state</td><td><code>nvidia-smi topo -m</code>、Compute Process</td><td><code>nvidia-smi</code> 的 Memory Utilization 不是实际 HBM GB/s</td></tr> <tr><td>GPU</td><td>利用率、Memory Utilization、显存、功耗、SM/Memory Clock、温度、P-state</td><td><code>nvidia-smi topo -m</code>、Compute Process</td></tr>
<tr><td>CPU</td><td>每核利用率、上下文切换、服务进程 CPU/内存</td><td>NUMA 拓扑、容器 PID 与 CPU Affinity</td><td>需要时间戳与 GPU Chunk 日志对齐</td></tr> <tr><td>CPU</td><td>每核利用率、上下文切换、服务进程 CPU/内存</td><td>NUMA 拓扑、容器 PID 与 CPU Affinity</td></tr>
<tr><td>Network</td><td><code>eth0/eth3</code> RX/TX</td><td><code>ethtool -S</code> 错误计数前后差</td><td>普通 netdev 统计不一定覆盖所有 RDMA 细节</td></tr> <tr><td>Network</td><td><code>eth0/eth3</code> RX/TX</td><td><code>ethtool -S</code> 错误计数前后差</td></tr>
<tr><td>RDMA</td><td><code>mlx5_0/mlx5_3</code> port_xmit/recv_data 差分</td><td>Port State、GID 与错误计数</td><td>计数单位需要按设备定义换算</td></tr> <tr><td>RDMA</td><td><code>mlx5_0/mlx5_3</code> port_xmit/recv_data 差分</td><td>Port State、GID 与错误计数</td></tr>
<tr><td>DCGM</td><td>若可用则记录 SM Active、DRAM Active、Tensor Active、PCIe</td><td>工具版本与可用 Field</td><td>不可用时明确记录,不能用粗粒度指标冒充</td></tr> <tr><td>DCGM</td><td>SM Active、DRAM Active、Tensor Active、PCIe</td><td>工具版本与可用 Field</td></tr>
</tbody>
</table>
<h3>5.1 时间对齐与 Case Marker</h3>
<pre><code class="language-bash"># 每条 GPU/RDMA 样本写入相同格式的宿主机墙钟时间
date +%s%N
# 实验前检查两节点秒级时钟差
date +%s
# Case 开始、结束和服务状态由 Python 写入 markers.csv
python3 hardware_contention_attribution.py marker \
--path markers.csv \
--node head \
--event case_start \
--case-id long_prefill_latency_128k_c1</code></pre>
<table>
<thead><tr><th>数据</th><th>含义</th><th>为什么需要</th></tr></thead>
<tbody>
<tr><td><code>wall_time_ns</code></td><td>Unix Epoch 纳秒时间</td><td>把 GPU、CPU、RDMA 与 Benchmark 放到同一时间轴</td></tr>
<tr><td><code>case_start/case_end</code></td><td>一个 Case 的编排边界</td><td>从整段连续采样中切出对应负载</td></tr>
<tr><td><code>CLOCK_SKEW_TOLERANCE_S=2</code></td><td>两节点允许的最大秒级时钟差</td><td>避免 Head/Worker 的同一时刻被错位比较</td></tr>
</tbody>
</table>
<p>
首轮实现的 Case 边界包含 Benchmark 客户端启动、数据生成、Warm-up、正式测量和退出
因此它适合判断硬件方向,但不是纯主测量窗口。后续实现需要围绕
<code>Starting main benchmark run</code> 增加更精确的起止 Marker。
</p>
<h3>5.2 GPU 基础状态:<code>nvidia-smi</code></h3>
<pre><code class="language-bash">nvidia-smi \
--query-gpu=index,timestamp,utilization.gpu,utilization.memory,\
memory.used,memory.total,power.draw,temperature.gpu,\
clocks.sm,clocks.mem,pstate \
--format=csv,noheader,nounits</code></pre>
<p>脚本每秒运行一次,并在每行前加入 <code>wall_time_ns</code> 和节点角色。</p>
<table>
<thead><tr><th>字段</th><th>代表什么</th></tr></thead>
<tbody>
<tr><td><code>utilization.gpu</code></td><td>采样周期内至少有一个 Kernel 在执行的时间比例</td></tr>
<tr><td><code>utilization.memory</code></td><td>采样周期内显存控制器处于忙碌状态的时间比例</td></tr>
<tr><td><code>memory.used/total</code></td><td>当前总显存分配量与设备显存容量</td></tr>
<tr><td><code>power.draw</code></td><td>GPU 当前功耗,用于比较不同负载的能耗状态</td></tr>
<tr><td><code>clocks.sm/clocks.mem</code></td><td>SM 与显存当前工作频率</td></tr>
<tr><td><code>pstate</code></td><td>GPU 性能状态P0 通常是最高性能态</td></tr>
</tbody>
</table>
<p>
原始输出为 <code>head|worker/gpu_samples.csv</code>
<code>gpu_summary.csv</code> 汇总整段运行,
<code>case_gpu_summary.csv</code> 按节点、Case 和 GPU 汇总平均值与峰值。
</p>
<h3>5.3 GPU Profiling CounterDCGM</h3>
<pre><code class="language-bash">DCGM_FIELD_IDS=1001,1002,1003,1004,1005,1009,1010
dcgmi dmon \
-e 1001,1002,1003,1004,1005,1009,1010 \
-d 1000</code></pre>
<table>
<thead><tr><th>Field ID</th><th>Field Tag</th><th>含义</th></tr></thead>
<tbody>
<tr><td>1001</td><td><code>gr_engine_active</code></td><td>Graphics/Compute Engine 活跃比例,接近整体 GPU 执行忙碌度</td></tr>
<tr><td>1002</td><td><code>sm_active</code></td><td>SM 至少有一个 Warp 活跃的比例</td></tr>
<tr><td>1003</td><td><code>sm_occupancy</code></td><td>活跃 Warp 相对硬件可容纳 Warp 的比例</td></tr>
<tr><td>1004</td><td><code>tensor_active</code></td><td>Tensor Core 指令活跃比例</td></tr>
<tr><td>1005</td><td><code>dram_active</code></td><td>设备显存接口活跃比例,用于判断 HBM 压力</td></tr>
<tr><td>1009</td><td><code>pcie_tx_bytes</code></td><td>GPU 经 PCIe 发出的字节速率</td></tr>
<tr><td>1010</td><td><code>pcie_rx_bytes</code></td><td>GPU 经 PCIe 接收的字节速率</td></tr>
</tbody>
</table>
<p>
<code>sm_active</code> 高而 <code>sm_occupancy</code> 低,表示 SM 经常有工作,
但同时驻留的 Warp 不多;后续通过 Kernel Timeline 区分小 Kernel、
寄存器/共享内存约束和同步。DCGM 依赖宿主
<code>nvidia-dcgm</code> Host Engine首轮 Worker 未启动该服务,所以只有
Head 的 <code>dcgm_dmon.log</code> 有效。
</p>
<h3>5.4 CPU、进程与 Kernel Launch 侧证据</h3>
<pre><code class="language-bash"># 全部逻辑 CPU每秒输出一次
mpstat -P ALL 1
# 找到容器内进程对应的宿主 PID
docker top &lt;container&gt; -eo pid,ppid,psr,pcpu,pmem,stat,comm,args
# 首轮实际命令CPU、I/O、缺页、上下文切换并展开线程
pidstat -durwt -p "&lt;comma-separated-host-pids&gt;" 1
# 每秒输出一次硬件/软件计数器增量
perf stat -p "&lt;comma-separated-host-pids&gt;" -I 1000 \
-e cycles,instructions,cache-misses,context-switches,\
cpu-migrations,page-faults</code></pre>
<table>
<thead><tr><th>命令/字段</th><th>回答的问题</th></tr></thead>
<tbody>
<tr><td><code>mpstat -P ALL</code></td><td>整机是否 CPU 饱和,是否只有少量核心接近 100%,是否存在 I/O Wait</td></tr>
<tr><td><code>docker top</code></td><td>把容器进程映射为宿主 PID、CPU 核 <code>PSR</code> 和进程状态</td></tr>
<tr><td><code>pidstat -u</code></td><td>服务进程和线程的用户态、内核态 CPU 时间</td></tr>
<tr><td><code>pidstat -d</code></td><td>进程块设备 I/O</td></tr>
<tr><td><code>pidstat -r</code></td><td>内存和 Page Fault 行为</td></tr>
<tr><td><code>pidstat -w</code></td><td>主动/被动上下文切换,辅助发现线程阻塞或调度抖动</td></tr>
<tr><td><code>perf cycles/instructions</code></td><td>CPU 周期与指令执行量,可计算近似 IPC</td></tr>
<tr><td><code>cache-misses/migrations</code></td><td>CPU Cache 压力和线程跨核迁移</td></tr>
</tbody>
</table>
<p>
首轮 <code>pidstat -durwt</code> 对所有线程做 1 秒采样,产生约 850 MB/735 MB
的 Head/Worker 日志,信息量和扰动都过大。后续不照搬:默认改为进程级 5 秒采样;
只有确认某个进程异常后,才在短窗口内开启线程级采样。
</p>
<h3>5.5 NUMA 与 CPU/内存亲和</h3>
<pre><code class="language-bash"># 静态 NUMA 节点、CPU 和内存布局
numactl --hardware
numastat -m
# 每 5 秒按容器宿主 PID 查看本地/远端 NUMA 内存
numastat -p &lt;host-pid&gt;
# 同时保存 GPU、CPU、NIC 的拓扑关系
nvidia-smi topo -m</code></pre>
<p>
NUMA 是多路 CPU 机器的“本地内存”结构。进程长期从远端 NUMA Node 取内存,
或 GPU/NIC 对应的 CPU 线程被调度到另一侧,可能增加 Host 侧延迟。
<code>numastat -p</code> 的内存分布与 CPU 核、GPU 活跃区间和 Timeline 对齐,
用于定位跨 NUMA 访问。
</p>
<h3>5.6 普通网卡统计与 RDMA 数据面</h3>
<pre><code class="language-bash"># Linux netdev 层,每秒采样吞吐与错误
sar -n DEV,EDEV 1
# Case 前后保存物理端口状态和驱动计数器
ethtool eth0
ethtool eth3
ethtool -S eth0
ethtool -S eth3
# RDMA 设备与端口状态
ibdev2netdev
ibstat
rdma link show</code></pre>
<p>
<code>sar</code> 记录 Linux 普通网络栈中的 <code>eth0/eth3</code> 流量;
GDRDMA 数据量由 <code>mlx5_0/mlx5_3</code> HCA 的 sysfs Counter 记录:
</p>
<pre><code class="language-bash">for hca in mlx5_0 mlx5_3; do
base="/sys/class/infiniband/${hca}/ports/1"
cat "${base}/counters/port_xmit_data"
cat "${base}/counters/port_rcv_data"
cat "${base}/counters/port_xmit_wait"
cat "${base}/counters/port_xmit_discards"
cat "${base}/counters/port_rcv_errors"
cat "${base}/hw_counters/req_transport_retries_exceeded"
cat "${base}/hw_counters/req_rnr_retries_exceeded"
done</code></pre>
<table>
<thead><tr><th>Counter</th><th>含义</th></tr></thead>
<tbody>
<tr><td><code>port_xmit_data/port_rcv_data</code></td><td>HCA 发送/接收数据累计量IB Counter 单位是 4 Octets脚本用 <code>delta × 4 × 8 / seconds</code> 换算 Gbit/s</td></tr>
<tr><td><code>port_xmit_wait</code></td><td>端口因缺少发送 Credit 等原因等待的时间,持续增长可能指向拥塞</td></tr>
<tr><td><code>port_xmit_discards/port_rcv_errors</code></td><td>发送丢弃和接收错误增量</td></tr>
<tr><td><code>req_transport_retries_exceeded</code></td><td>RDMA Transport 重试耗尽</td></tr>
<tr><td><code>req_rnr_retries_exceeded</code></td><td>Receiver Not Ready 重试耗尽</td></tr>
<tr><td><code>roce_adp_retrans*</code></td><td>RoCE 自适应重传及超时相关计数</td></tr>
<tr><td><code>np_ecn_marked* / *cnp*</code></td><td>ECN 标记和拥塞通知包,用于辅助判断 RoCE 拥塞</td></tr>
</tbody>
</table>
<p>
原始数据为 <code>head|worker/rdma.csv</code>
<code>case_rdma_summary.csv</code> 按 Case、节点和 HCA 计算吞吐及错误增量。
它说明双 Rail 的实际流量、均衡性和错误增量Phase 3 再把 NCCL Collective
放到请求 Timeline 中分析持续时间和计算重叠。
</p>
<h3>5.7 静态快照与结果关系</h3>
<pre><code class="language-bash">nvidia-smi
nvidia-smi topo -m
lscpu
numactl --hardware
ip -details link show eth0
ip -details link show eth3
docker inspect &lt;container&gt;
docker top &lt;container&gt; -eo pid,ppid,psr,pcpu,pmem,stat,comm,args</code></pre>
<table>
<thead><tr><th>结果文件</th><th>内容</th><th>主要用途</th></tr></thead>
<tbody>
<tr><td><code>static_before.log / static_after.log</code></td><td>GPU、CPU、NUMA、NIC、RDMA、容器前后快照</td><td>证明运行环境,并比较错误计数和清理状态</td></tr>
<tr><td><code>collector_status.csv</code></td><td>每个采集器的启动、停止或提前退出状态</td><td>防止把缺失采集器当作 0 值</td></tr>
<tr><td><code>case_windows.csv</code></td><td>每个 Benchmark Case 的起止时间</td><td>从连续硬件日志中切片</td></tr>
<tr><td><code>bench_summary.csv</code></td><td>TPS、TTFT、TPOT、ITL、E2E</td><td>把硬件现象与用户侧性能对应</td></tr>
<tr><td><code>case_gpu_summary.csv</code></td><td>每 Case、节点、GPU 的利用率、显存、功耗、频率</td><td>比较负载与节点/GPU 不均衡</td></tr>
<tr><td><code>case_rdma_summary.csv</code></td><td>每 Case、节点、Rail 的吞吐和错误增量</td><td>判断双 Rail 使用、均衡和数据面错误</td></tr>
</tbody> </tbody>
</table> </table>
@ -353,8 +554,8 @@ dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution/</code></pre>
<li class="pass">Head/Worker GPU、CPU、NUMA、RDMA 采集完成Case 时间窗和结构化摘要已生成。</li> <li class="pass">Head/Worker GPU、CPU、NUMA、RDMA 采集完成Case 时间窗和结构化摘要已生成。</li>
<li class="pass">两端 NCCL 日志确认 <code>mlx5_0/mlx5_3</code> 双 Rail <code>NET/IB + GDRDMA</code></li> <li class="pass">两端 NCCL 日志确认 <code>mlx5_0/mlx5_3</code> 双 Rail <code>NET/IB + GDRDMA</code></li>
<li class="pass">服务和采集器完成清理,两节点 16 张 GPU 均已释放。</li> <li class="pass">服务和采集器完成清理,两节点 16 张 GPU 均已释放。</li>
<li>Worker DCGM 因宿主 <code>nvidia-dcgm</code> 未启动而提前退出;Head DCGM 有效,但本 Run 不能做双节点 DCGM 对称比较</li> <li>Worker DCGM 因宿主 <code>nvidia-dcgm</code> 未启动而提前退出;本 Run 的 DCGM 分析只使用 Head 数据</li>
<li>当前 Case 时间窗包含客户端准备和 Warm-up,硬件均值可用于方向判断,但不能替代精确的主测量窗口或 Phase 3 Timeline</li> <li>当前 Case 时间窗包含客户端准备和 Warm-up;后续使用正式主测量起止 Marker 获得精确硬件窗口</li>
</ul> </ul>
<h2>9. 实施记录</h2> <h2>9. 实施记录</h2>
@ -448,7 +649,7 @@ tmux new-session -d -s dsv4pro-phase2 \
当前证据支持把下一步缩到 TP16 的 Kernel、Scheduler、PCIe/RDMA Collective 当前证据支持把下一步缩到 TP16 的 Kernel、Scheduler、PCIe/RDMA Collective
和 Rank 同步时间线。Phase 3 只分析真实请求中通信出现的位置、耗时和与计算的 和 Rank 同步时间线。Phase 3 只分析真实请求中通信出现的位置、耗时和与计算的
重叠关系,不重复 Phase 2 的平均 GPU/CPU/RDMA 采集。原始双 Rail 带宽、整机 重叠关系,不重复 Phase 2 的平均 GPU/CPU/RDMA 采集。原始双 Rail 带宽、整机
CPU 容量和降频都不像首要瓶颈;但 Phase 2 粗粒度指标还不能给出具体 Kernel 根因。 CPU 容量和降频都不像首要瓶颈;Phase 3 将继续定位具体 Kernel 和同步根因。
</p> </p>
<ul> <ul>
<li>Worker 的 <code>nvidia-dcgm</code> Host Engine 未启动,导致 Worker DCGM 提前退出。重跑前只需在 <code>.7</code> 启动 DCGM整套 Phase 2 仍只在 <code>.5</code> 执行。</li> <li>Worker 的 <code>nvidia-dcgm</code> Host Engine 未启动,导致 Worker DCGM 提前退出。重跑前只需在 <code>.7</code> 启动 DCGM整套 Phase 2 仍只在 <code>.5</code> 执行。</li>