不能,lspci不显示实时带宽,仅通过lnkcap(硬件最大能力)和lnksta(当前实际协商的速率与宽度)推导理论带宽;真实吞吐需用ethtool、nvidia-smi或perf等工具测量。

lspci 能直接显示 PCIe 带宽吗?不能,但能推导
lspci 本身不输出实时带宽(如 MB/s 或 GT/s 实际吞吐),它只显示链路协商能力(Link Capabilities)和当前协商状态(Link Status)。真实带宽取决于设备实际传输数据时的利用率,这得靠 perf、ethtool(网卡)或厂商工具(如 nvidia-smi)测。但 lspci 是第一步——确认物理链路“理论上最高能跑多少”以及“现在连上了几通道多高速度”。
用 lspci -vv 找 Link Width 和 Speed
运行以下命令定位具体设备(比如显卡或 NVMe):
lspci -vv -s 01:00.0 | grep -A 5 "LnkSta\|LnkCap"
重点关注两行:
-
LnkCap中的Speed(如8.0GT/s)和Width(如x16)——这是设备**支持的最大能力** -
LnkSta中的Speed(如8.0GT/s)和Width(如x8)——这是**当前实际协商结果**,如果这里宽度缩水(比如 Cap 是 x16 但 Sta 是 x8),说明插槽、主板或 BIOS 限制了链路
注意:GT/s 是每秒千兆传输次数,不是字节带宽;PCIe 3.0 x16 单向理论带宽 ≈ 16 GB/s(双向约 32 GB/s),但实际可用率通常在 95% 以内。
为什么 lspci 显示的 Speed 和 Width 不一致?常见原因
设备插在 x16 插槽但 LnkSta 显示 x4 或 x1,往往不是线缆或接触问题(PCIe 没线缆),而是:
- 主板 BIOS 设置了 PCIe 速率限制(如强制 Gen2)、或开启了“Above 4G Decoding”但没开 SR-IOV/Resizable BAR,导致链路降速
- CPU PCIe 通道数不足:例如 i5-10400 只有 16 条 CPU 直连 PCIe 3.0 通道,若同时插了显卡 + NVMe,后者可能走 PCH,带宽受限且不显示在 CPU 的 LnkSta 里
- 设备自身限制:某些廉价 NVMe SSD 主控只支持 x2 模式,即使插在 x4 插槽也只协商 x2
-
lspci -vv输出中若LnkSta缺失或为Down,说明设备未被识别或供电异常(检查dmesg | grep -i pcie)
想看实时带宽?别只盯着 lspci
要监控真实数据吞吐,得换工具:
- 网卡:用
ethtool -S eth0 | grep -i "tx\|rx"看计数器,再结合时间差算速率;或ip -s link show eth0 - NVMe:用
sudo nvme smart-log /dev/nvme0n1查data_units_read/written,配合时间戳估算平均吞吐 - 通用 PCIe 设备(如 GPU):NVIDIA 显卡用
nvidia-smi dmon -s puc;AMD GPU 可试rocm-smi --showbusyness - 内核级:
perf stat -e pci/*/cycles/,pci/*/read-bytes/,pci/*/write-bytes/ -a sleep 1(需内核开启 CONFIG_PERF_EVENTS_INTEL_UNCORE)
真正容易被忽略的是:PCIe 带宽瓶颈常不在设备端,而在上游——比如 M.2 NVMe 走芯片组通道时,PCH 到 CPU 的 DMI 链路(本质是 PCIe x4 Gen3)就成了隐性瓶颈,而 lspci 根本不显示 DMI 链路信息。











