PCとpktgenとpgrxで行く遅延測定の旅

Posted on 2013/06/22(Sat) 19:42 in technical

前回 、pktgenのパケット構造は基本的に以下の構造になることが分かった。

pktgen_packet_structure.png

ここに入っているtv_secおよびtv_nsecを、受信側で比較して遅延測定ができたらいいよね?

というのが、この Open Source Traffic Analyzer : http://people.kth.se/~danieltt/pktgen/

はじめに

Open Source Traffic Analyzerは、pktgenと同様にカーネルモジュールを読み込むことで /proc に生えてきて、pktgen形式のパケットに対する統計情報を取得することができる。

現在サポートされているのは、ipv4/ipv6のパケットカウンタ、遅延、ジッタ、パケット間隔。

パッチ形式で配布されているので、必要な機能に対するパッチを当てて利用することになるだろう。

生えてくるのは、 /proc/net/pktgen/pgrx となり、pktgenモジュールの一機能として提供される。(従って、今後「Open Source Traffic Analyzer」についてはpgrxとして記載する)

ただ、メインラインに取り込まれているわけではないので、pgrx対応のpktgenモジュールを作り直すか、既にpgrxパッチが取り込まれているディストリビューションBifrostを使用する必要がある。

Bifrostは、7系以降に pktgen/pgrx が標準搭載されているようなので、そちらが良い人は http://bifrost.slu.se/ からどうぞ。

今回は、前回の環境を継続して使用したいので、Ubuntu 13.04上でコンパイルする方式を採用する。

導入

前回は、Ubuntu 13.04に最初から入っているpktgenモジュールを使用したので特に準備は必要なかったのだが、今回はpktgenモジュールを作り直して使用する。

ダウンロードは、 http://people.kth.se/~danieltt/pktgen/ から、

pgrx_patch_dl.png

net-next v3.6-rc2 (26/09/2012) (include all patches except configuration packet.)をDLすればいい。

とはいえ、面倒なので以下コマンドライン。

# cd ~
# mkdir pktgen_rx
# cd pktgen_rx
# wget http://people.kth.se/~danieltt/pktgen/patches/net-next-v3.6-rc2/pktgen_rx.tar
# tar xf pktgen_rx.tar
# vi Makefile
<snip>
        #KERNELDIR ?= /lib/modules/3.6.0-rc2+/build
        KERNELDIR ?= /lib/modules/$(shell uname -r)/build
<snip>
# apt-get install build-essential ncurses-dev git-core kernel-package
# make

コンパイル通した環境はこれ。

# uname -a
Linux misaka 3.8.0-25-generic #37-Ubuntu SMP Thu Jun 6 20:47:07 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

と、ここまでで新しいpktgenモジュールが出来上がったので、これを読み込ませる。

すでにpktgenモジュールを読み込ませている場合は、いったん外そう。

# rmmod pktgen
# insmod ./pktgen.ko
# ls -l /proc/net/pktgen/
合計 0
-rw------- 1 root root 0  6月 21 19:00 eth4
-rw------- 1 root root 0  6月 21 19:00 kpktgend_0
-rw------- 1 root root 0  6月 21 19:00 kpktgend_1
-rw------- 1 root root 0  6月 21 19:00 kpktgend_2
-rw------- 1 root root 0  6月 21 19:00 kpktgend_3
-rw------- 1 root root 0  6月 21 19:00 pgctrl
-rw------- 1 root root 0  6月 21 19:00 pgrx

と、このようにpgrxが新しく生えてきていることが確認できる。

基本的な使い方

さしあたり、構成は前回同様ループバック構成とする。

つまりこうだ。

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

とりあえず、どういった反応を返すのか見ていく。

最初の状態は何も表示されないので、モードをrxにする。

# cat /proc/net/pktgen/pgrx
Not enabled.
# echo "rx" > /proc/net/pktgen/pgrx
# cat /proc/net/pktgen/pgrx
                RECEPTION STATISTICS
        PER-CPU Stats
CPU 0:  Rx packets: 0    Rx bytes: 0
CPU 1:  Rx packets: 0    Rx bytes: 0
CPU 2:  Rx packets: 0    Rx bytes: 0
CPU 3:  Rx packets: 0    Rx bytes: 0

        Global Statistics
Packets Rx: 0    Bytes Rx: 0

この状態で、とりあえずパケットを投げてみる。

# 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

と、こうなる。

# cat /proc/net/pktgen/pgrx
                RECEPTION STATISTICS
        PER-CPU Stats
CPU 0:  Rx packets: 0    Rx bytes: 0
CPU 1:  Rx packets: 0    Rx bytes: 0
CPU 2:  Rx packets: 10000        Rx bytes: 600000
        Work time 7389 us
        Rate:  1353363pps 649Mb/sec (649614291bps)
CPU 3:  Rx packets: 0    Rx bytes: 0

        Global Statistics
Packets Rx: 10000        Bytes Rx: 600000
        Work time 7389 us
        Rate:  1353363pps 649Mb/sec (649614291bps)

60Byteを10000パケット送信したので、受信側のインタフェースでもそのようになる。

今回は、インタフェースを指定していないが、本来であれば受信インタフェースを指定してpgrxを有効にする。こんな感じ。

# echo "rx eth5" > /proc/net/pktgen/pgrx

ただし、このようにモードを指定した段階で統計情報は自動的にリセットされてしまうので、間違って履歴とか適当に選んでコマンド通すと統計情報が消える。

遅延測定

そもそも、pgrxに用意されたコマンドは、以下の5つしかない。

rx [device]
rx_reset
rx_disable
display [human|script]
statistics [counter|basic|basic6|time]

ここで、statisticsのモードを切り替えることで、遅延測定モードに移行することができる。

ではやってみよう。

# echo "rx eth5" > /proc/net/pktgen/pgrx
# echo "statistics time" > /proc/net/pktgen/pgrx
# cat /proc/net/pktgen/pgrx
                RECEPTION STATISTICS
        PER-CPU Stats
CPU 0:  Rx packets: 0    Rx bytes: 0
CPU 1:  Rx packets: 0    Rx bytes: 0
CPU 2:  Rx packets: 0    Rx bytes: 0
CPU 3:  Rx packets: 0    Rx bytes: 0

        Global Statistics
Packets Rx: 0    Bytes Rx: 0

初期状態では、特に違いはない。

ここで先ほどと同じようにパケットを送信する(コマンドは割愛)。

と、結果はこうなる。

# cat /proc/net/pktgen/pgrx
                RECEPTION STATISTICS
        PER-CPU Stats
CPU 0:  Rx packets: 0    Rx bytes: 0
CPU 1:  Rx packets: 0    Rx bytes: 0
CPU 2:  Rx packets: 0    Rx bytes: 0
CPU 3:  Rx packets: 10000        Rx bytes: 600000
        Work time 7444 us
        Rate:  1343363pps 644Mb/sec (644814615bps)
        Inter-arrival
                Average: 744 ns Variance 12961971 ns2
                Max: 84434 ns Min:: 438 ns
                Samples: 9999
        Jitter
                Average: 576 ns Variance 25649595 ns2
                Max: 83981 ns Min:: 0 ns
                Samples: 9998
        Latency
                Average: 30428 ns Variance 236304851 ns2
                Max: 133618 ns Min:: 5672 ns
                Samples: 10000

        Global Statistics
Packets Rx: 10000        Bytes Rx: 600000
        Work time 7444 us
        Rate:  1343363pps 644Mb/sec (644814615bps)

Inter-arrival、Jitter、Latencyの3種類が取得できていることが確認できる。

間に装置を挟むことで、任意の装置で発生する遅延特性の測定が可能になる。

見た目の変更

とはいえ、今まで見てきたようなpgrxの出力は、見た目には優しいがスクリプト加工する側からするといまいちである。

そこで、見た目変更用のコマンドも用意されている。

先ほどのコマンド結果を残したまま、script向きの出力に変えてみよう。

# echo "display script" > /proc/net/pktgen/pgrx
# cat /proc/net/pktgen/pgrx
0 0 0 0 0 0 0
1 0 0 0 0 0 0
2 0 0 0 0 0 0
3 10000 600000 7444 1343363 644 644814615 744 12961971 84434 438 9999 576 25649595 83981 0 9998 30428 236304851 133618 5672 10000
G 10000 600000 7444 1343363 644 644814615
# echo "display human" > /proc/net/pktgen/pgrx
# cat /proc/net/pktgen/pgrx
                RECEPTION STATISTICS
        PER-CPU Stats
CPU 0:  Rx packets: 0    Rx bytes: 0
CPU 1:  Rx packets: 0    Rx bytes: 0
CPU 2:  Rx packets: 0    Rx bytes: 0
CPU 3:  Rx packets: 10000        Rx bytes: 600000
        Work time 7444 us
        Rate:  1343363pps 644Mb/sec (644814615bps)
        Inter-arrival
                Average: 744 ns Variance 12961971 ns2
                Max: 84434 ns Min:: 438 ns
                Samples: 9999
        Jitter
                Average: 576 ns Variance 25649595 ns2
                Max: 83981 ns Min:: 0 ns
                Samples: 9998
        Latency
                Average: 30428 ns Variance 236304851 ns2
                Max: 133618 ns Min:: 5672 ns
                Samples: 10000

        Global Statistics
Packets Rx: 10000        Bytes Rx: 600000
        Work time 7444 us
        Rate:  1343363pps 644Mb/sec (644814615bps)

これを定期的に取得することで、単位時間当たりの遅延の変化も見ることができるはずだ。

まとめ

  • pktgen/pgrxを使って、統計カウンタの取得ができるよ
  • pktgen/pgrxを使って、パケット間隔/Jitter/遅延の測定ができるよ
  • メインラインマージはまだだから、自分でコンパイルしてね

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