教養の海を泳ぐ

駆け出しエンジニア

DPDKによるパケット処理高速化イントロ

本記事では、自分が某通信会社研究所のサマーインターンで学んだことをシェアします。

クラウドネイティブ導入への期待

モバイルインフラにも、クラウドネイティブ導入の期待が高まっています。

従来のモバイルインフラでは、高いコストを支払って専用ハードウェアを調達しており、特定のベンダに依存してしまっているという背景がありました。

そこで近年では、NFVを用いた仮想化が導入され、汎用機器を用いたインフラの構築化が進められてきました。

しかし、単なる仮想化だけでは上手く行かず、以下が問題となってきます。

・管理コストの増大(物理リソースに加えて仮想リソースの管理が必要)

・仮想化によるパフォーマンスの低下

・運用が煩雑でスケールしない

そこでクラウドネイティブ技術を用いたオーケストレーションの導入により、これらの問題を解決したいというモチベーションがあるそうです。

とはいえ、クラウドネイティブの導入にも以下のハードルがあり、道のりは長そうです。

・既存機能のマイクロサービスへの分割

・仮想化によるパフォーマンスの低下

・技術が未成熟で変化が激しい

・テレコム独自のCI/CDサイクル設計が必要(普通のWebサービスとは異なる)

・現行のシステムからのシームレスな移行

ここでは、仮想化によるパフォーマンス低下を解決するための技術として、DPDKを紹介します。

なお、ホストマシンのOSとしてはLinuxを前提として話を進めます。

仮想化によるパフォーマンス低下とは?

そもそも、仮想化によるパフォーマンス低下とは何なのでしょうか?

f:id:Ricky_Ban:20201212013637p:plain
出典: [2]

Linuxカーネル+仮想マシンの構成では、NICから届いたパケットはまずカーネルで処理され、そこからユーザー空間のVMに渡されます。すなわち、通常の場合に比べてカーネル空間における処理のレイヤーごとの遅延が乗っかってきます。

大量のパケットを捌くモバイルインフラではこれは致命的であり、パケット処理高速化の必要性があるというわけです。

この問題のアプローチとしては、FPGAやASICによる専用ハードウェアを作成して処理をオフロードさせるという方法もありますが、ハードウェアの設計・実装には時間がかかります。

ソフトウェア的な解決方法として、カーネルモジュールを独自実装するか、高速パケットI/Oライブラリの利用があります。前者は辛いので、後者が採用されることが多いようです。

DPDKについて

DPDKは高速パケットI/Oライブラリの一つで、物理NICとアプリケーションをバイパスし,ユーザー空間からNICをポーリングして制御するものです。

f:id:Ricky_Ban:20201212013714p:plain
出典: [3]

メリットとしては、カーネルでの処理をスキップしてNICとアプリケーションを直接つなぐので、カーネルによる処理のオーバーヘッドを大幅に解消することが期待できます。

一方デメリットとして、以下の点が挙げられます。

・対応NICが限られる

・必要なパケット処理をユーザーが全て実装する必要あり

NICに対して1コアが占有される

DPDKの動作確認がしたかった話

インターンはリモートだったので、GCEインスタンス上で動作確認を試みました。

以下のような検証アーキテクチャを考えました。

f:id:Ricky_Ban:20201212013742p:plain

結論から言えば、上手く動きませんでした...

高速化のベンチマークなど出したかったのですが、GCEの内部構成はブラックボックスな部分が多く、あまり色々触れる感じではありませんでしたね汗

とはいえ、雰囲気だけは掴めました。

以下のように、DPDKの起動によりコアが占有されることは確認できました。(vCPU×4のインスタンス)

f:id:Ricky_Ban:20201212013803p:plain

具体的には、物理NICに触れず仮想NICに対して検証を試みたのですが、

・Promiscuousモードが無効でパケットフォワーディングできない

・アタッチするドライバによってカーネルパニックが起きる

など困難が多かったです(?)

少なくとも、DPDKはパブリッククラウドで使うものじゃないな〜という所感は得られました。

その他の考察としては以下の通りです。

・シングルコアでの性能は高そう、分散処理には疑問

・Hugepage上にバッファを置くので潤沢なメモリが必要

・コアを占有してしまうので、 利用率が低い場合はもったいない

いつか物理サーバーを構築してリベンジしたいです。

参考

[1]「ネットワーク仮想化の技術動向」, KDDI総合研究所, 2019年7月 https://www.soumu.go.jp/main_content/000633422.pdf

[2]「パケット処理の独自実装や高速化手法の比較と実践」, 海老沢・日下部, 2020年1月 https://www.janog.gr.jp/meeting/janog45/program/pktfwd

[3] 「情報畑で捕まえて」DPDK関連記事, 2019年9月18日アクセス https://www.ntt-tx.co.jp/column/DPDK.html