DPDKとは? ~DPDK入門 第1回~
DPDKはネットワーク処理の高速化に対して力を発揮するアプリケーションの開発キットです。2012年にリリースされ徐々に定着しつつありますが、使い方が特殊なのでその使い方などを中心に解説します。
DPDK入門
- 2018年09月20日公開
はじめに
こんにちは、NTTテクノクロス株式会社の寺尾と申します。私は入社してからネットワーク関連の仕事に従事してきましたが、最近ではlagopus(※1)やSPP(※2)といったオープンソースに関連した業務にも関わっています。これらのソースコードに使われている技術にDPDKがあります。今回はこの技術に関して紹介したいと思います。
DPDKはネットワーク処理の高速化に対して力を発揮するアプリケーションの開発キットです。2012年にリリースされ徐々に定着しつつありますが、使い方が特殊なのでその使い方などを中心に解説します。
※1 lagopus (a high performance software OpenFlow 1.3 switch and router)
http://www.lagopus.org/
※2 SPP (Soft Patch Panel - DPDK resources management framework)
http://git.dpdk.org/apps/spp/
DPDKに関連したブログやYouTube動画も公開しています。こちらもご興味あればご覧ください。
近年のネットワークの利用状況
1990年代でのインターネットの爆発的な普及があり、ネットワークは存在して当然の空気のような存在になっていると思います。近年では、スマホなどの端末の高性能化、小型化が進み、Webやブログ、SNSなど様々な情報がネットワークを介して交換されています。多くの人にとって、ネットワークの存在を意識せずにいろいろなサービスを利用している状況かと思います。
以下の図は、総務省が集計しているデータ(※3)です。ネットワークを介してやり取りされるデータ量が爆発的に増加していることが分かります。
今後もIoT、AI、自動運転、AR、VR等のサービスが広まるにつれてこの傾向は続くことが予想されています(※4)。ネットワーク処理の高速化に関しても、要望が高くなってきていると感じています。
※3 我が国のインターネットにおけるトラヒックの集計・試算
http://www.soumu.go.jp/menu_news/s-news/01kiban04_02000138.html
※4 Cisco Visual Networking Index 全世界の IP トラフィックの成長
https://www.cisco.com/c/ja_jp/solutions/collateral/service-provider/visual-networking-index-vni/complete-white-paper-c11-481360.html
DPDKとは
Data Plane Development Kitの略で、オープンソースとして公開されている高速パケット処理用のライブラリとネットワークドライバのセットです。
通常のアプリケーションはカーネル上で動作します。カーネルの機能は多岐にわたりますが、主な役割はメモリ、CPU、キーボード等のハードウェアの機能を抽象化し、ユーザやアプリケーションに対してハードウェアの操作を簡単にしてくれることにあります。
コンピュータを使う際、メモリやCPUといったハードウェアを直接意識して利用することはないと思います。ユーザやアプリケーションからは様々な要求があるので、カーネルは個々の処理に特化した実装はできません。そのため、特定のアプリケーションのとっては性能面で不利になることがあります。
今回紹介するDPDKは特定のアプリケーションに対してカーネル機能をバイパスした専用機能を提供することで、高速化が実現できる開発キットになります。DPDKで実現する高速化の仕組みを図を用いて説明します。通常のアプリケーションあるいはユーザは、システムコールインタフェースを介して、カーネルの様々な機能を利用しています。DPDKで作成したアプリケーションは、システムコールを介することなく直接ハードウェアを制御できるため、より高速に動作することができます。
上図のようにカーネルの機能を頼ることなく必要最低限の処理を作り組むことで高速化を実現します。
なお、NTTテクノクロスでは5分でわかるDPDKとして以下の動画を公開しています。
DPDKの適用例
一般的なアプリケーション3層モデルでDPDKの適用の例を説明します。例えばゲームコンテンツなどユーザとのやり取り頻度が多く瞬間的なレスポンスが求められた場合、処理の遅延は致命的な問題になります。今回の例だとDBとネットワークの2箇所でボトルネックあった場合を考えます。
適用例1
システム全体のボトルネックを解消するためには、個々のボトルネックポイントをすべて解消する必要があります。DBに関しての改善は様々なソリューションがありますが、ここではインメモリ型DBの導入で解決するとします。ネットワークに関しては、例えば処理するマシンを増やすなどのアプロ―チもありますが、インメモリDBなども含めて増やす必要があるため費用面が気になるかもしれません。
DPDKを適用すればシステム構成を入れ替える必要がなく、アプリケーション側でパケット処理の高速化が実現できます。実際にDPDKをサポートしているネットワークスタックとしては、ANS(※5)があります。
ただしDPDKを導入するにあたりカーネルの機能を使えなくする(バイパスする)ため、アプリケーションに対してカーネルを利用した操作が使えなくなります。この点を理解していないと、様々なトラブルが発生することになりますので注意が必要です。
※5 ANS(Accelerated Network Stack) on DPDK, DPDK native TCP/IP stack.
https://github.com/ansyun/dpdk-ans
適用例2
別の適用例を紹介します。ここでは通信事業社の例を出します。広域な電気通信事業を展開する会社では、全てのエリアに高価な専用ルータを配置していることも多いと思います。これら専用のルータを安価な汎用機で動かすことができれば費用削減ができるかもしれません。
DPDKは専用のアプリケーションが必要となりますが、Linuxで動かせますのでハードウェアとしては数万程度の汎用機でも十分動作可能です。実際にDPDKをサポートしているソフトウェアルータは、lagopus(※1)やCisco CSR(※6)などがあります。
※6 Release Notes for Cisco CSR 1000v Series
https://www.cisco.com/c/en/us/td/docs/routers/csr1000/release/notes/xe-16/csr1000v-rel-notes-xe-16-3.html
DPDKを動かしてみよう
今回はDPDKが梱包しているサンプルグラムの動かし方を解説します。DPDKを動かすにはLinuxが動作するマシンが必要になりますので、実際に試したい人は準備をお願いします。ディストリビューションもいろいろありますが、個々説明することは大変なので、以降の説明は世界的に知名度が高いDebianベースのディストリビューションの一つであるUbuntuのコマンドラインイメージで説明します。
DPDKの環境準備
DPDKは以下のサイトからダウンロードします。
http://core.dpdk.org/download/
$ cd dpdk-<version>
次にDPDKをコンパイルをします。DPDKには便利なセットアップツールが含まれているので、今回はそのやり方を紹介したいと思います。セットアップツールを起動すると以下のような選択プロンプトが表示されます。尚、表示される内容は環境によっても変わりますのでご注意下さい。
$ ./dpdk-setup.sh
------------------------------------------------------------------------------
RTE_SDK exported as /xxx/xxx/dpdk-<version>
------------------------------------------------------------------------------
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
・・・・・
[12] x86_64-native-bsdapp-gcc
[13] x86_64-native-linuxapp-clang
[14] x86_64-native-linuxapp-gcc
[15] x86_64-native-linuxapp-icc
[16] x86_x32-native-linuxapp-gcc
・・・・
----------------------------------------------------------
Step 2: Setup linuxapp environment
----------------------------------------------------------
[17] Insert IGB UIO module
[18] Insert VFIO module
[19] Insert KNI module
[20] Setup hugepage mappings for non-NUMA systems
[21] Setup hugepage mappings for NUMA systems
[22] Display current Ethernet/Crypto device settings
[23] Bind Ethernet/Crypto device to IGB UIO module
[24] Bind Ethernet/Crypto device to VFIO module
[25] Setup VFIO permissions
・・・・
[34] Exit Script
Option:
オプションでコンパイル環境を選択します。通常はフリーのコンパイラであるgccを選択します。32bitカーネルの場合はx86_x32-native-linuxapp-gcc、64bitカーネルの場合はx86_64-native-linuxapp-gccの番号を入力します。
もしカーネルが分からない場合はunameで確認します。例えば以下のようにx86_64が出力されれば、64bitカーネルになります。
Linux XXX xxxxx-generic #160-Ubuntu SMP Wed XXX XX XX:XX:00 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
番号を入力するとコンパイル作業が始まります。この例だと、[14] x86_64-native-linuxapp-gccを選択します。コンパイル作業は5分程度かかり、Build complete と出力されれば成功です。
Configuration done using x86_64-native-linuxapp-gcc
== Build lib
== Build lib/librte_compat
SYMLINK-FILE include/rte_compat.h
・・・・
Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined
------------------------------------------------------------------------------
RTE_TARGET exported as x86_64-native-linuxapp-gcc
------------------------------------------------------------------------------
続けてDPDKアプリケーションで使用するメモリを設定するので、[20] Setup hugepage mappings for non-NUMA systems を選択下さい。確保するメモリのサイズを聞かれますが、ここではNumber of pagesは128を入力下さい。256Mのメモリを確保します。
Removing currently reserved hugepages
Unmounting /mnt/huge and removing directory
Example: to have 128MB of hugepages available in a 2MB huge page system,
enter '64' to reserve 64 * 2MB pages
Number of pages: 128
Reserving hugepages Creating /mnt/huge and mounting as hugetlbfs
以上で環境が整いました。今回はサンプルプログラムを動かすことが目的なので、細かい内容の説明は別の機会にしたいと思います。それではサンプルプログラムを動かします。
Hello Worldの実行
DPDKにはサンプルプログラムが多数梱包されています。今回紹介するHello Worldもそのうちの一つです。このサンプルプログラムは、DPDKで認識しているCPUに対して、helloメッセージともにコア番号を一行ずつ表示するものです。まずはその場所に移動し、makeをします。
$ make
Makefile:33: *** "Please define RTE_SDK environment variable". Stop.
RTE_SDKの環境変数が必要であると、エラーが出力されました。サンプルブルグラムなどを動かす際、DPDKの環境変数をいくつか設定する必要があります。以下の設定を入力下さい。実際の設定値は動かしている環境に依存しますので、注意下さい。
$ export RTE_SDK=`pwd`
$ export RTE_TARGET=x86_64-native-linuxapp-gcc
問題なく設定できましたら、makeが成功します。
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map
ここまで準備できたら、いよいよ実行です。
$ sudo ./helloworld
EAL: Detected 32 lcore(s)
・・・・
hello from core 1
hello from core 2
hello from core 3
・・・・
hello from core 0
私が実行したマシンは32coreを搭載していますので、hello from coreが32行出力されました。今回紹介したサンプルプログラムは、DPDKのドキュメント(※7)としても記載がありますので、詳細はこちらを参照ください。例えば、-l オプションで core番号を指定するやり方が紹介されています。これはDPDKアプリケーションで利用するコア番号を指定する方法になります。例えば、-l 0-3 を指定するとcoreがその番号の範囲に限定されるようになります。
※7 Hello World Sample Application
https://doc.dpdk.org/guides/sample_app_ug/hello_world.html
おわりに
今回はDPDKの紹介を中心に執筆させて頂きました。 今回の内容だけでは特徴であるパケットの高速化処理は体感できないと思います。次回はもう少し掘り下げて執筆したいと考えています。
本記事に関して、あるいはDPDKに関して、何かご意見やご相談がありましたら、是非連絡ください。ご覧頂きありがとうございました。
本件に関するお問い合わせ (2021年追記)
NTTテクノクロス
フューチャーネットワーク事業部
寺尾智之
長年NTTの通信基盤となるネットワーク関連の仕事に従事。 最近では仮想化技術が主流化しており、最新動向を追従する日々。 DPDKに関してはニッチな領域のためか仲間が増えないと感じており、ブログを通した仲間づくりを開始。 横浜生まれだが、巨人ファン。たまに東京ドームに観戦に行くことが楽しみ。