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秒間ショートパケットを流し続けた結果がこれ。

pktgen_004

特徴ほか

  • 試験フレームはUDPパケットになる
  • UDPペイロードの先頭には、マジックナンバー、シーケンス番号、パケット生成時刻[sec]、パケット生成時刻[nsec]がそれぞれ4Byte、計16Byte含まれる。
  • VLAN、SVLAN、MPLS、IPSECヘッダの付与
  • IPv4,IPv6サポート
  • ToS、Traffic Classの設定
  • MACアドレス、IPアドレス、ポート番号のインクリメントまたはランダム化
  • 送信キューの分散

例えばMPLSとか、ほらね?

pktgen_005_mpls

あと、もう max_before_softirq オプションは古いらしいので使うのはやめよう。

Note! max_before_softirq is obsoleted -- Do not use

まとめ

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

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