Linux – 檢查 PCI-E 裝置的 Speed & width

 

PCIe传输速率和可用带宽(吞吐量)计算方式-队长的Blog (duiz.net) 

二、PCIE相关概念:

传输速率为每秒传输量GT/s,而不是每秒位数Gbps,因为传输量包括不提供额外吞吐量的开销位; 比如 PCIe 1.x和PCIe 2.x使用8b / 10b编码方案,导致占用了20% (= 2/10)的原始信道带宽。

GT/s —— Giga transation per second (千兆传输/秒),即每一秒内传输的次数。重点在于描述物理层通信协议的速率属性,可以不和链路宽度等关联。

Gbps —— Giga Bits Per Second (千兆位/秒)。GT/s 与Gbps 之间不存在成比例的换算关系。

三、PCIE带宽计算

PCIe 吞吐量(可用带宽)计算方法:

吞吐量 = 传输速率 * 编码方案

例如:PCI-e2.0 协议支持 5.0 GT/s,即每一条Lane 上支持每秒钟内传输 5G个Bit;但这并不意味着 PCIe 2.0协议的每一条Lane支持 5Gbps 的速率。

为什么这么说呢?因为PCIe 2.0 的物理层协议中使用的是 8b/10b 的编码方案。 即每传输8个Bit,需要发送10个Bit;这多出的2个Bit并不是对上层有意义的信息。

那么, PCIe 2.0协议的每一条Lane支持 5 * 8 / 10 = 4 Gbps = 500 MB/s 的速率。

以一个PCIe 2.0 x8的通道为例,x8的可用带宽为 4 * 8 = 32 Gbps = 4 GB/s。

同理,

PCI-e3.0 协议支持 8.0 GT/s, 即每一条Lane 上支持每秒钟内传输 8G个Bit。

而PCIe 3.0 的物理层协议中使用的是 128b/130b 的编码方案。 即每传输128个Bit,需要发送130个Bit。

那么, PCIe 3.0协议的每一条Lane支持 8 * 128 / 130 = 7.877 Gbps = 984.6 MB/s 的速率。

一个PCIe 3.0 x16的通道,x16 的可用带宽为 7.877 * 16 = 126.031 Gbps = 15.754 GB/s。

Linux – 檢查 PCI-E 裝置的 Speed & width – Benjr.tw

在 Linux 下要如何得知 PCI-E Bus 使用的是 Gen (Generation) 1 還是 Gen2 還是新一代的 Gen 3 雖然使用 #lspci 只要可以看到目前系統所有的裝置.但是好像看不到 PCI-E Bus 所採用的是哪一代的 PCI-E.

[root@benjr ~]# lspci

00:00.0 Host bridge: Intel Corporation 3200/3210 Chipset DRAM Controller (rev 01)

00:01.0 PCI bridge: Intel Corporation 3200/3210 Chipset Host-Primary PCI Express Bridge (rev 01)

00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02)

00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 02)

00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 02)

00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 02)

00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 5 (rev 02)

00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 6 (rev 02)

00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 02)

00:1d.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02)

00:1d.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 02)

00:1d.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 02)

00:1d.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 02)

00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92)

00:1f.0 ISA bridge: Intel Corporation 82801IR (ICH9R) LPC Interface Controller (rev 02)

00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA AHCI Controller (rev 02)

00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 02)

03:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express

04:03.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)

09:00.0 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)

09:00.1 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)

0c:00.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1064ET PCI-Express Fusion-MPT SAS (rev 02)

如果有裝置是 unknown 的,需要更新 /usr/share/hwdata/pci.ids 請參考更新方式 Linux file – pci.ids – Benjr.tw

首先我們先來複習一下 PCI-E bus 的速度上限.

  • PCI Express 1.1
    使用兩對低電壓的差位訊號排線(low-voltage differential signaling pairs),分別各跑 2.5GBit/s 速度,x1 有兩對(傳送與接收) 2.5 G x 2 = 5Gbps 的頻寬.不過在討論頻寬時還是以單方向來計算.下面的速度是以單對的速度而言.
    x1 2.5Gbps (20% overhead – PCI-e 在每八個位元的資料串上用十位元來加以編碼) 2Gbps (250 MB/sec)
    x4 10Gbps 8Gbps (1 GB/sec)
    x8 20Gbps 16Gbps (2GB/sec)
    x16 40Gbps 32Gbps (4GB/sec)
  • PCI Express 2.0
    PCI-SIG 的 PCI Express 2.0 規格,新版每條 Lane 的單向頻寬從 2.5Gbps 倍增到 5Gbps.
    x1 5Gbps (20% overhead – PCI-e 並且在每八個位元的資料串上用十位元來加以編碼) 4Gbps (500 MB/sec)
    (5G*0.8)Mb/8=500MB
    x4 20Gbps 16Gbps (2 GB/sec)
    x8 40Gbps 32Gbps (4 GB/sec)
    x16 80Gbps 64Gbps (8 GB/sec)
  • PCI Express 3.0
    PCI-SIG 的 PCI Express 3.0 規格,新版每條 Lane 的單向頻寬增到 8Gbps.
    但因為編碼方式改變了,相較於 2.0 之前採用 8b/10b (每10個bit只有8個是有效資料)而 3.0 編碼方式為 128/130,所以資料傳輸頻寬以及原始傳輸率基本當都可以算成 8Gbps.
    x1 8Gbps (1GB/sec)
    x4 32Gbps (4 GB/sec)
    x8 64Gbps (8 GB/sec)
    x16 128Gbps (16 GB/sec)

我的系統上有一張 Qlogic Chipset 為 2432 的 4G Fiber Channel HBA,要如何得知目前系統的 PCI-E Bus 的速度呢!!

  1. Bus + Device + Function (Number)

    09:00.0 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)

    可以看到目前 Qlogic 2432 的 PCI 名稱以及裝置名稱為 09:00.0 先來看看這些數字所代表的意義.

    在 PCI 的裝置使用三個編號用來當作識別值,個別為 1.匯流排(bus number), 2. 裝置(device number) 以及 3. 功能(function number).

    所以剛剛的 09:00.0 就是 bus number = 09 ,device number = 00 function = 0 .

    這3個編號會組合成一個 16-bits 的識別碼.

    1. 匯流排(bus number) 8bits 2^8 至多可連接 256 個匯流排(0 to ff).
    2. 裝置(device number) 5bits 2^5 至多可接 32 種裝置(0 to 1f).
    3. 功能(function number) 3bits 2^3 至多每種裝置可有 8 項功能(0 to 7).

    關於更多 #lspci 的資訊請參考 Linux command – lspci – Benjr.tw

    接下來透過指令 #lspci -s 09:00.0 -vvv |grep -i width 就可以得知 PCI-Express 的速度了.

    [root@benjr ~]# lspci -s 09:00.0 -vvv |grep -i width

    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited

    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited

    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

    • LnkCap :
      系統能提供的最高頻寬 PCI-Express 1.0 ( 2.5G ) Width x4=10G .如果系統是提供 PCI-Express 2.0 那 x1 速度是 5G.
    • LnkSta :
      目前該PCI-E 裝置跑的速度 PCI-Express 1.0 ( 2.5G ) Width x1=2.5G,

    LnkSta 和 LnkCap 這兩個速度有可能不一樣 ,系統所提供的是 PCI Express 是 2.0 但裝置還是使用 1.0 的.

  2. Class + Vendor + Device (ID)

    不過在 Linux 使用 Class ID + Vendor ID + Device ID 來代表裝置,首先要查出這張 HBA 的裝置名稱.

    [root@benjr ~]# lspci -n

    …..

    09:00.0 0c04: 1077:2432 (rev 03)

    09:00.1 0c04: 1077:2432 (rev 03)

    ….

    參數 -n 使用 PCI vendor 以及 device codes 使用數字來顯示,後面我們會用到這些數字.

    如剛剛的 0c04: 1077:2432 所代表裝置名稱為 (Class ID = 0c04 ,Vendor ID = 1077,Device ID =2432) .

    • 0c04 : class 0c04 表示是 Fiber Channel controller
    • 1077 : vendor ID 1077 製造廠商 Qlogic Corp
    • 2432 : device ID 2432 產品名稱 ISP2432-based 4Gb Fiber Channel to PCI Express HBA

    你問我怎麼知道 ID 與名稱是怎麼對應的很簡單直接參考 /usr/share/hwdata/pci.ids 檔案即可.

    針對單一裝置來檢視可以使用 -d [vendor]:[device] 剛剛使用 -n 時所查到的 PCI vendor 以及 device codes 這邊就派得上用場了.

    接下來透過指令 #lspci -n -d 1077:2432 -vvv |grep -i width 就可以得知 PCI-Express 的速度了.

    [root@benjr ~]# lspci -n -d 1077:2432 -vvv |grep -i width

    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited

    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited

    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

    • LnkCap :
      系統能提供的最高頻寬 PCI-Express 1.0 ( 2.5G ) Width x4=10G .如果系統是提供 PCI-Express 2.0 那 x1 速度是 5G.
    • LnkSta :
      目前該PCI-E 裝置跑的速度 PCI-Express 1.0 ( 2.5G ) Width x1=2.5G.

    LnkSta 和 LnkCap 這兩個速度有可能不一樣 ,系統所提供的是 PCI Express 是 2.0 但裝置還是使用 1.0 的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值