如何查看Linux系统PCIe链路速度

作者:技术拾光时间:2026-06-26 08:50:06浏览:499

查看PCIe链路速度的正确方法是使用lspci-vvv命令,并关注LnkSta行,该行显示当前实际协商的速率,而非LnkCap所标示的设备支持上限。通过grep"Speed"容易误判,更可靠的方式是从/sys/bus/pci/devices/路径下读取current_link_speed文件。如果LnkSta显示0.0GT/s或为空,说明链路未建立,应检查d

直接查看 lspci -vvv 输出中的 LnkSta 行,它反映当前实际协商的 PCIe 链路速度和宽度,而非设备标称能力或插槽物理规格。先明确这个结论,后续再详细展开说明。

如何查看Linux系统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 状态。