気ままにインフラエンジニア

渋谷で働くインフラエンジニアの備忘録。 TwitterID: @nakashii_

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のポートが別だということに気づくまで結構悩んでしまった…。

参考:10.3.8. Hashlimitマッチ

*1:もちろん、上流ではNW機器によって制限はかかっている。精神衛生上の問題