如何查看Linux系统PCIe链路速度
查看PCIe链路速度的正确方法是使用lspci-vvv命令,并关注LnkSta行,该行显示当前实际协商的速率,而非LnkCap所标示的设备支持上限。通过grep"Speed"容易误判,更可靠的方式是从/sys/bus/pci/devices/路径下读取current_link_speed文件。如果LnkSta显示0.0GT/s或为空,说明链路未建立,应检查d
直接查看 lspci -vvv 输出中的 LnkSta 行,它反映当前实际协商的 PCIe 链路速度和宽度,而非设备标称能力或插槽物理规格。先明确这个结论,后续再详细展开说明。

为什么仅用 lspci -vvv | grep "Speed" 查看 PCIe 速度不准确
很多用户习惯执行 lspci -vvv | grep "Speed" 来检查 PCIe 速度,输出显示 Speed 16GT/s 便认为设备运行在 PCIe 4.0。实际上,这条命令同时匹配了 LnkCap(设备支持上限)、DevCap(设备能力)和 LnkSta(实际状态)中的字段,容易误判。例如:
LnkCap: Speed 16GT/s, Width x4表示该设备本身支持 PCIe 4.0 x4,并非当前运行速率LnkSta: Speed 8.0GT/s, Width x2才是真实状态——实际只协商到 PCIe 3.0 x2- 部分老旧网卡或 BMC 直连设备中,
LnkSta行甚至完全不存在,若仅通过grep批量扫描,这类链路异常会被忽略
因此,核心要点明确:必须查看 LnkSta 行,切勿被 LnkCap 的数值误导。
查看 LnkSta 必须使用 sudo 权限
普通用户执行 lspci -vvv 时,PCIe 配置空间中的部分寄存器(尤其是链路状态寄存器)无法读取。结果表现为 LnkSta 行为空、字段缺失甚至整行消失。问题并非命令无输出,而是权限不足。
- 务必使用
sudo lspci -vvv,否则诊断结果无效 - 若添加
sudo后仍看不到LnkSta,需检查内核是否启用CONFIG_PCIEASPM,或 BIOS 是否关闭了“PCIe Link State Reporting”选项 - 对于多功能设备(如 NVMe 控制器包含 Function 0 和 Function 1),
LnkSta可能位于二级功能中,应单独执行sudo lspci -s 00:1d.1 -vvv查看
更稳定的验证方式:通过 /sys 文件系统读取当前 PCIe 链路速度
lspci 依赖用户空间工具解析配置空间,而 /sys 下的值由内核直接从硬件寄存器读取,更能反映运行时的真实状态。尤其适合批量脚本采集,或在 lspci 失效时作为备用方案。
- 首先定位设备地址:
lspci | grep -i nvme→ 得到类似0000:09:00.0的结果 - 检查路径是否存在:
ls /sys/bus/pci/devices/0000:09:00.0/ - 读取当前速率:
cat /sys/bus/pci/devices/0000:09:00.0/current_link_speed(输出为纯数字,如8.0) - 读取最大能力:
cat /sys/bus/pci/devices/0000:09:00.0/max_link_speed;若两者不一致,说明链路已降速
容易被忽略的细节:LnkSta 显示 Speed 0.0GT/s 或字段为空,并非“速度慢”,而是链路根本未建立。此时应通过 dmesg | grep -i pcie 排查供电、BIOS 中 PCIe 设置是否被禁用,或设备是否被识别为 disabled 状态。
