直接用sudo lspci -vvv | grep -a 3 "lnksta:"查看,lnksta行中的speed和width即当前实际协商的链路速度与宽度,反映真实运行状态,而非lnkcap标称能力;需root权限确保字段完整,必要时可交叉验证/sys/bus/pci/devices/*/current_link_speed。

怎么看 PCIe 设备当前协商的链路速度和宽度
直接用 lspci -vvv | grep -A 3 "LnkSta:" 最快。因为 LnkSta(Link Status)这一行就包含了实际运行时的速率(Speed)和通道数(Width),它反映的是设备与插槽之间**真实协商成功的结果**,不是标称值。
常见错误是只看 LnkCap(Link Capabilities),那只是“硬件能支持什么”,比如显示 Speed 8GT/s, Width x16,但实际可能只跑在 5GT/s, x8 —— 这种降速通常由主板 BIOS 设置、CPU PCIe 通道分配、物理插槽电气限制或设备兼容性导致。
-
LnkSta: Speed 8GT/s, Width x8表示当前链路以 PCIe 3.0 速率、8 条通道运行 -
LnkSta: Speed 2.5GT/s, Width x1很可能是设备被强制降级到 PCIe 1.0,或插在了仅支持 x1 的 mini-PCIe 插槽上 - 如果
LnkSta显示Speed 0.0GT/s或字段为空,说明链路根本没建立,得查供电、插槽识别、BIOS 中 PCIe 设置是否禁用
为什么 lspci -vvv 输出里有两套 Speed/Width 字段
LnkCap 和 LnkSta 是两回事:LnkCap 是设备宣称自己“能支持的最大能力”,LnkSta 是“此刻正在用的能力”。它们不一致非常常见,且不等于故障。
比如一张 PCIe 4.0 x4 SSD 插在老主板(只支持 PCIe 3.0)上,LnkCap 仍会显示 Speed 16GT/s(设备自身能力),但 LnkSta 一定是 Speed 8GT/s(主板上限)。这时系统日志里通常没有报错,dmesg | grep -i pcie 也看不到异常 —— 因为降速是标准协商行为。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 不要只信
LnkCap,它不能告诉你设备现在跑得多快 -
LnkSta才是性能瓶颈定位的第一依据 - 某些设备(如 NVMe 控制器)的
LnkSta可能藏在二级功能(如 Function 1)里,需用lspci -s 00:1d.0 -vvv单独查具体地址
普通用户执行 lspci -vvv 为什么看不到完整信息
因为部分寄存器(尤其是配置空间高地址段和某些状态位)需要 root 权限才能读取。普通用户运行时,LnkSta 可能显示不全,甚至整行缺失;DevSta(Device Status)里的错误计数器也常为空。
- 必须用
sudo lspci -vvv,否则关键诊断字段不可见 -
lspci -k(查驱动)和lspci -t(查拓扑)倒是一般用户就能用,但它们不解决速率问题 - 如果
sudo lspci -vvv仍缺LnkSta,检查内核是否启用了CONFIG_PCIEASPM,或 BIOS 是否关闭了 PCIe 高级状态报告(ASPM)
除了 lspci,还有哪些方式交叉验证 PCIe 速率
lspci 是最直接的命令行手段,但它依赖内核对配置空间的映射。遇到输出矛盾或怀疑硬件虚报时,可以结合 sysfs 查看实时链路统计:
例如网卡设备 01:00.0,对应 sysfs 路径为 /sys/bus/pci/devices/0000:01:00.0/,里面 current_link_speed 和 current_link_width 文件内容就是内核从硬件读出的当前值,和 LnkSta 应该一致。
-
cat /sys/bus/pci/devices/0000:01:00.0/current_link_speed输出类似8.0 GT/s -
cat /sys/bus/pci/devices/0000:01:00.0/current_link_width输出类似x8 - 如果两者不一致,说明内核驱动或固件存在解析 bug,此时应优先信 sysfs 值(它是硬件寄存器直读)
-
lspci -xxx虽然能看全部寄存器,但风险高:部分设备在读取未实现区域时会触发 PCIe 错误中断,甚至导致系统 hang 住
真正容易被忽略的是:PCIe 链路状态是动态的。热插拔、ASPM 省电策略、驱动重载都可能临时改变 LnkSta。所以排查时别只截一次屏,要用 watch -n1 'lspci -s 00:01.0 -vvv | grep LnkSta' 持续观察变化。










