リモートダイレクトメモリアクセス(Remote Direct Memory Access : RDMA)の紹介
#本記事は、下記ブログの日本語訳(+一部補足)版を原文筆者Dotan Barak*1の了解を得て掲載しています。
Introduction to Remote Direct Memory Access (RDMA) - RDMAmojo
目次
- RDMAとは?
- RDMAの利点
- RDMAをサポートするネットワークプロトコル
- RDMAを使うために複数のプログラムAPIを学ぶ必要がある?
- RDMAをサポートするネットワークプロトコル相互の互換性は?
- RDMAを使うには?(特別なパッケージをダウンロード? OS付属? )
1.RDMAとは?
ダイレクトメモリアクセス(Direct Memory Access (DMA))は、CPUが介在することなく、ホストメモリへ直接アクセスを行うデバイスの機能である。
RDMA (Remote DMA)は、CPUが関与することなくネットワーク越しにリモート計算機上のメモリへアクセスする(すなわち、リモート計算機上のメモリからリードおよびリモート計算機上のメモリへライトする)機能である。
翻訳者補足:データを水にたとえると・・・
TCP/IP : バケツリレーして水を運ぶような方式。バケツの数には限りがあるし、運ぶのに労力が掛かる。
(性能に限界あり、CPU負荷大)
RDMA : 太いホースで繋いで水道の蛇口を開けるような方式。送りたい水(データ)を一気に流し、流し終わったら送り側の蛇口を閉めるだけ。
(帯域をフルに活用、CPU負荷ゼロ(データ転送時))
※FibreChannel等のチャネル系プロトコルとの違いは?
FibreChannel等では最大でも1MB程度のサイズの細切れでバッファ確保/開放を通信ペアで確認しながら送受信。細切れサイズ毎にCPU割り込みやドライバ処理が発生するため、性能には限界がり、CPUも使ってしまう。
一方、RDMAでは、ローカルとリモートの大きなメモリ領域の間で連続的にデータ転送(最大GB単位での連続転送)をすることができる。また、細かいサイズの転送であっても、バッファ確保を通信の都度行う必要がないので(ワンサイドオペレーション(One Side Operation)でのデータ通信が可能)、圧倒的に低いレイテンシと高スループットを実現することができる。
2.RDMAの利点
RDMAを用いることによる主なメリット:
ゼロコピー (Zero-copy)
アプリケーションは、ネットワークソフトウェアスタックを経由することなくデータ転送を行うことができ、データはネットワークレイヤ間のコピー無しでバッファへ送信または受信される。
カーネルバイパス (Kernel Bypass)
アプリケーションは、ユーザ空間から直接データ転送されるため、コンテキストスイッチを行う必要がない(コンテキストスイッチには非常に多くのCPU処理が必要とされるため、コンテキストスイッチを減らすことは性能向上に直結する)。
CPUの介在がない (No CPU Involvement)
アプリケーションは、リモート計算機のCPUを全く使うことなくリモートメモリにアクセスすることができる。リモート計算機は、リモートプロセス(プロセッサ)が介在することなくメモリリードを行うことができる。リモートCPUのキャッシュは、アクセスされたメモリデータで使用されない(したがって、CPUキャッシュを無駄に消費する必要がない)。
メッセージベースのトランザクション (Message Based Transactions)
データはストリームではなく、離散的なメッセージとして処理される。このことにより、アプリケーションは別のストリームを別々のメッセージやトランザクションとして処理する必要がない。
スキャッタ/ギャザー処理のサポート (Scatter/Gather Entries Support)
RDMAは、スキャッタ/ギャザー処理をネイティブサポートしている。すなわち、複数のメモリバッファ(メモリ領域)を読み込んで1つのストリームとして送信したり、1つのストリームから複数のメモリバッファ(メモリ領域)へ書き出したりすることができる。
3.RDMAをサポートするネットワークプロトコル
現時点でRDMAをサポートするネットワークプロトコルの例:
InfiniBand(インフィニバンド)
初めからRDMAをネイティブサポートする新世代のネットワークプロトコルである。新しいテクノロジーのため、このテクノロジーをサポートするNIC(InfiniBand規格ではHCA (Host Channel Adapter)と呼ぶ)とスイッチが必要となる。
RDMA Over Converged Ethernet (RoCE)(アールオーシーイーまたはロッキー)
Ethernet上でRDMA転送を行うことができるネットワークプロトコルである。下位レイヤのネットワークヘッダはEthernetヘッダであり、上位レイヤのネットワークヘッダ(データ部分を含む)はInfiniBandのヘッダである。このプロトコルは、標準的なEthernet環境(スイッチ)でRDMA転送を行うことを可能とする。NICのみが特別なものであり、RoCEをサポートしている必要がある。
Internet Wide Area RDMA Protocol (iWARP)
TCP上でRDMA転送を行うネットワークプロトコルである。InfiniBand (RDMA)とRoCEではサポートされていてiWARPではサポートされていない機能がある。このプロトコルは、標準的なEthernet環境(スイッチ)でRDMA転送を行うことを可能とする。NICのみが特別なものであり、iWARPをサポートしている必要がある(ただし、CPUオフロードが使われる場合)。CPUオフロードを使用しない場合は、全てのiWARPスタックはソフトウェアとして実装可能であるが、RDMAの性能的な長所の大部分は失われてしまう。
4.RDMAを使うために複数のプログラムAPIを学ぶ必要がある?
前章でRDMAをサポートするネットワークプロトコルが複数あることを述べた。そうすると、RDMAを使うにはそれぞれ別のプログラムAPIを習得する必要があるように思えるかもしれないが、答えは「いいえ」(複数のプログラムAPIを学ぶ必要はない)である。幸運なことに、同じAPI(すなわち、verbs)は、上記の全てのRDMA対応のネットワークプロトコルで使用可能である。Liux系ではlibibverbsとKernel verbsであり、WindowsではNetwork Direct (ND)に相当する。
5.RDMAをサポートするネットワークプロトコル相互の互換性は?
RDMAをサポートするネットワークプロトコルは互いに異なるプロトコルであるため、パケットフォーマットが異なり、それら相互に直接メッセージの送受信はできない。何らかのルータやゲートウェイを挟む必要がある。しかしながら、同じコードでRDMAネットワークプロトコル全てをサポートすることができる。全てのRDMAネットワークプロトコルはlibibverbsをサポートするため、ソースコードの再コンパイルさえも不要で同じバイナリを使用することができる。
6.RDMAを使うには?(特別なパッケージをダウンロード? OS付属?)
いくつかのOSでは、Kernel標準でRDMAをサポートしている。例えば、LinuxはRDMAをネイティブサポートしており、Linuxの主要なディストリビューションでRDMAをサポートしている。その他のOSではRDMAサポートを追加するためにある種のパッケージ(OFED等)をダウンロードする必要となる場合がある。
*1:Dotanは当ブログ筆者と同じハイテク企業に勤務しており、当ブログ筆者も本社にて彼の技術講座を受講したことがあります。