iptablesで帯域制限しながらネットワーク負荷をかける
netperfはネットワークの速度を測定するのにいいツールだけど、拠点間なりサービスなりが入っているネットワークで気軽に使って通信が過大になってしまっては怒られると思う。
ので、送信側のiptablesで帯域を制限しながら負荷をかける。*1
今回はiptablesとnetperfを使う場合。
送信側のnetperfのオプション
netperf -H [hostname|ip] -f M -p 12865 -- -P 12866
iptablesのルールに確実に引っ掛けるため、ポートを明示して利用する。
送信側のサーバーに帯域制限のiptablesを設定する
-A OUTPUT -j ACCEPT -p tcp --dport 12866 -m hashlimit --hashlimit 1000/sec --hashlimit-mode dstip --hashlimit-burst 2000 --hashlimit-name netperf-limit -A OUTPUT -j REJECT -p tcp --dport 12866 ... -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
hashlimitはOUTPUTにも指定できる。
あと、IptablesのOUTPUTルールをACCEPTでなくDROPで運用している場合は、今回のルールはESTABLISHEDの上に指定したほうが多分良いと思う。
今回は特定のポートを明示して拒否しているので、REJECTしても大丈夫。
秒間1000パケットの指定だと、1000(p/sec) * 1500(MTU,Bytes) = 1.5MBps ぐらいの速度が出るはず。結果を見てみる。
# netperf -H [hostname|ip] -f M -p 12865 -- -P 12866 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. MBytes/sec 87380 16384 16384 10.57 1.62
だいたいあってる。
参考までに、受信側のサーバーでの結果。
# dstat -Tclnd --epoch--- ----total-cpu-usage---- ---load-avg--- -net/total- -dsk/total- epoch |usr sys idl wai hiq siq| 1m 5m 15m | recv send| read writ 1331206136| 0 0 100 0 0 0| 0 0 0| 779B 713B| 0 0 1331206137| 0 0 100 0 0 0| 0 0 0|3105k 75k| 0 4096B 1331206138| 0 0 100 0 0 0| 0 0 0|1201k 27k| 0 0 1331206139| 0 0 100 0 0 0| 0 0 0|1563k 35k| 0 0 1331206140| 0 0 100 0 0 0| 0 0 0|1384k 32k| 0 0 1331206141| 0 0 100 0 0 0| 0 0 0|1618k 36k| 0 56k 1331206142| 0 0 100 0 0 0| 0 0 0|1565k 35k| 0 0 1331206143| 0 0 100 0 0 0| 0 0 0|1262k 28k| 0 0 1331206144| 0 0 100 0 0 0| 0 0 0|1557k 35k| 0 0 1331206145| 0 0 100 0 0 0| 0 0 0|1380k 30k| 0 0 1331206146| 0 0 100 0 0 0| 0 0 0|1618k 36k| 0 0 1331206147| 0 0 100 0 0 0| 0 0 0|1606k 36k| 0 76k 1331206148| 0 0 100 0 0 0| 0 0 0| 522k 12k| 0 0 1331206149| 0 0 100 0 0 0| 0 0 0| 368B 326B| 0 0
実はData Connectionのポートが別だということに気づくまで結構悩んでしまった…。