まずはTRexの紹介から。 TRex 1 はソフトウェア実装のトラフィックジェネレータで、 Stateful/Stateless の2モードをサポートしている。 Statelessは状態を持たない対象DUT(Device Under Test)宛に パケット列を生成するためのモードで、 スイッチングやルーティングの性能計測ツールとして利用できる。
TRexは多機能ではあるが、個人的なニーズとしては単純なTCP/IPのパケット列を そのサイズを変えながら生成したいことが多いのでTRexのラッパーとしてautotrex 2 を作ってみた。 autotrexは自動的にベンチマークの実行・集計をするためのもので、 例えば成果物として下記のような図を簡単に生成できる。 ここでは簡単に使い方を記録しておく。
autotrex では trex_cfg.yaml
(TRexの世界でよく使われる設定ファイル)に記載した2つのポートのうち、
1つ目のポートが送信、2つ目のポートが受信を担当する。
送信・受信それぞれのパケット数をカウントし、その誤差がある閾値
(例えば0.01%)以下であるような最大のパケットレート
(Packet Per Second、PPS)を二分探索で求める。
もちろん生成したいパケット列は自分で下記のように自由に設定できる。
私がよく使うものはautotrexリポジトリ同梱されていて 3、
簡単に使えるようになっている。
# tcp_1pkt.py から抜粋
pkt=Ether()/IP(src="16.0.0.1", dst="48.0.0.1") /
TCP(dport=12, sport=1025)/(payload_size*'x')
./run.sh tcp_1pkt.py
のようにパケット列を記載したPythonファイル tcp_1pkt.py
を
引数に与えて run.sh
コマンドを発行すると、自動的にサイズを
変えながらパケット生成が行われる。
一連のベンチマーク実行が完了すると、成果物としてパケットレート、L1・L2のスループットを表すcsvファイルとpngファイルが出力される。
どのようなパケットが生成されるかについては./simulate.sh tcp_1pkt.py
コマンドで
事前に知ることができる。
独自にパケットを生成したい場合には便利かもしれない。
性能が欲しい環境では下記のように trex_cfg.yaml
でCPU情報を設定する。
経験的にmaster_thread_id
、latency_thread_id
、threads
にはユニークなCPUを
割り当てた方が高い性能を得られる。詳しくはドキュメント 4 に説明がある。
platform:
master_thread_id: 0
latency_thread_id: 5
dual_if:
- socket: 0
threads: [1, 2, 3, 4]
以上、個人的に使っているツールの紹介。おしまい。