# Design Guidelines for High Performance RDMA Systems > [!abstract] 概要 > 現代のRDMAハードウェアは卓越した性能の可能性を提供するが、どのRDMA操作を使うか、それをどう使うかを含む設計選択が、観測される性能に大きく影響する。本論文は、システム設計者がRDMA設計空間を進む際に使えるガイドラインを示す。我々のガイドラインは、個々のPCIeトランザクションやNICアーキテクチャといった低レベルの詳細に注意を払うことを重視する。我々は、これらのガイドラインをRDMAベースのシステムの性能改善にどう使えるかを実証的に示す。既存設計を50倍上回るネットワーク型sequencerを設計し、既存の高性能key-valueストアのCPU効率を83%改善する。さらに、いくつかの新しいRDMA最適化と落とし穴を提示・評価し、それらがRDMAシステムの設計にどう影響するかを議論する。 ## 論文情報 - 著者: Anuj Kalia([[Carnegie Mellon University]])、Michael Kaminsky([[Intel Labs]])、David G. Andersen([[Carnegie Mellon University]]) - 会議: USENIX ATC 2016(2016 USENIX Annual Technical Conference、2016年6月22–24日、Denver, CO, USA)、pp. 437–450 - URL: https://www.usenix.org/conference/atc16/technical-sessions/presentation/kalia - 公開コード・計測ツール: https://github.com/efficient/rdma_bench ## 概要 RDMAシステム設計は、どのverb(READ/WRITE/SEND/RECV)・どのtransport(RC/UC/UD)・どの最適化フラグを使うかという広大な選択空間を持ち、その相対性能はPCIeトランザクションやNICアーキテクチャといった低レベルの詳細によって決まる。本論文は、この選択空間を体系的に navigate するための設計ガイドライン群と、それを裏付けるPCIeカウンタベースの計測手法・オープンソースツールを提示し、実際に2つのシステム(ネットワーク型sequencer、HERD key-valueストア)の再設計に適用してその有効性を示す。 ## 問題設定 RDMA対応ネットワーク(InfiniBand、RoCE、iWARP)は高帯域・低遅延を提供するが、どのRDMA操作を使うか、どう使うかで性能が大きく変わる。著者らの計測では、best/worstの選択の違いでoverall throughputが最大70倍、消費するhost CPU量が最大3.2倍異なる。さらに、one-size-fits-allの最良設計は存在しない。たとえば汎用的なRPC over RDMAはkey-valueストアには最良の設計だが、シーケンサ用途では最良の設計より16%低いthroughputしか出ない。既存のRDMAベースシステム(HERD、FaRM、Pilaf、DrTM-KV、Nessieなど)は、verbの選択をmicrobenchmarkベースの比較だけで決めており、PCIeやNICアーキテクチャといった低レベル要因を系統的に検討していない。この低レベル要因を理解するための文献も乏しく、PCIe解析には高価な専用アナライザか非公開のNICマニュアルが要る。 ## 提案手法 RDMAクラスタのノードは、NIC・PCIeコントローラ・CPU・L3キャッシュ・DRAMから成る(図1)。NICのPCIeトランザクションはread request・write request・read completionの3種で、そのヘッダオーバーヘッドは20〜26バイト、read completion combining sizeは128バイトになる。MMIO(CPUからNICへの書き込み)よりDMA読み出しの方が同じデータ量でも常に少ないPCIe帯域しか使わない(図2)。サーバはWRITE/READ/SENDを送信するときoutbound、RECVを受けるときやWRITE/READを受けるときinboundになる(図3)。 ![[fig01-hardware-components.png]] ![[fig02-pcie-background.png]] ![[fig03-inbound-outbound-verbs.png]] 本論文は5つの設計ガイドラインを提示する。いずれも「CPUとNIC間のPCIeトランザクション数・サイズを減らす」「NIC内部の並列処理ユニット(processing unit, PU)を有効活用する」という原則に基づく。 1. **CPU起点のMMIOを削減する**: doorbell batching(複数WQEをまとめて1回のDoorbell MMIOでNICに通知する)と、WQEのキャッシュライン数を削るWQE shrinking(図4)。 ![[fig04-wqe-mmio-doorbell.png]] 2. **NIC起点のDMAを削減する**: unsignaled verb(完了通知(CQE)のDMA書き込みを省く)、payload inlining、および本論文が提示するinline RECV(ペイロードをCQEに埋め込みDMAを1回に減らす)とheader-only SEND/RECV(ペイロードを4バイトのimmediateヘッダフィールドに載せ、ペイロードDMAそのものを不要にする、図5・図6)。 ![[fig05-ud-send-optimizations.png]] ![[fig06-recv-optimizations.png]] 3. **NICの複数PUを稼働させる**: QP(queue pair)を増やしてNICの複数処理ユニットに処理を分散させるmulti-queue最適化。1コアが1つのPUに縛られる状況(per-message処理が小さいsequencerなど)で有効。 4. **NIC PU間の競合を避ける**: atomic演算(compare-and-swap、fetch-and-add)はNIC内部のロック機構でシリアライズされ、非atomic verbとも競合するため、ロック粒度・アドレスからロックへのマッピングを把握して設計する。 5. **NICキャッシュミスを避ける**: アドレス変換キャッシュ、QP状態キャッシュに加え、本論文が新たに発見したWQEキャッシュ(NICが処理待ちのWQEをキャッシュする機構)のミスを避ける。CPUがNICの処理速度より速くWQEを注入すると、生成中・応答処理中のいずれでもキャッシュミスが起き、PCIe読み出しが追加発生する(図13a)。 これらのガイドラインを、ネットワーク型sequencer(HERD RPCベースの設計をbatching・multi-queueで改良し、さらにheader-only SENDとspeculationを使うSpec-S0を新設計)と、HERD key-valueストア(batchingを適用)の2システムに適用して評価する。 ## 新規性 - PCIeトランザクション(read request/write request/read completion)のレベルでRDMA verb・transportの性能を分析する定量モデルを提示した。既存研究(NIQ [Flajslik&Rosenblum, 2013])はEthernetカードの高レベルなPCIe挙動しか扱っておらず、batched転送時のより微妙な相互作用は論じていない。 - **WQEキャッシュ**を、NIC内部の未文書化な第3のキャッシュ種別として実験的に発見した(既知のアドレス変換キャッシュ・QP状態キャッシュに加えて)。 - **header-only SEND/RECV**と、それを使ったspeculationベースの8バイトsequencer設計(Spec-S0)を新規に提示した。クライアントが期待する応答上位4バイトを推測して送ることで、通常はSEND/RECVを避けて設計されるところをdatagram-onlyの高スケーラブルな設計に落とし込んでいる。 - atomic演算のNIC内部ロック機構(ロック数・アドレスからロックへのマッピング)を、ブラックボックスなNICに対してPCIeカウンタと性能測定のみから推定する実験手法を示した(Connect-IBは下位12ビットが一致するアドレスペアで性能が落ちることから、4096バケットへのハッシュ分割を推測)。 ## 実験設定 3世代のNIC/クラスタで評価する(表2に対応)。 | クラスタ名 | NIC | PCIe | CPU | |---|---|---|---| | CX | ConnectX(56 Gb/sではなく20 Gb/s InfiniBand ×1ポート) | PCIe 2.0 x8 | AMD Opteron 8354(4コア、2.2 GHz) | | CX3 | ConnectX-3(56 Gb/s InfiniBand ×1ポート) | PCIe 3.0 x8 | Intel Xeon E5-2450(8コア、2.1 GHz) | | CIB | Connect-IB(56 Gb/s InfiniBand ×2ポート) | PCIe 3.0 x16 | Intel Xeon E5-2683 v3(14コア、2 GHz) | CXはNSF PRObEのNomeクラスタ、CX3はEmulabのAptクラスタ、CIBはNetApp提供のクラスタを使用。CX3・CIBはUbuntu 14.04 + Mellanox OFED 2.4、CXはUbuntu 12.04 + Mellanox OFED 2.3。PCIeカウンタ(DMA読み出しの`PCIeRdCur`、DMA書き込みの`PCIeItoM`)でCPU-NIC間のPCIeトラフィックを計測する。非batch操作にはWQE-by-MMIO、batch操作にはDoorbellを用いる(バッチサイズ1のときはWQE-by-MMIOにフォールバック)。詳細な低レベル評価は主にCIBクラスタで行う。 ## 実験結果 **sequencer**: HERD RPCベースのsequencerはbatchingで単一コアthroughputが7.0 Mrpsから16.6 Mrpsへ、multi-queue(1コアあたり3 per-port QP)を加えると27.4 Mrpsへ向上する(図7)。6コア・両最適化併用で97.2 Mrpsに達し、DMA帯域(理論限界101.6 Mops)の95%に達してボトルネックがDMA帯域に移る。header-only SEND/RECVとspeculationを使うSpec-S0はNIC処理能力(122 Mrps)で頭打ちになり、atomics-basedのsequencer(2.24 Mrps)に対して**50倍**、単一コア比でも12.2倍高速である(表3)。batchingを使うSpec-S0の応答遅延は、batchingなしと比べてDoorbell分のDMA読み出しが追加される分、最大で約1µs増えるが、throughputとCPU効率の向上に対して許容範囲としている(図8)。 ![[fig07-sequencer-throughput.png]] ![[fig08-spec-s0-latency.png]] **HERD key-valueストア**: 128クライアントスレッド、16バイトキー/32バイト値、95% GET・5% PUTの負荷で、batchingによりコアあたりthroughputが6.7 Mrpsから12.3 Mrpsへ**83%**向上し、ピークthroughputは72.8 Mrpsから98.3 Mrpsへ**35%**向上する(図9)。batching適用後のHERDは、READベースのkey-valueストア(Pilaf・FaRM-KV型、GETに2回以上のREADを要する設計)に対して最大63%高いthroughputを示す。 ![[fig09-herd-throughput.png]] **atomicsベースkey-valueストア(DrTM-KV/Nessie型)**: GET専用では高いthroughputが出るが、PUTを10%混ぜるだけでCX3で72%、CIBで31%throughputが劣化する。100% PUTではCX3でGET専用比4%、CIBで12%まで落ち込む(図10)。CIBの方が緩やかに劣化するのは、より優れたロック機構を持つため。 ![[fig10-drtm-kv-throughput.png]] **バッチ済みUD SEND**: batchingはCIBのUD SENDのピークthroughputを80 Mopsから101.6 Mopsへ27%向上させ、DMA帯域が新たなボトルネックになる。1QPのみだとbatchingがコアをNICのPUに縛り付けるため単一コアthroughputはむしろ低下するが、複数QPでこの束縛を外すとbatchingは2〜3.2倍のthroughput向上をもたらす(図11)。 ![[fig11-ud-send-batched.png]] **inbound READ/WRITE**: いずれも初めはNIC処理能力に、その後InfiniBand帯域に律速される。帯域律速へ切り替わるpayloadサイズはCIBで約64バイト、CX3で約256バイト、CXで約128バイト(図12)。 ![[fig12-inbound-read-write-throughput.png]] **header-only最適化**: header-only RECVはCIBでRECVのthroughputを82 Mopsから122 Mopsへ(+49%)向上させ、inbound WRITEと同等の速さにする。header-only SENDは通常のSENDより54%高いthroughputを示す(表5)。 **WQEキャッシュミス**: 最適なwindow sizeはNIC依存で、CX3はN=16、CIBはN=512で最大throughputを得る(図13)。CIBはWRITEに対してキャッシュミスをほぼ起こさないが、READではより多くのNIC処理を要するためミスが発生する。 ![[fig13-wqe-cache-miss-model.png]] **atomic演算**: CX3はZ(独立カウンタ数)に関わらずthroughputが2.7 Mops付近で頭打ち(全atomicを直列化している)。CIBはZを増やすと52 Mopsまで向上する(図14)。Z=1(単一カウンタへの競合)ではいずれも著しく遅く、これがatomicsベースsequencerが50倍遅い直接の原因になっている。 ![[fig14-atomics-throughput.png]] ## 考察 CPU-involvingな設計(RPCベース)とCPU-bypassingな設計(READ直接アクセス)のどちらを選ぶかという一般的な問いに対し、本論文は「最速のPCIeリンクを飽和させるのに必要なCPUコア数はわずか4コアである」ことを示し、CPU-involvingな設計がCPU律速になりにくいことを示唆する。また「RECVはWRITE/READより遅い」という経験則の真因はCQEのDMAであり、header-only/inline RECVでこれを避ければinbound WRITEと同等速度になることを明らかにした。atomic演算はNIC内部ロックの粒度がSRAM制約により小さく、高い競合下では極めて低いthroughputしか出せないため、sequencerのような高頻度更新用途には不向きである。batchingは、Doorbellが単一QP宛にしかまとめられないという制約から、one-to-one接続のRC/UC transportではほとんど有効に働かず、事実上UD(datagram) transport限定の最適化になる。 ## 強み / 弱点・課題 **強み**: PCIeカウンタという標準的なCPU機能だけで、専用アナライザや非公開NICマニュアルなしに定量的なRDMA性能モデルを構築し、オープンソースツールとして公開した点。3世代のNIC・2つの独立したシステム(sequencer、HERD)で提案ガイドラインの実効性を実証している点。 **弱点・課題**: 計測はrequester側のPCIe挙動に限定されており、responder側は先行研究の記述に依拠している。NIC内部のロック機構(4096バケット等)はブラックボックスな観測からの推測であり、将来のNIC世代で挙動が変わりうる。header-only SENDは4バイトという厳しいペイロード制約を持つため、speculationが外れた場合のfallbackパスを別途用意する必要があり、適用できるアプリケーションドメインは限定的である。