PCとpktgenで行くショートパケットワイヤレートの旅
Posted on 2013/06/20(Thu) 00:41 in technical
冒頭
「ねぇ、秒速1,488,095フレームなんだって」 「え、なに?」 「1Gbpsで最小フレームを送信可能なフレームレート。秒速1,488,095フレーム」 「ふーん・・・」
そりゃあ「ふーん・・・」ってなるな?
このフレームレートに到達しなければ1Gbpsを処理できているとは言えない。
従って、1Gbpsを処理できているか試験するために、汎用PCでこのフレームレートに到達する必要がある。 (1,000,000,000 bit = 125MB, 125MB/(60+4+12+8) = 1,488,095として計算)
では本題に入ろう。
はじめに
pktgenは、Linuxのカーネルに搭載されたトラフィックジェネレータ。
いつぞやからメインラインにカーネルモジュールとして同梱されるようになったので、恐らく2.6.26以降辺りから使えるのではないかと思う。
使い方
さしあたり、構成はループバック構成とする。
つまりこうだ。
eth4 Generator (Ubuntu Server 13.04 amd64) |-------+ | eth5 | ↓ 試験トラフィック方向 +-----------------------------|
最低限、使う上で必要なのはpktgenモジュール入りのLinuxと送信ポート(と、受信ポート)だけなので、読者の皆様のことだ、恐らくその辺りに転がっているであろう。
まずpktgenモジュールを組み込む。
# modprobe pktgen
通報
/proc を直接叩くこともあるので、root権限が必要だ。ここでは最初から最後まで root を使用する。
すると、 /proc/net/pktgen が生えてくるので、ここに設定を放り込む。
# echo "rem_device_all" > /proc/net/pktgen/kpktgend_0 # echo "add_device eth4" > /proc/net/pktgen/kpktgend_0 # echo "count 10000" > /proc/net/pktgen/eth4 # echo "clone_skb 1" > /proc/net/pktgen/eth4 # echo "pkt_size 60" > /proc/net/pktgen/eth4 # echo "delay 0" > /proc/net/pktgen/eth4 # echo "src_min 10.0.0.1" > /proc/net/pktgen/eth4 # echo "src_max 10.0.0.1" > /proc/net/pktgen/eth4 # echo "src_mac 02:00:00:00:00:01" > /proc/net/pktgen/eth4 # echo "dst 10.0.0.2" > /proc/net/pktgen/eth4 # echo "dst_mac 02:00:00:00:00:02" > /proc/net/pktgen/eth4 # echo "start" > /proc/net/pktgen/pgctrl
最後のstartを /proc/net/pktgen/pgctrl に投げつけた時点から送信が開始される。
ちなみに、送信が終わるまでプロンプトは帰ってこない。
この場合、count 10000 なので、10000パケット送信し終えたら終了する。
送信レートはdelayによって決定され、この場合は間隔0の最速送信となる。
結果の確認方法は、
# cat /proc/net/pktgen/eth4 Params: count 10000 min_pkt_size: 60 max_pkt_size: 60 frags: 0 delay: 0 clone_skb: 1 ifname: eth4 flows: 0 flowlen: 0 queue_map_min: 0 queue_map_max: 0 dst_min: 10.0.0.2 dst_max: src_min: src_max: src_mac: 02:00:00:00:00:01 dst_mac: 02:00:00:00:00:02 udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9 src_mac_count: 0 dst_mac_count: 0 Flags: Current: pkts-sofar: 10000 errors: 0 started: 77266096025us stopped: 77266102771us idle: 6us seq_num: 10001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0 cur_saddr: 10.0.0.1 cur_daddr: 10.0.0.2 cur_udp_dst: 9 cur_udp_src: 9 cur_queue_map: 0 flows: 0 Result: OK: 6746(c6740+d6) usec, 10000 (60byte,0frags) 1482237pps 711Mb/sec (711473760bps) errors: 0
とまぁ、こうなる。
試験機としての性能測定とグラフ
未来予想図としては、
eth4 Generator (Ubuntu Server 13.04 amd64) |-------+ | eth5 | ↓ 試験トラフィック方向 | | Gi0/0 | | Router | | | Gi1/0 +-----------------------------+
このようにして、間に挟んだ装置(上図ではRouter)の転送性能やフィルタ性能を測ることになるだろう。
今のうちに、試験機としての性能を測定しておくべきである。
ちなみに、レシピはこんな感じ。
- DQ77KB
- Xeon E3-1265L V2
- DDR3 8GB*2 1600MHz
- I350-T4(Oracle OEM)
- WavyⅡ
適当なスクリプトで180秒間ショートパケットを流し続けた結果がこれ。
特徴ほか
- 試験フレームはUDPパケットになる
- UDPペイロードの先頭には、マジックナンバー、シーケンス番号、パケット生成時刻[sec]、パケット生成時刻[nsec]がそれぞれ4Byte、計16Byte含まれる。
- VLAN、SVLAN、MPLS、IPSECヘッダの付与
- IPv4,IPv6サポート
- ToS、Traffic Classの設定
- MACアドレス、IPアドレス、ポート番号のインクリメントまたはランダム化
- 送信キューの分散
例えばMPLSとか、ほらね?
あと、もう max_before_softirq オプションは古いらしいので使うのはやめよう。
Note! max_before_softirq is obsoleted -- Do not use
まとめ
- 汎用PCでも1Gbpsならワイヤレート送信が可能な試験環境が安価に用意できる
- pktgenは(多少カプセル化できるけど)ペイロード固定のUDPパケットしか使えないので、機能試験(もうちょっと言うとDDoS的な用途)には使えない
容量用法を守って、楽しくベンチマーク!