资讯动态

冷知识:RTX 4090 PCIe 动态升降速实测

发布时间:2026/10/17 10:31:12 来源:尧图企业网站定制
一台 8×RTX 4090 GPU 服务器上nvidia-smi检查发现 8 张显卡的 PCIe 当前速率全部是Gen1而最大速率是Gen4。第一眼看上去很像 PCIe 链路出现了故障或降级。但启动真实 CUDA 负载之后8 张卡的 PCIe 全部恢复到Gen4 x16。那么空闲状态下的 Gen1 到底是不是故障本文直接通过实际服务器上的测试过程把这个问题验证清楚。1. 问题8 张 RTX 4090 为什么都是 Gen1先看服务器实际配置。项目配置GPURTX 4090 × 8NVIDIA Driver580.173.02Driver CUDA 支持CUDA 13.0CUDA Toolkit11.7系统Linux首先确认 8 张 GPUnvidia-smi -L确认服务器中的 8 张显卡均被 NVIDIA 驱动正常识别。再查看 PCIe 当前状态nvidia-smi --query-gpuindex,name,pci.bus_id,pcie.link.gen.current,pcie.link.gen.max,pcie.link.width.current,pcie.link.width.max,pstate --formatcsv在 GPU 空闲状态下8 张卡的结果一致PCIe Current : Gen1 PCIe Max : Gen4 Width : x16 PState : P8也就是说当前Gen1 x16 最大Gen4 x16如果只看到这里很容易直接认为8 张 RTX 4090 的 PCIe 全部降级到了 Gen1。但这个判断还不完整。因为此时 GPU 基本处于空闲状态真正需要确认的是GPU 真正工作起来以后PCIe 能不能恢复到 Gen4要回答这个问题先从 PCIe 链路本身开始检查。2. 问题分析PCIe 链路基础检查在动态负载测试之前先对整台服务器gpu链路做一次基础体检。本次实际使用了自动链路检测脚本脚本见文章所附带资源/opt/gpu_health_auto.sh这个脚本主要用于检查GPU 数量与型号 PCIe 链路状态 LnkCap / LnkSta GPU 上游 PCIe 拓扑 常见 PCIe / GPU 错误2.1 基础检查结果首先脚本能够识别出GPURTX 4090 × 8说明 8 张 GPU 都能够被系统和 NVIDIA 驱动正常识别。PCIe 状态方面空闲时观察到CurrentGen1 x16 MaxGen4 x16也就是说当前链路运行在 Gen1 x16但设备具备 Gen4 x16 的能力。为了进一步确认 PCIe 拓扑可以执行lspci -D -t查看 GPU 所处的 PCIe 总线层级。再通过 GPU 对应的 BDF 查看 PCIe Endpointlspci -D -vv -s GPU-BDF重点关注LnkCap LnkSta例如LnkCap: Speed 16GT/s, Width x16 LnkSta: Speed 2.5GT/s, Width x16对应为最高能力Gen4 x16 当前状态Gen1 x162.2 基础检查结果分析到这一步可以确认几个事实8 张 RTX 4090 正常识别 设备具备 Gen4 x16 能力 空闲状态当前为 Gen1 x16因此目前发现的是设备支持 Gen4 x16但在当前空闲状态下运行在 Gen1 x16。这个结果本身还不足以直接认定 PCIe 故障。原因很简单当前 GPU 没有产生明显的计算负载。所以还无法区分两种情况情况 A 空闲时动态降速 有负载后恢复 Gen4 情况 B 链路真的被限制在 Gen1 有负载后仍然保持 Gen1因此需要继续进行动态验证。也就是说基础链路检查发现了“Gen1 当前状态”但还没有证明它是“PCIe 降级”。3. 问题验证启动 CUDA 负载看 PCIe 会不会升速这次实验没有安装 PyTorch、CuPy、Numba也没有使用 DCGM。实际使用的是服务器上的 CUDA PCIe 负载测试脚本脚本见文章所附带资源/opt/nvidia_pcie_load_test.sh直接运行/opt/nvidia_pcie_load_test.sh本次实际测试使用了30 秒负载。脚本支持指定测试时间例如/opt/nvidia_pcie_load_test.sh --duration 60也支持指定 GPU例如/opt/nvidia_pcie_load_test.sh --gpus 0,1,2,3测试过程中程序会启动 CUDA 计算任务让 GPU 真正进入工作状态同时观察 PCIe 链路变化。为了实时观察 PCIe 状态可以使用watch -n 1 nvidia-smi --query-gpuindex,pci.bus_id,pcie.link.gen.current,pcie.link.gen.max,pcie.link.width.current,pcie.link.width.max,pstate,utilization.gpu --formatcsv整个实验真正关注的是这个变化过程空闲 Gen1 x16 ↓ 启动 CUDA 负载 ↓ GPU Util 上升 ↓ PCIe 升速 ↓ Gen4 x16这里的关键不是“运行了一个 CUDA 程序”而是观察真实 GPU 负载前后PCIe 当前速率是否发生变化。4. 实验结果8 张 RTX 4090 全部 Gen1 → Gen4这次测试得到的结果非常明确。空闲状态GPU Util : 0% PState : P8 PCIe : Gen1 x16启动 CUDA 负载后GPU Util : 100% PState : P2 PCIe : Gen4 x168 张 GPU 全部一致GPU空闲状态CUDA 负载状态GPU 0Gen1 x16Gen4 x16GPU 1Gen1 x16Gen4 x16GPU 2Gen1 x16Gen4 x16GPU 3Gen1 x16Gen4 x16GPU 4Gen1 x16Gen4 x16GPU 5Gen1 x16Gen4 x16GPU 6Gen1 x16Gen4 x16GPU 7Gen1 x16Gen4 x16也就是空闲状态 P8 / GPU Util 0% PCIe Gen1 x16 ↓ 启动 CUDA 负载 ↓ P2 / GPU Util 100% PCIe Gen4 x168 张卡全部完成Gen1 x16 → Gen4 x16并且链路宽度始终保持x16这个结果已经回答了最开始的问题这台服务器上的 Gen1 不是固定降级。如果 PCIe 链路真的被锁死在 Gen1那么 GPU 在高负载运行时PCIe 应该仍然保持在 Gen1。而这次实验中8 张卡在真实 CUDA 负载下全部恢复到了 Gen4 x16。说明PCIe 链路具备正常的高速运行能力空闲时的 Gen1 属于当前状态而不是固定的 PCIe 降级。因此本次测试的最终结果可以归纳为指标空闲CUDA 负载PCIeGen1 x16Gen4 x16PStateP8P2GPU Util0%100%5. 怎么判断 PCIe 到底是不是有问题通过这次测试可以把实际排查方法归纳成一个比较简单的流程查看 Current / Max ↓ 查看 Width ↓ 确认 GPU 当前负载 ↓ 运行 PCIe 链路基础检查 ↓ 启动真实 CUDA 负载 ↓ 观察 PCIe 是否恢复高速 ↓ 检查 PCIe 拓扑和系统日志5.1 PCIe 状态怎么判断首先看nvidia-smi --query-gpuindex,name,pci.bus_id,pcie.link.gen.current,pcie.link.gen.max,pcie.link.width.current,pcie.link.width.max,pstate,utilization.gpu --formatcsv重点关注pcie.link.gen.current pcie.link.gen.max pcie.link.width.current pcie.link.width.max例如Current : Gen4 x16 Max : Gen4 x16表示当前状态已经达到最大能力。而Current : Gen1 x16 Max : Gen4 x16不能单独说明故障需要结合 GPU 当前负载以及负载后的 PCIe 状态一起判断。5.2 PCIe 拓扑怎么查查看整个 PCIe 拓扑lspci -D -t典型结构可以简单理解成CPU / Root Complex ↓ Root Port ↓ PCIe Link ↓ GPU Endpoint如果服务器中使用了 PCIe Switch则可能是CPU ↓ Root Port ↓ PCIe Switch ↓ GPU先获取 GPU 对应的 BDFnvidia-smi --query-gpuindex,pci.bus_id --formatcsv然后检查 GPU Endpointlspci -D -vv -s GPU-BDF重点查看LnkCap LnkSta例如LnkCap: Speed 16GT/s, Width x16 LnkSta: Speed 2.5GT/s, Width x16可以对应理解为最高能力Gen4 x16 当前状态Gen1 x16必要时再继续检查 GPU 上游的 Root Portlspci -D -vv -s ROOT-PORT-BDF这里需要注意GPU Endpoint 和 Root Port 的LnkSta描述的是同一条 PCIe 物理链路两端的状态。所以两边同时显示 Gen1 x16并不是出现了两个不同的 PCIe 速率而是说明这条链路当前协商为 Gen1 x16。5.3 系统日志怎么查如果怀疑 PCIe 或 GPU 真有异常再检查内核日志journalctl -b -k --no-pager | grep -Ei PCIe Bus Error|AER:|Bad TLP|Bad DLLP|Completion Timeout|Surprise Down|NVRM: Xid|fallen off the bus|GPU fault|GPU reset|GPU hang重点关注PCIe Bus Error AER Bad TLP Bad DLLP Completion Timeout Surprise Down NVRM: Xid fallen off the bus GPU fault GPU reset GPU hang真正需要警惕的情况通常不是简单的Gen1而是空闲Gen1 负载仍然 Gen1 GPU 性能异常 PCIe / AER / Xid 等错误而本次测试实际得到的是空闲Gen1 x16 负载Gen4 x16 GPU100% 利用率因此从本次实测结果来看没有发现 PCIe 被固定限制在 Gen1 的情况。6. 本次实际使用的脚本和命令6.1 PCIe 链路基础检测/opt/gpu_health_auto.sh该脚本用于自动检查 GPU、PCIe 链路、拓扑以及常见错误。6.2 CUDA PCIe 动态负载测试/opt/nvidia_pcie_load_test.sh指定测试时间/opt/nvidia_pcie_load_test.sh --duration 60指定 GPU/opt/nvidia_pcie_load_test.sh --gpus 0,1,2,36.3 查看 GPUnvidia-smi -L6.4 查看 PCIe 当前 / 最大状态nvidia-smi --query-gpuindex,name,pci.bus_id,pcie.link.gen.current,pcie.link.gen.max,pcie.link.width.current,pcie.link.width.max,pstate --formatcsv6.5 实时观察 PCIewatch -n 1 nvidia-smi --query-gpuindex,pci.bus_id,pcie.link.gen.current,pcie.link.gen.max,pcie.link.width.current,pcie.link.width.max,pstate,utilization.gpu --formatcsv6.6 查看 PCIe 拓扑lspci -D -t6.7 获取 GPU BDFnvidia-smi --query-gpuindex,pci.bus_id --formatcsv6.8 查看 GPU Endpointlspci -D -vv -s GPU-BDF6.9 查看 Root Portlspci -D -vv -s ROOT-PORT-BDF6.10 检查系统日志journalctl -b -k --no-pager | grep -Ei PCIe Bus Error|AER:|Bad TLP|Bad DLLP|Completion Timeout|Surprise Down|NVRM: Xid|fallen off the bus|GPU fault|GPU reset|GPU hang6.11 检查 CUDA Toolkitcommand -v nvcc nvcc --version6.12 查看 CUDA 安装目录ls -ld /usr/local/cuda*

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑