PCとpktgenで行くショートパケットワイヤレートの旅

Linuxのカーネルに搭載されたトラフィックジェネレータpktgenの使い方を見ていく

はじめに

pktgenは、Linuxのカーネルに搭載されたトラフィックジェネレータ。
いつぞやからメインラインにカーネルモジュールとして同梱されるようになったので、恐らく2.6.26以降辺りから使えるのではないかと思う。

茶番

1
2
3
4
5
「ねぇ、秒速1,488,095フレームなんだって」
「え、なに?」

「1Gbpsで最小フレームを送信可能なフレームレート。秒速1,488,095フレーム」
「ふーん・・・」

そりゃあ「ふーん・・・」ってなるな?
このフレームレートに到達しなければ1Gbpsを処理できているとは言えない。

従って、1Gbpsを処理できているか試験するために、汎用PCでこのフレームレートに到達する必要がある。 (1,000,000,000 bit = 125MB, 125MB/(60+4+12+8) = 1,488,095として計算)

では本題に入ろう。

使い方

さしあたり、構成はループバック構成とする。
つまりこうだ。

1
2
3
4
                                         eth4
Generator (Ubuntu Server 13.04 amd64) |-------+
                | eth5                        | ↓ 試験トラフィック方向
                +-----------------------------|

最低限、使う上で必要なのはpktgenモジュール入りのLinuxと送信ポート(と、受信ポート)だけなので、読者の皆様のことだ、恐らくその辺りに転がっているであろう。

まずpktgenモジュールを組み込む。

1
# modprobe pktgen
Tip
/proc を直接叩くこともあるので、root権限が必要だ。ここでは最初から最後まで root を使用する。

すると、 /proc/net/pktgen が生えてくるので、ここに設定を放り込む。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 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の最速送信となる。

結果の確認方法は、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 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

とまぁ、こうなる。

試験機としての性能測定とグラフ

未来予想図としては、

1
2
3
4
5
6
7
                                         eth4
Generator (Ubuntu Server 13.04 amd64) |-------+
                | eth5                        | ↓ 試験トラフィック方向
                |                             | Gi0/0
                |                        | Router |
                |                             | Gi1/0
                +-----------------------------+

このようにして、間に挟んだ装置(上図ではRouter)の転送性能やフィルタ性能を測ることになるだろう。
今のうちに、試験機としての性能を測定しておくべきである。
ちなみに、レシピはこんな感じ。

  • DQ77KB
  • Xeon E3-1265L V2
  • DDR3 8GB 1600MHz x 2
  • 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 オプションは古いらしいので使うのはやめよう。

1
Note! max_before_softirq is obsoleted -- Do not use

まとめ

  • 汎用PCでも1Gbpsならワイヤレート送信が可能な試験環境が安価に用意できる
  • pktgenは(多少カプセル化できるけど)ペイロード固定のUDPパケットしか使えないので、機能試験(もうちょっと言うとDDoS的な用途)には使えない

容量用法を守って、楽しくベンチマーク!

参考文献

Hugo で構築されています。
テーマ StackJimmy によって設計されています。