diff --git a/README.md b/README.md index 24be854..5ea5192 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # sskj — 多平台大模型推理性能基准测试项目 +> **更新(2026-07-31 14:15:00 CST)** +> +> 恢复并完善 Phase 2 档案中的采集命令与指标解释。第 5 节现按实际实现记录时间 Marker、`nvidia-smi`、DCGM Field 1001–1005/1009/1010、`mpstat`、`pidstat`、`perf`、`numastat`、`sar`、`ethtool` 和 `mlx5_0/mlx5_3` HCA Counter,并逐项说明字段含义、分析方法及对应原始/汇总文件。同步记录首轮线程级 1 秒 `pidstat` 日志过重,后续应改为进程级 5 秒采样。 +> > **更新(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 重复启动整套实验。 diff --git a/docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html b/docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html index 2ac076f..ac582ae 100644 --- a/docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html +++ b/docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html @@ -135,7 +135,7 @@
节点:174.1.51.5 + 174.1.51.7 拓扑:SGLang TP16 / EP2 - 更新:2026-07-31 13:59:12 CST + 更新:2026-07-31 14:15:00 CST
@@ -273,16 +273,217 @@ tmux attach -t dsv4pro-phase2

5. 采集指标

+

+ 本节记录正式实现使用的命令,而不是建议性伪代码。命令由 + run_hardware_contention_attribution.sh 在 Head 和 Worker 同时启动; + 每条展开后的命令会另外保存在 + results/<RUN_ID>/head|worker/collector_commands/。 +

- + - - - - - + + + + + + +
层级连续采样静态或前后快照局限
层级连续采样静态或前后快照
GPU利用率、Memory Utilization、显存、功耗、SM/Memory Clock、温度、P-statenvidia-smi topo -m、Compute Processnvidia-smi 的 Memory Utilization 不是实际 HBM GB/s
CPU每核利用率、上下文切换、服务进程 CPU/内存NUMA 拓扑、容器 PID 与 CPU Affinity需要时间戳与 GPU Chunk 日志对齐
Networketh0/eth3 RX/TXethtool -S 错误计数前后差普通 netdev 统计不一定覆盖所有 RDMA 细节
RDMAmlx5_0/mlx5_3 port_xmit/recv_data 差分Port State、GID 与错误计数计数单位需要按设备定义换算
DCGM若可用则记录 SM Active、DRAM Active、Tensor Active、PCIe工具版本与可用 Field不可用时明确记录,不能用粗粒度指标冒充
GPU利用率、Memory Utilization、显存、功耗、SM/Memory Clock、温度、P-statenvidia-smi topo -m、Compute Process
CPU每核利用率、上下文切换、服务进程 CPU/内存NUMA 拓扑、容器 PID 与 CPU Affinity
Networketh0/eth3 RX/TXethtool -S 错误计数前后差
RDMAmlx5_0/mlx5_3 port_xmit/recv_data 差分Port State、GID 与错误计数
DCGMSM Active、DRAM Active、Tensor Active、PCIe工具版本与可用 Field
+ +

5.1 时间对齐与 Case Marker

+
# 每条 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
+ + + + + + + +
数据含义为什么需要
wall_time_nsUnix Epoch 纳秒时间把 GPU、CPU、RDMA 与 Benchmark 放到同一时间轴
case_start/case_end一个 Case 的编排边界从整段连续采样中切出对应负载
CLOCK_SKEW_TOLERANCE_S=2两节点允许的最大秒级时钟差避免 Head/Worker 的同一时刻被错位比较
+

+ 首轮实现的 Case 边界包含 Benchmark 客户端启动、数据生成、Warm-up、正式测量和退出; + 因此它适合判断硬件方向,但不是纯主测量窗口。后续实现需要围绕 + Starting main benchmark run 增加更精确的起止 Marker。 +

+ +

5.2 GPU 基础状态:nvidia-smi

+
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
+

脚本每秒运行一次,并在每行前加入 wall_time_ns 和节点角色。

+ + + + + + + + + + +
字段代表什么
utilization.gpu采样周期内至少有一个 Kernel 在执行的时间比例
utilization.memory采样周期内显存控制器处于忙碌状态的时间比例
memory.used/total当前总显存分配量与设备显存容量
power.drawGPU 当前功耗,用于比较不同负载的能耗状态
clocks.sm/clocks.memSM 与显存当前工作频率
pstateGPU 性能状态,P0 通常是最高性能态
+

+ 原始输出为 head|worker/gpu_samples.csv; + gpu_summary.csv 汇总整段运行, + case_gpu_summary.csv 按节点、Case 和 GPU 汇总平均值与峰值。 +

+ +

5.3 GPU Profiling Counter:DCGM

+
DCGM_FIELD_IDS=1001,1002,1003,1004,1005,1009,1010
+
+dcgmi dmon \
+  -e 1001,1002,1003,1004,1005,1009,1010 \
+  -d 1000
+ + + + + + + + + + + +
Field IDField Tag含义
1001gr_engine_activeGraphics/Compute Engine 活跃比例,接近整体 GPU 执行忙碌度
1002sm_activeSM 至少有一个 Warp 活跃的比例
1003sm_occupancy活跃 Warp 相对硬件可容纳 Warp 的比例
1004tensor_activeTensor Core 指令活跃比例
1005dram_active设备显存接口活跃比例,用于判断 HBM 压力
1009pcie_tx_bytesGPU 经 PCIe 发出的字节速率
1010pcie_rx_bytesGPU 经 PCIe 接收的字节速率
+

+ sm_active 高而 sm_occupancy 低,表示 SM 经常有工作, + 但同时驻留的 Warp 不多;后续通过 Kernel Timeline 区分小 Kernel、 + 寄存器/共享内存约束和同步。DCGM 依赖宿主 + nvidia-dcgm Host Engine;首轮 Worker 未启动该服务,所以只有 + Head 的 dcgm_dmon.log 有效。 +

+ +

5.4 CPU、进程与 Kernel Launch 侧证据

+
# 全部逻辑 CPU,每秒输出一次
+mpstat -P ALL 1
+
+# 找到容器内进程对应的宿主 PID
+docker top <container> -eo pid,ppid,psr,pcpu,pmem,stat,comm,args
+
+# 首轮实际命令:CPU、I/O、缺页、上下文切换,并展开线程
+pidstat -durwt -p "<comma-separated-host-pids>" 1
+
+# 每秒输出一次硬件/软件计数器增量
+perf stat -p "<comma-separated-host-pids>" -I 1000 \
+  -e cycles,instructions,cache-misses,context-switches,\
+cpu-migrations,page-faults
+ + + + + + + + + + + + +
命令/字段回答的问题
mpstat -P ALL整机是否 CPU 饱和,是否只有少量核心接近 100%,是否存在 I/O Wait
docker top把容器进程映射为宿主 PID、CPU 核 PSR 和进程状态
pidstat -u服务进程和线程的用户态、内核态 CPU 时间
pidstat -d进程块设备 I/O
pidstat -r内存和 Page Fault 行为
pidstat -w主动/被动上下文切换,辅助发现线程阻塞或调度抖动
perf cycles/instructionsCPU 周期与指令执行量,可计算近似 IPC
cache-misses/migrationsCPU Cache 压力和线程跨核迁移
+

+ 首轮 pidstat -durwt 对所有线程做 1 秒采样,产生约 850 MB/735 MB + 的 Head/Worker 日志,信息量和扰动都过大。后续不照搬:默认改为进程级 5 秒采样; + 只有确认某个进程异常后,才在短窗口内开启线程级采样。 +

+ +

5.5 NUMA 与 CPU/内存亲和

+
# 静态 NUMA 节点、CPU 和内存布局
+numactl --hardware
+numastat -m
+
+# 每 5 秒按容器宿主 PID 查看本地/远端 NUMA 内存
+numastat -p <host-pid>
+
+# 同时保存 GPU、CPU、NIC 的拓扑关系
+nvidia-smi topo -m
+

+ NUMA 是多路 CPU 机器的“本地内存”结构。进程长期从远端 NUMA Node 取内存, + 或 GPU/NIC 对应的 CPU 线程被调度到另一侧,可能增加 Host 侧延迟。 + 将 numastat -p 的内存分布与 CPU 核、GPU 活跃区间和 Timeline 对齐, + 用于定位跨 NUMA 访问。 +

+ +

5.6 普通网卡统计与 RDMA 数据面

+
# Linux netdev 层,每秒采样吞吐与错误
+sar -n DEV,EDEV 1
+
+# Case 前后保存物理端口状态和驱动计数器
+ethtool eth0
+ethtool eth3
+ethtool -S eth0
+ethtool -S eth3
+
+# RDMA 设备与端口状态
+ibdev2netdev
+ibstat
+rdma link show
+

+ sar 记录 Linux 普通网络栈中的 eth0/eth3 流量; + GDRDMA 数据量由 mlx5_0/mlx5_3 HCA 的 sysfs Counter 记录: +

+
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
+ + + + + + + + + + + +
Counter含义
port_xmit_data/port_rcv_dataHCA 发送/接收数据累计量;IB Counter 单位是 4 Octets,脚本用 delta × 4 × 8 / seconds 换算 Gbit/s
port_xmit_wait端口因缺少发送 Credit 等原因等待的时间,持续增长可能指向拥塞
port_xmit_discards/port_rcv_errors发送丢弃和接收错误增量
req_transport_retries_exceededRDMA Transport 重试耗尽
req_rnr_retries_exceededReceiver Not Ready 重试耗尽
roce_adp_retrans*RoCE 自适应重传及超时相关计数
np_ecn_marked* / *cnp*ECN 标记和拥塞通知包,用于辅助判断 RoCE 拥塞
+

+ 原始数据为 head|worker/rdma.csv; + case_rdma_summary.csv 按 Case、节点和 HCA 计算吞吐及错误增量。 + 它说明双 Rail 的实际流量、均衡性和错误增量;Phase 3 再把 NCCL Collective + 放到请求 Timeline 中分析持续时间和计算重叠。 +

+ +

5.7 静态快照与结果关系

+
nvidia-smi
+nvidia-smi topo -m
+lscpu
+numactl --hardware
+ip -details link show eth0
+ip -details link show eth3
+docker inspect <container>
+docker top <container> -eo pid,ppid,psr,pcpu,pmem,stat,comm,args
+ + + + + + + + +
结果文件内容主要用途
static_before.log / static_after.logGPU、CPU、NUMA、NIC、RDMA、容器前后快照证明运行环境,并比较错误计数和清理状态
collector_status.csv每个采集器的启动、停止或提前退出状态防止把缺失采集器当作 0 值
case_windows.csv每个 Benchmark Case 的起止时间从连续硬件日志中切片
bench_summary.csvTPS、TTFT、TPOT、ITL、E2E把硬件现象与用户侧性能对应
case_gpu_summary.csv每 Case、节点、GPU 的利用率、显存、功耗、频率比较负载与节点/GPU 不均衡
case_rdma_summary.csv每 Case、节点、Rail 的吞吐和错误增量判断双 Rail 使用、均衡和数据面错误
@@ -353,8 +554,8 @@ dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution/
  • Head/Worker GPU、CPU、NUMA、RDMA 采集完成,Case 时间窗和结构化摘要已生成。
  • 两端 NCCL 日志确认 mlx5_0/mlx5_3 双 Rail NET/IB + GDRDMA
  • 服务和采集器完成清理,两节点 16 张 GPU 均已释放。
  • -
  • Worker DCGM 因宿主 nvidia-dcgm 未启动而提前退出;Head DCGM 有效,但本 Run 不能做双节点 DCGM 对称比较。
  • -
  • 当前 Case 时间窗包含客户端准备和 Warm-up,硬件均值可用于方向判断,但不能替代精确的主测量窗口或 Phase 3 Timeline。
  • +
  • Worker DCGM 因宿主 nvidia-dcgm 未启动而提前退出;本 Run 的 DCGM 分析只使用 Head 数据。
  • +
  • 当前 Case 时间窗包含客户端准备和 Warm-up;后续使用正式主测量起止 Marker 获得精确硬件窗口。
  • 9. 实施记录

    @@ -448,7 +649,7 @@ tmux new-session -d -s dsv4pro-phase2 \ 当前证据支持把下一步缩到 TP16 的 Kernel、Scheduler、PCIe/RDMA Collective 和 Rank 同步时间线。Phase 3 只分析真实请求中通信出现的位置、耗时和与计算的 重叠关系,不重复 Phase 2 的平均 GPU/CPU/RDMA 采集。原始双 Rail 带宽、整机 - CPU 容量和降频都不像首要瓶颈;但 Phase 2 粗粒度指标还不能给出具体 Kernel 根因。 + CPU 容量和降频都不像首要瓶颈;Phase 3 将继续定位具体 Kernel 和同步根因。