关于Linux的PCIe通道速率
我这块做服务器的B450M板用的是技嘉的AORUS ELITE,收的二手,因为B系的板pcie通道本就非常宝贵,综合考虑下来这块上面的通道接口分配是最合理的,当然还有个原因就是华擎的那块买不到。
前言
这块板有两个M2通道,400系只有一个是3.0x4的速率,而另一个是2.0x4的,不过之所以选择这一块是因为在仔细翻阅规格书其实可以发现,第二个M2其实还支持3.0x2模式,这是因为CPU本身就有这一条通道,只不过综合下来,3.0x2的总带宽还不如2.0x4的,因此这个通道就被空置在那隐藏起来了。
这里需要先说明一下关于PCI-E通道的相关内容,PCIe通道的理论带宽由这一代的频率决定,不同于PCI通道,PCIe通道采用全双工,因此计算时会将单次传输带宽x2作为总带宽,相比之下PCI采用的就是半双工。

具体计算过程也挺复杂,反正直接看表格,直接给算好了

查表可知,2.0的单条通道速率为500M/s,而3.0为984.6M/s,综合计算3.0x2为1.97G/s确实不如2.0x4的2G/s
那么为什么还需要这个3.0x2这个看起来很鸡肋的通道呢,主要原因在于,如果是一个常见的nvme固态硬盘,一般采用的都是4通道,那么如果直接插到这个接口上,硬件就会为它的4通道需求分配四个2.0通道。但是,如果你插入的硬件是2通道的,那么硬件就会为其分配两个3.0通道,这是自动适应的。我之前就看到过一个M2转两个miniSAS接口的扩展板,总共可以连接8块SATA硬盘,采用的就是3.0x2的规格。那么有没有直插的固态硬盘,可以支持这种奇怪的通道规格呢?其实确实是有的。
这就得请出傲腾了,之前在逛某宝时,发现一块16G的傲腾M10只需要十几块钱,不过旦凡需要上到32G就要一百多了,64G板直逼三百块,所以本着买了也不吃亏的想法弄一块16G的也不是不行,翻阅一些人的规格截图时发现,这正是一块采用x2通道的固态。
于是毫不犹豫地弄了一块,先上Windows的机子上确实是x2通道,某种程度上来说,这确实是为这个特殊接口量身打造的,相当于直接吧这个原本只有2.0带宽的接口压榨到了3.0,旦凡如果不支持这种模式,那么插上就只能获得2.0x2的带宽了。那么现在上机测试正常,在Linux下又要如何知晓它是不是已经获得所期望的速率了呢。这里就需要用到万能的lspci
指令了
查看通道速率
首先通过过滤字段名的方式,先找到这个Intel的傲腾固态
root@Codelab:~# lspci | grep Intel
05:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
05:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
07:00.0 Non-Volatile memory controller: Intel Corporation NVMe Optane Memory Series
很显然,第三行就是这个傲腾,记下07:00.0
,这是它的设备空间,然后根据识别号查询设备的venid
和devid
root@Codelab:~# lspci -n | grep -i 07:00.0
07:00.0 0108: 8086:2522
然后根据设备ID来查看PCIE设备的带宽
root@Codelab:~# lspci -n -d 8086:2522 -vvv | grep Width
LnkCap: Port #0, Speed 8GT/s, Width x2, ASPM L1, Exit Latency L1 unlimited
LnkSta: Speed 8GT/s (ok), Width x2 (ok)
其实还可以直接通过上面的设备空间来查询,得到的输出是一样的
lspci -s 07:00.0 -vvv | grep Width
其中LnkCap
是设备规格的速度(即最大速度),而LnkSta
就是系统目前提供的速度,可见这块傲腾最高支持8GT/s x2,查表可知就是3.0x2的速率,而系统部分的两个ok意味着系统已经按照设备规格那样提供了最大速率和通道数