Re: PCI Express (PCIe) for Networkers

この記事は次の記事へのレスポンスだったりします。

8b/10bエンコーディングと、各レイヤのヘッダ(フレーミング)によるオーバーヘッドが一番大きい。
8b/10b:実効帯域=80%
ヘッダ:データサイズ=64Bの場合、実効帯域=84%
複数レーンの場合、フレームサイズによってはパディングのオーバーヘッドが発生する。
その他シグナリング(TLP, DLLP)も同じ帯域を使用するため、多少のオーバーヘッドが発生する。

市場に出ているカードは基本的に PCIe 側の帯域 > インターフェースの帯域となるように設計されるはずです。

10GbE 2port で Gen2 x8 の NIC を例にとると

  • Network の帯域 : 10Gbps * 2 = 20Gbps
  • PCIe の帯域: 5GT/s * 8lane * (8b/10b) = 32Gbps

となり、実質的に問題にならないようになっています。

Switch を間に挟んで、Switch の Upstream Port の Link を複数の Card で共有すると PCIe の帯域が足りなくなることはあります。(なので、システムの Block-diagram を見て律速しないようにするべき)

ノン・ポステッドなトランザクションの場合、リクエストTLP送信とコンプリーションTLP受信タイミングにより実効速度が大きく低下する場合がある。

大雑把に言って、DMA write 性能は MWr(posted) の数とカード-CPU間のレイテンシで、DMA read 性能は MRd(non-posted) の数とカード-CPU間のレイテンシで決まります。(なので、カード-CPU間になるべく Switch をはさまないようにするべき。カードが出せる MWr/MRd の数はどうにもならない)

なお、データ・サイズはチップセットやノード(NIC等)に依存するらしく、ネットワーク系では64Bが使われる事が多いらしいです。。。

「らしい」というのは「PCIe オーバーヘッドは 20% …」とか「ペイロードサイズを64Bとすると…」という資料を見かけた事があるというだけで、調べきれてません。

payload サイズを決める要因が幾つかあります。

  • デバイスごとの最大ペイロードサイズ(Max Payload Size)

これはデバイスごとに固有の値。
root になれる機械で lspci -xxxxvvvv したら見れるはず。あとカードではなくてコントローラのスペックシートにたいてい書いてある。
例: http://download.intel.com/design/network/datashts/82599_datasheet.pdf p.21

Max Payload Size Supported 512 Bytes

チップセットの Max Payload Size が小さいと NIC 側もそちらに引っ張られるので、チップセットの Max Payload Size も重要。

  • Read に対する Completion の分割

PCIe は Read に対する Completion を分割することを許していて、分割した結果 64B 単位で区切られる(ここうろ覚え)ので 64B で計算すると最悪値が求まるが、前述のとおり問題にならないはず。

おまけ: PCIe Gen3 では 8b/10b エンコーディングを捨てて 128b/130b エンコーディングになりました。