Re: PCI Express (PCIe) for Networkers
この記事は次の記事へのレスポンスだったりします。
- PCI Express (PCIe) for Networkers : http://terrasense.wordpress.com/2011/01/08/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 エンコーディングになりました。