[サーベイ]zIO: Accelerating IO-Intensive Applications with Transparent Zero-Copy IO

投稿者: | 2023年4月5日

osdi22-stamler.pdf (usenix.org)

論文の要点

zIOはIO Intensiveアプリをターゲットとした透過的なゼロコピーを実現するためのユーザ空間ライブラリ

メモリコピーのシステムコールをインターセプトし、コピー元領域をマーキング。仮想的なメモリ空間である、中間領域にマッピング。メモリコピーはしない。

中間領域にメモリアクセスがあった場合は、コピー元領域にアクセスリダイレクト

zIOはアプリケーションからメモリアクセスをinterceptし、libzioで透過的なゼロコピーを実現。
interceptしたシステムコールのコピー先領域はUnmappedバッファとして管理。ミスアラインしたページ領域や更新があったページのみ新規にメモリ確保する。

技術ポイント

  • メモリ更新のないアプリに注目した点(Reddisなど)
  • メモリコピーのシステムコールをinterceptする点(interceptはPRELOADを使用)
  • 仮想的なメモリ領域である中間メモリをつくることで、メモリ更新があるまではメモリコピーを回避できる点
  • ネットワークのカーネルバイパスLibのTAS、ストレージのカーネルバイパスLibのStrataを使用。カーネルバイパスのIOスタックでは、アプリが指定したプライベート領域とアプリプライベートのバッファ領域間でメモリコピー。
    • データ受信は、TASのソケットデータ転送は内部的にmemcpyを使用し、アプリが指定したメモリ領域とバッファ領域間でメモリコピー。libzioがmemcpyをinterceptして透過的にゼロコピーを実現。
    • データ送信は、アプリプライベート領域からバッファ領域へのメモリコピーをゼロコピー化。
  • カーネルのゼロコピーreceiveでも適用可能。カーネルゼロコピーreceiveではソケット作成時にアプリの確保したreceiveバッファを確保する。recvをinterceptしreceiveバッファからアプリのバッファ領域へのコピーなくせば、ゼロコピーになる。FICLONERANGE IOコントロールを使えばストレージも含めてゼロコピーになる。

先行技術

分類名前内容欠点
Storagemmap
DAX
NWzerocopy send
zerocopy receiveソケット作成時に、受信パケットをユーザ空間のメモリ領域にmapできる。①ページサイズ以上のパケットのみ処理
②パケットサイズやメモリオフセットなどの情報が事前に必要
Arrakas
DPDK Poll Mode Driver
(Kernel bypass)
ユーザ空間ドライバがNICをポーリングし、NICがデータを受信したらユーザ空間のメモリ領域に直接コピー。カーネルのNWスタック機能が使えない。
プロセス間共有ができない。
FreeBSD/Solaris transparent zerocopy

Storage/NWSnedfile/splice/copy_file_range
PASTENICの受信パケットをNVMに直接コピー①アプリが、NWコネクションやバイトストリーム処理が必要
②アプリが、バッファ解放契機を指定
Demikernelユーザ空間のLibOS間(SPDK、DPDK、RDMA)でメモリを共有。

先行研究に比べたすごい点

  • ゼロコピーをPOSIX APIで実現
  • 中間領域を使用することでゼロコピー or 遅延メモリコピーを実現

今後の課題

  • IOサイズが小さい場合、メモリコピーのトラッキングのオーバヘッドが大きいため性能が劣化する
  • ゼロコピーするためにはカーネルバイパスのIOスタックが必要。カーネルの機能が使えない。
  • カーネルのゼロコピーreceiveを大サイズIOの場合のみ適用できないか?

きづき

  • カーネルバイパスのスタックIOでは処理がユーザ空間に閉じるため、ゼロコピーは実現しやすい。逆にカーネルを使う場合はSendfileのように処理をカーネルで閉じさせる必要がある。
  • IOサイズが小さい場合、ゼロコピーのオーバヘッドが問題になりやすい。

研究への反映

  • ストレージではデータコピーがないため、現状のメモリコピーが発生するアーキは非効率。
  • パケット処理・小サイズIOはカーネルでやって、大サイズIOだけ直接転送にしたい。

次読むべき論文

  • カーネルNW/ストレージのクロススタックでゼロコピーを実現する方式
    • Sendfile
    • lxio

ChatPDF

Q1: データ受信時のゼロコピーの従来技術としてどのような技術がある?

A1: このPDFファイルのページ16には、データ受信時のゼロコピーに関するいくつかの従来技術が紹介されています。参考文献[12]では、Jonathan CorbetがZero-copy TCP receiveについて説明しています。また、参考文献[15]では、Michio Hondaらが非揮発性メインメモリ向けのネットワークプログラミングインターフェースであるPASTEを紹介しています。しかし、このPDFファイルには他の従来技術については言及されていません。

Q2: zIOではどのような方法でデータ受信時のゼロコピーを実現している?

A2: このPDFファイルのページ2によると、zIOはアプリケーションが処理するデータの一部のみを変更することが多いことを利用して、IOスタックと標準ライブラリメモリコピー呼び出しに介入して、IOデータを追跡し、不必要なコピーを排除しています。中間データ場所はアンマップされ、zIOはページフォルトを介してアクセスをインターセプトし、データの整合性を維持します。また、データ追跡オーバーヘッドが高い場合にアプリケーションパフォーマンスに影響を与えないようにするために、zIOの追跡ポリシーは、コピーを排除するタイミングをIOごとに決定します。さらに、この論文では、zIOを使用して非揮発性メモリ(NVM)にネットワークからのデータを格納するアプリケーションで楽観的なネットワークレシーバ永続性を実現する方法も示されています。

Q3: zIOではネットワークの受信パケットをどう処理している?

A3: このPDFファイルのページ2によると、zIOはソケット受信バッファをNVMにマッピングし、カーネルバイパスIOを利用することで、ネットワークからのすべてのコピーをアプリケーションを介してストレージに排除するために透過的に使用されます。つまり、zIOはネットワークからの受信パケットを直接NVMに書き込みます。また、この論文では、zIOが楽観的なネットワークレシーバ永続性を実現する方法も示されています。

Q4: このPDFファイルのページ9によると、zIOはカーネルバイパスIOスタックを使用しています。これらのスタックは、アプリケーションと共有ライブラリ呼び出しおよび共有メモリを介して通信するため、システムコールではなくユーザーレベルで透過的に処理できます。この論文では、TAS [18]およびStrata [20]カーネルバイパスネットワークおよびストレージスタックが使用されています。特にStrataは、NVM内のプロセスごとの操作ログを使用してファイル書き込みを永続化するため、zIOにとって適したものです。zIOはStrataのメモリコピーをこのログにインターセプトし、元のバッファがすでにNVMに存在する場合は透過的なコピー排除を提供できます。

Q5: zIOをつかうとどのくらい性能が

A5: このPDFファイルのページ13によると、256KB SETリクエストを使用する構成で評価を行った結果、アプリケーションコピーを排除する場合、zIOは1.7倍の高速化を提供します。さらに、IOスタックAPIコピー排除を追加したzIO+IOは、さらに9%のパフォーマンス向上があります。最後に、zIO+ORPで楽観的なレシーバ永続性を追加すると、バニラカーネルバイパスに比べて2倍の改善が得られます。ただし、これらの結果は特定の環境で得られたものであり、他の環境では異なる可能性があることに注意してくだ

Q6:zIOは小サイズのIOに対しても性能が上がる?

A6: このPDFファイルのページ11によると、zIOは小さいIOサイズに対しても優れたパフォーマンスを発揮します。TASは小さいIOサイズでより良いパフォーマンスを発揮しますが、コピーが含まれる場合、LinuxとTASの両方がパフォーマンスが低下します。大きなIOサイズでは、TASよりもLinuxのスループットが高くなります。ただし、zIOは小さいIOに最適化されており、大きなIOに対応するための必要なバッチ処理を行わないため、大きなIOサイズではLinuxよりも低いスループットを示すことがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です