パケットジェネレータ
ipgenから見るnetmap
@furandon_pig
第35回「ネットワーク パケットを読む会(仮)」
自己紹介
★ Twitter ID: @furandon_pig
★ 家ではNetBSDを使っています
★ 興味ドリブンで勉強会開催しています
★SQL実践入門 読書会
http://sqljissen.connpass.com/
★ Live2Dで遊ぶ会
https://enjoying-live2d.doorkeeper.jp/
今日の発表内容
★パケットジェネレータipgenの
紹介、動作デモ
★netmap機能の概要紹介
iij/ipgen
★Interactive Packet Generator
★https://github.com/iij/ipgen
★パケットジェネレータ
★ベンチマーク,パフォーマンス
測定を主目的とするツール
★FreeBSDで動作する
★10.3-RELEASEで試してみた
測定環境の例
★iij/ipgenを試してみる
★http://qiita.com/furandon_pig/items/ffc6aa43c8bb1e699df0
em1
172.16.0.59
wm1
172.16.0.58
em2
172.16.1.159
wm2
172.16.1.158
pakeana01
(FreeBSD)
pakeana02
(NetBSD)
リモートログイン用
ネットワーク
ipgenで
パケット送出
ipgenコマンド
★T(Tx;送出)とR(Rx;受信)を指定しコマンドを
実行する
★実行後はCLI(TUI)からパケット送受信の
制御、流量設定が可能
★Webインタフェースからも制御可能
★デフォルトでは14.88Mbpsでパケット送出
★高速パケットI/O、”netmap”を使用
$ sudo ipgen -Tem1,172.16.0.58,172.16.0.59/24 
-Rem2,172.16.1.158,172.16.1.159/24
測定例
測定例
ipgen環境の構築
★FreeBSD-10.3-RELEASEの例
★カーネル再構築
★netmap機能を使用するため
★ipgenビルド
★対向側(NetBSDの場合)
# sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
カーネル再構築(1/2)
$ mkdir -p ~/work/pakeana
$ cd ~/work/pakeana
$ curl -O http://ftp.jaist.ac.jp/pub/FreeBSD/releases/amd64/10.3-RELEASE/src.txz
$ tar Jxvf src.txz -C .
$ cd usr/src/sys/amd64/conf/
$ cp -p GENERIC PAKEANA01
$ vi PAKEANA01
...
$ diff -ur GENERIC PAKEANA01
--- GENERIC 2016-03-25 10:09:25.000000000 +0900
+++ PAKEANA01 2016-04-20 00:41:01.631701000 +0900
@@ -364,3 +364,5 @@
# VMware support
device vmx # VMware VMXNET3 Ethernet
+
+device netmap
カーネル再構築(2/2)
$ config PAKEANA01
Kernel build directory is ../compile/PAKEANA01
Don't forget to do ``make cleandepend && make depend''
$ cd ../compile/PAKEANA01/
$ make cleandepend
$ make depend
$ make
$ sudo make install
$ #netmap機能が有効になっていることを確認する
$ sysctl -a | grep device | grep netmap
device netmap
ipgenのビルド
$ pkg search libevent2
libevent2-2.0.22_1 API for executing callback functions on
events or timeouts
$ sudo pkg install libevent2-2.0.22_1
$ git clone https://github.com/iij/ipgen.git
$ cd ipgen
$ make depend
$ sudo make install
$ which ipgen
/usr/local/bin/ipgen
$ man ipgen #マニュアルはまだない…
No manual entry for ipgen
netmap(1/2)
★netmap(4)
★netmap
★高速パケット転送フレームワーク
★VALE
★仮想ローカルEthernet
★netmap pipes
★パケット転送チャネル用共有メモリ
netmap(2/2)
★高速パケット転送フレームワーク
★ラインレートに近い速度で送受信したい
★高ルータ、トラフィックモニタ、
ファイアウォール…
★一般的なOSでMppsの送受信を可能にしたい
★HWについても汎用的なものを使用
★カスタムHWやアプリケーションの変更も不要
★カーネル・ユーザランドでのパケット処理を
工夫することで、高速パケット転送を実現
netmap API(1/2)
★netmapへのアクセス
★open(“/dev/netmap")でファイル
ディスクリプタ取得
★ioctl(fd, NIOCREG, arg)でインタフェースを
netmap modeにする
★mmap(..., fd, 0)でバッファとリングをマップする
★パケット送信
★ioctl(fd, NIOCTXSYNC)でパケットをキューイング
★パケット受信
★ioctl(fd,NIOCRXSYNC)でパケットを受信
netmap API(2/2)
★ioctl(fd, NIOC*SYNC)は
ノンブロッキング動作
★poll(),select()を除き、
(送受信可能なパケット)>0を返す
★netmap modeはデバイスを占有
する点に注意
高速パケット転送フレームワーク
★netmap,DPDK+Seastar
★C++,Seastar独自APIによる
プログラミングモデル
★既存のアプリケーションは
移植(Seastar対応)が必要
まとめ
★パケットジェネレータipgenの
紹介、インストール手順解説
★netmapの概要紹介
Q&A,補足事項(1/2)
★netmap modeでデバイス占有すると8080番ポートにアクセス
できなくなる?
★*:8080でLISTENしているので、管理用のNICを別途用意する
ことでアクセス可能
★測定環境ではwm0を管理用、wm1,wm2をnetmap(ipgen)で使用
★数万台のクライアントが接続してくる環境を想定したテストに活用
したい。IPアドレスを変化させながらパケット送出は可能か?
★ipgen/gen.c:main()のコメントにコマンド例がある
★以下のように送信元IPアドレスレンジを指定する
$ sudo ipgen 
--tcp -s 58  # TCPパケットを送出、TCPの場合はパケットサイズを58byte以上にする
--saddr 192.168.0.1-192.168.100.250  # 送信元IPアドレスレンジを指定
-Tem1,172.16.0.58 
-Rem2,172.16.1.158,172.16.1.159/24
Q&A,補足事項(2/2)
★バースト転送を平滑化する機構も実装されている
★バースト転送を平滑化する機構も実装されている
★(ただし、現状ではIntelのGbE+IPG制御用のカーネルパッチを
適用した場合のみ利用可能?)
★ipgenに関する、より詳しい情報は(本家の)スライドを参照のこと
★https://github.com/iij/ipgen/wiki/materials/ipgen.pdf
★https://github.com/iij/ipgen/wiki/materials/ipgen_ja.pdf
$ sudo ipgen 
--ipg  # IPGオプションを指定する
-Tem1,172.16.0.58 -Rem2,172.16.1.158
その他-背景写真について-
★背景写真は以下のWebサイトより引用
http://free-photos.gatag.net/2014/09/13/220000.html
★背景写真の著作者情報は以下です
著作者: Pippoloide (改変gatag.net)

パケットジェネレータipgenから見るnetmap