DPDK実験環境を
組んでみた話
Dec 29, 2013
Masaru OKI (@masaru0714)
Intel DPDKすごい!
● Data Plane Development Kit
● Linux用パケット処理ソフトウェアライブラリ
● 10GbE short packetでwire rate出る (Xeonで)
● packetはkernelをすっとばしてuserlandで処理
● BSDライセンスで配布されている
もうなにも怖くない!
自宅でいじくりまわしてみたい
でも
● DPDKはIntel NICじゃないと動かない
○ 3rd partyのドライバ(6WINDとか)は有償だったりして
● VMware上じゃ面白くない
だったら、
新しく組むしかないじゃない!
あなたも! わたしも!
気になるあの製品
Atom C2758
● サーバー向け8コア Atom (Rangeley) SoC
● Intel QAT (Quick Assist Technology)搭載
● ファンレス可能、TDP20W
こいつを載せたマザーボードが秋葉原にある!
SUPERMICRO A1SRi-2758F-O 51,680円
A1SRi-2758F-Oすごい!
● Mini-ITX form factor, fanless
● オンボード 4x Intel GbE
● SO-DIMMスロット4本、最大32GB (DDR3L)
● シリアルポートあり、BIOSリダイレクト可能
● IPMI搭載
お小遣いを握り締めて秋葉原へGO!
買おうとしてみた
● Intel NUCと同じくDDR3Lじゃないとだめらしい
● DDR3L SO-DIMMを安いところで買ってみる
● そしていざ、パソコンハウス東映へ!
● 「このマザーボードいただけますか」
ECC必須(買ったメモリ使えない orz)
メモリの在庫が切れていた orz
結果
● いったん購入回避。
● 買い損ねて、微妙な気分でアキバをうろうろ。
● Miix 2.8 64GBモデル在庫あり……だと……
Miix 2.8買いました(46,800円)
lenovoの8インチWindows8.1タブレット
DPDKまったく関係なし。提督
もとい、結果
● 翌週、入荷したメモリと一緒に買いました。
● SSDも別途購入。
● ビデオはオンボードだし、なくてもいい。
● 円盤系はあまってるのを一時的につける。
ここからが本番です
IPMIViewすごい!
● SUPREMICROのサイトから拾える管理ソフト
● Javaで書かれていてWin,Mac,Linuxで動く
● マザボのIPMI用RJ45をLANにつないで制御
● 電源ON/OFF、リセット、温度監視もできる
● ビデオコンソールをLANにリダイレクトできる
もうなにも怖くない!! (7枚ぶり2回目)
IPMIView動作画面の例
● センサー画面。
● 1分で自動更新。
● 手動更新可。
電圧センサ
温度センサ
組み立てて起動
● メモリ挿して、電源つなぎ、IPMI LANつなぎ
● お試しでNetBSD入りUSBメモリぶっ挿して
● これだけでいいのかな?
● IPMIViewから電源オン
起動した!
起動したけど
NetBSDはどうだったのか
● ddbに落としてdmesgを確認したところ
● 起動したストレージが見えてない
● ブートできなかったのは当たり前か
● SATA SSDに入れれば動きそうな気配
とりあえずNetBSDはあとまわし。
あらためて、組み立てと起動
● 電源を切って、SSDをつなぐ。
● デスクトップ用DVDドライブをつなぐ。
● 電源オンしてF2でブートデバイス調整して。
● CentOSはいろいろ面倒なのでUbuntuで。
● Ubuntu 12.04 LTSのメディアをブートさせて。
Ethernetが見えないとか不気味なメッセージ。
Ubuntu 13.10を使う
● 調べる時間を惜しんで、最新バージョンを使う。
● あっさり起動。あっさりインストール完了。
● Ubuntu 13.10、日本語入力腐ってるとか?
○ 日本語入力することはないだろうし、いいや。
● IPMIViewがASCIIキーボード前提らしい。
○ 中カッコやバッククオートの入力でハマる。
JISキーボードの人は気をつけましょう。
DPDK入れてみる
Intelのサイトから入手。unzipで展開。
cd DPDK-1.5.2; ./tools/setup でメニュー選択。
3. 64bit版をgccでコンパイル
5. PMD(DPDK用NICドライバ)の組み込み
6. KNI(DPDK用tapドライバ)の組み込み
7. hugepagesの確保
9. DPDKで使うNICの選択
hugepages?
● 仮想記憶はページ単位で管理。1ページ4KB。
● 割当なしのアドレスにアクセスすると例外発生。
● 例外処理の中でページを割り当て処理続行。
● これをオンデマンドページングという。
hugepagesは2MB/pageや1GB/page
オンデマンドページングの回数を減らし速度向上
hugepagesの設定
● DPDKで使う前に、下準備の設定が必要
● カーネルでサポートしていること
○ Ubuntuは標準カーネルでサポート、作業不要
● 起動前に領域が予約されていること
○ GRUBの設定を編集して起動パラメータを追加
編集したら再起動が必要。
GRUBでhugepages領域予約
● /etc/default/grubをテキストエディタで編集
GRUB_CMDLINE_LINUX=”hugepages=1024”
上記は「2MBページを1024ページ予約」
● 編集後 sudo update-grub を実行し再起動。
● あらためてDPDKのsetup.shで7を選び1024。
○ 2socketのときは7じゃなく8を選ぶ。
DPDK利用準備完了!
DPDKサンプルアプリいろいろ
examplesにいろいろ置いてあります
● l2fwd: L2転送のサンプル
● l3fwd: L3転送のサンプル(arpはstatic)
● load_balancer: 負荷分散のサンプル
などなど。さて、どれを試すかな。
あっ。
相手(対向)がいない!
対向マシンを考える
● さすがに同じのもう一枚はちょっとなあ。
● トラフィックジェネレータ的に使えるのを想定。
● Dual GbE、小さくまとめたいのでMini-ITXで。
● 候補
○ N70E-DR V2 16,680円
○ GA-C1037UN-EU 10,980円くらい
ケースも買うぜ!
製品の選択
● GIGABYTE安いしDIMMのほうがいいかな。
● CPUのスペック一段下げたら1万円切るしな。
● と思ったらオンボードNICがRealtek……
● DPDK動かしたいのでN70E-DR V2に決定。
危うくまた散財するところだった。
N70E-DR V2
● オンボード Celeron 1037U
○ IvyBridge 1.8GHz, 2コア, GPU内蔵
● SO-DIMMスロット1本
○ Atom板で使えなかったメモリの再利用
● Intel 82574 Gigabit Ethernet Controller x2
● 元々はNAS用の板らしい
Atom板を買った翌日、東映さんで買いました。
その他買ったもの
● Mini-ITXケース
○ IN WIN BQ656
● 8インチサイズ液晶モニター
○ CENTURY LCD-8000VH
● Low Profile PCIeなIntel NIC
● 爪の折れないLANケーブルを数本
USBキーボードはあるし、マウスもあるはず。
対向機の組み立て
● 紙の説明書が説明少なくて悩む。
● ケースがスリムすぎてNICささらない(誤算)。
○ ひとまずあきらめ。NIC散財か……orz
● ケースのSATA電源コネクタ1つ。
○ 臨時でつなぐDVDドライブの電源どうしよう。
○ 過去散財した、USB接続DVDドライブを発掘して接続。
結果オーライ。散財は未来につながった!
OS入れて、DPDK入れて
● 最初からUbuntu 13.10を入れる。
○ sshdは sudo apt-get install openssh-server
● DPDKも入れる。hugepagesも設定して。
● Pktgen-DPDKも入れる。
○ Atom機にも入れるか。
○ Atom機で2ポートを直接つなげば限界速度わかる?
○ ってことはつまり
対向機の出番はまだよ! orz
とりあえずAtom機でPktgen
● DPDKからは0~2の3ポートが見える。
● Port0とPort1を結線してみた。
IPMI用LAN
通信用eth0
Port0
Port1
Pktgen-DPDK動かし方
● sudo ./app/build/pktgen パラメータ
● パラメータ
○ -cff
■ Core0~7を使用する
○ -n2 -- -p 0xe
■ -pはPortを3つ(eth1~3)利用する指定
○ -m ’[1-3:4-7].[0-2:0-2]’
■ Port0~2受信にCore1~3を使う
■ Port0~2送信にCore4~7を使う
Atom機でPktgen結果
● start 0あるいはstart 0,1を実行
● リアルタイム表示の結果
測定種別
Port0 Port1 Total
送信 受信 送信 受信 送信 受信
P0→P1
単方向
1000Mbps
1488200pps
- - 976Mbps
1452641pps
1000Mbps
1488200pps
976Mbps
1452641pps
P0←→P1
両方向
1000Mbps
1488203pps
955Mbps
1422553pps
1000Mbps
1488203pps
972Mbps
1447173pps
2000Mbps
2976406pps
1928Mbps
2869726pps
パラメータを変えて試してみる
● -m ’[1-3:4-6].[0-2:0-2]’
● Core7を使わない設定
測定種別
Port0 Port1 Total
送信 受信 送信 受信 送信 受信
P0→P1
単方向
900Mbps
1340008pps
- - 857Mbps
1275961pps
900Mbps
1340008pps
857Mbps
1275961pps
P0←→P1
両方向
900Mbps
1340005pps
872Mbps
1298955pps
900Mbps
1340003pps
868Mbps
1292383pps
1800Mbps
2680008pps
1741Mbps
2591338pps
パラメータを変える その2
● -m ’1.[0-2]’ Core1だけで送受信すべて処理
● 結果: ぴったり99Mbpsで頭打ち(なぜ!?)
● Pktgenのバグか? 性能限界か?
測定種別
Port0 Port1 Total
送信 受信 送信 受信 送信 受信
P0→P1
単方向
99Mbps
148768pps
- - 99Mbps
148784pps
99Mbps
148768pps
99Mbps
148784pps
P0←→P1
両方向
99Mbps
148784pps
99Mbps
148784pps
99Mbps
148784pps
99Mbps
148784pps
199Mbps
297568pps
199Mbps
297568pps
対向用Celeron機で試してみた
● Celeron機はDual Core。
● Core0は制御用としてキープする必要がある。
● よって転送にはCore1のみを使う。
● いやな予感。
● 結果
100Mbpsしか出ませんでしたぁっ!!
どうしてくれよう
このままではAtom機をいじめられない。
とりうる選択肢を考えてみた。
1. Pktgen 100Mbps頭打ちの謎を解く。
2. 自分で送受信プログラムを書く。(同じかも)
3. netmap, PF_RINGなど別実装を試す。
4. 違うハードを用意する。(散財)
5. いじめかっこ悪い。やめる。(完全敗北)
まとめ
● サーバー用マザーボードとIPMIViewすごい。
● AtomでGbE wire rateをほぼ出せた。
● Pktgenは若干怪しい。(たまにバグでこけるし)
● Celeron機は、散財に終わる可能性が……
それはさておき、
DPDKいじり楽しいですー!(コード書けよ)
謝辞
● 本当いろいろ置いてくださっている
パソコンハウス東映さんに感謝!
● マザボの在庫状況を電話してくれた
@gussunoyoyoさんに感謝!
● だらだらと書いたスライドを読んでいただいた
皆様にも感謝!
ありがとうございました!
おまけ: Etherを増やす
● Celeron機はDual GbE。
● 両方をDPDKで使うと通常の通信ができない。
● 買ってきたケースに入れるとNICがささらない。
● でも大きいケースはいやだー。
● あ。
ライザーカードみたく横向きにできれば!
おまけ: Etherを増やす 2
買ってきた。
またしても東映さんにて。
おまけ: Etherを増やす 3
● 無理やり押し込んでみた。
● バックパネルはなしで。
● ケースの蓋は無事閉まった。
● Ubuntuでeth2として認識。
結果: 勝利!
おしまい。

Dpdk環境の話