前回の記事 Raspberry Pi で DPDK は使えるか? の続きです。いきなり始めたこの話題ですが、そもそも DPDK とは何でしょうか?Wikipedia の説明が良くまとまっていてわかりやすいです。Data Plane Development Kit の略で、データプレーンを扱うアプリケーションを書くためのライブラリです。
8/19 もうちょっと色々わかったので追記しました。
なんて書いても「は?」と思う人が多いでしょう。DPDK は僕の好きなソフトウェアの一つで、語りだすと止まらないのですが、大雑把に乱暴に一言でいうと「PC をマイコンみたいに動かすためのライブラリ」です。異論がいっぱいきそうだなあ。何が好きかというとそのなりふり構わなさ。使っていると「速さこそ正義、他のことは知らん」「邪魔者はすべからく排除。オペレーティングシステム、お前もだ」「使いやすさ?なんだそれ速いのか?」みたいな声が聞こえてきそうです。
前回の記事で触れましたが、7年ほど前に Raspberry Pi で DPDK を走らせようとして失敗しました。当時は Raspberry Pi のアーキテクチャである arm には非対応でしたけど今は対応されているようです。月日の力はすごい。そういうわけで、今回はきちんと設定さえすれば動くんじゃないでしょうか。前記事は「Hugepage がない」と怒られ、確認したら実際なかった、というところで終わりました。今回は Hugepage を使えるようにするところから始まります。
Hugepage ってなに?というとさらに記事が長くなるし僕もうろ覚えなところを勉強し直さないといけないし、ここではオペレーティングシステムの提供する機能の一つで、これがあるとメモリを高速で使いたいとき有利とだけ書いておきます。DPDK では必須です。Raspberry Pi OS の初期設定では切ってあります。これを使えるようにするにはカーネルの再構築が必要です。もしかしたら Raspberry Pi Imager が提供する別 OS では使えるかもしれませんが今手持ちに予備 micro SD がないので OS の入れ替えはやめときます。
Raspberry Pi OS 向けのカーネル再構築方法の説明ありました
https://www.raspberrypi.com/documentation/computers/linux_kernel.html
Raspberry Pi の界隈はドキュメントが豊富で助かります。
このドキュメントには、カーネルの設定のどこを変えれば Hugepage が使えるようになるかは書かれていないのですが、別の文書をあたってみてわかりました。カーネルの設定は make menuconfig
コマンドを実行して行いますが、File systems -> Pseudo filesystems -> HugeTLB file system support を enable すれば設定されます。
あともう一つ、メモリ管理のモジュールである vfio を加えた方が良いです。vfio については再勉強中なのでまた別の記事で。menuconfig
から Device Drivers -> VFIO Non-Privileged userspace driver framework で設定できます。
あとはインストラクションに従ってカーネルをビルドしてインストールして再起動して。じろ君は猛暑の中、二時間かかった長丁場ビルドを耐え抜きました。えらい
追記:暑さに耐えかねてか、何度かカーネルビルドを繰り返しているうちに SSD が壊れてしまいました。カーネルビルドは大規模でかなりホストに負担をかけるので丈夫な PC を使ってクロスコンパイルしたほうが良いかもしれません。
naoki@jiro:~ $ ls /sys/kernel/mm
hugepages lru_gen swap
Bashカーネルの再構築はうまくいったようです。でも hugepage を使えるようにするにはもう少し設定が必要です。以下は未設定の状態
naoki@jiro:~/workspace/dpdk $ sysctl -a | grep huge
vm.hugetlb_shm_group = 0
vm.nr_hugepages = 0
vm.nr_overcommit_hugepages = 0
Bash次の設定を書き加えます
naoki@jiro:~/workspace/dpdk $ echo 'vm.nr_hugepages = 1732' | sudo tee -a /etc/sysctl.conf
naoki@jiro:~/workspace/dpdk $ sudo sysctl -p
vm.nr_hugepages = 1732
naoki@jiro:~/workspace/dpdk $ sysctl -a | grep huge
vm.hugetlb_shm_group = 0
vm.nr_hugepages = 1732
vm.nr_overcommit_hugepages = 0
BashVFIO を使えるようにするのも設定が必要です。
sudo modprob vfio
grep vfio /etc/modules-load.d/modules.conf || (echo vfio | sudo tee -a /etc/modules-load.d/modules.conf)
Bashさて DPDK のサンプルプログラムを動かしてみましょう。まずは一番単純な helloworld から。まずは root 権限で実行します
naoki@jiro:~/workspace/dpdk $ sudo examples/helloworld/build/helloworld -l 0-3 -n 4
EAL: Detected CPU lcores: 4
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
hello from core 1
hello from core 2
hello from core 3
hello from core 0
Bashおお動いた。root 権限でないユーザで動かすには hugepages への直接アクセスは止める必要があります
naoki@jiro:~/workspace/dpdk $ examples/helloworld/build/helloworld -l 2-3 -n 4 --no-huge
EAL: Detected CPU lcores: 4
EAL: Detected NUMA nodes: 1
EAL: Static memory layout is selected, amount of reserved memory can be adjusted with -m or --socket-mem
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /run/user/1000/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: VFIO support initialized
hello from core 3
hello from core 2
Bashラズパイでこんなモンスターが動くなんて。というわけで、続きます