久々のネタは、ネットワークの帯域測定の話 | 鯖管Changelog。--アメブロ支店

鯖管Changelog。--アメブロ支店

主に地方のサーバ管理者の日常と管理記録、トラブルサポート事例、趣味のPC自作に関する情報、ほか雑談などを、気の向いたときに好きなように、勝手気ままに書きなぐるブログです。

主に会社のRedhatLinux9やRHEL/CentOS、その他Solarisなど管理しています。

とある案件で、VPN越しにWebサーバとDBサーバが通信しており、かつそのVPNを通ってNAT越しにインターネット側とも通信するという構成のシステムがありました。

DBへのアクセスと外部とのアクセスが激しくなるとDBへのアクセスがこけたり、外部とのコネクションがうまく張れなくなってデータの送信に失敗したりする現象が出ました。

どうもボトルネックはこのVPNの帯域らしいということになり、じゃあ実際のところこのVPNはどのくらいの帯域があるのか、どの辺で頭打ちするのか、ということを調べたいと思いました。

まず普通にやるのは、測定したいサーバ上にMRTGをインストールしておいて、じゃんじゃんデータを送受信して天井にぶち当たらないかどうかを試すという方法ですが、これがなかなか「本当にこれが天井なのか」が良くわからなくて困ります。また本当に帯域を埋めてしまうようなトラフィックを流すと他のサービスにも悪影響が出てしまいますのであまり激しいことはできません。

次にiperfとかのベンチマークソフトをデータをやり取りする双方のマシンに入れて測定する方法ですが、測定するもう片方が別事業者のサーバだったりするので、勝手にソフトウェアをインストールすることができず、これもアウト。

で、たまたまニュースサイトを見ていて思い出したのです。
「NEC、1秒以内で3GやLTEの通信速度を推定する技術を開発」
サイズを変えたパケットを順次送り出して、パケットの遅延から帯域を推定する方法

これって、確か昔似た手法で帯域を推定するツールが存在してなかったか…たしかpathcharって名前じゃなかったか。と思い、検索してみるとありました。
ftp://ftp.ee.lbl.gov/pathchar
で、さらに調べてみると、そのpathcharのchildということでpcharというのが存在しているようです。
pchar: A Tool for Measuring Internet Path Characteristics
どういうことをやっているかというと、この辺にスライドがあります。

実際にtar.gzを拾ってきて、懐かしのconfigure;makeしますと、pcharという実行可能ファイルができます。

そのままおもむろに pchar (相手のIP)してもいいのですが、1hopあたり32回もループをまわすそうなので、結果が出てくるまでにとんでもない時間がかかります。また表示もほとんどされないので、ちゃんと測定が進んでいるのか心配になります。

ということで、以下のような感じで実行します。

$ su
# ./pchar -r 1 -p ipv4icmp -v (相手のIP)

するとこんな結果が表示されます。

pchar to 10.255.2.254 (10.255.2.254) using ICMP/IPv4 (raw sockets)
Using raw socket input
Packet size increments from 32 to 1500 by 32
46 test(s) per repetition
1 repetition(s) per hop
0: 10.255.2.231 (xxxxxxxxx)
Partial loss: 0 / 46 (0%)
Partial char: rtt = 0.654754 ms, (b = 0.000042 ms/B), r2 = 0.189663
stddev rtt = 0.019796, stddev b = 0.000013
Partial queueing: avg = 0.000000 ms (0 bytes)
Hop char: rtt = 0.654754 ms, bw = 189393.863351 Kbps
Hop queueing: avg = 0.000000 ms (0 bytes)
1: 10.255.2.254 (10.255.2.254)
Path length: 1 hops
Path char: rtt = 0.654754 ms r2 = 0.189663
Path bottleneck: 189393.863351 Kbps
Path pipe: 15500 bytes
Path queueing: average = 0.000000 ms (0 bytes)
Start time: Tue Aug 13 17:14:01 2013
End time: Tue Aug 13 17:14:12 2013

赤字で示したところに、指定したホストとの間の経路(path)のボトルネックがどのくらいの帯域なのか表示されるという寸法です。

もちろんもっと精度よく測定するなら試行回数を増やしてあげる必要がありますが、それ相応に測定時間がかかるようになります。(pchar -r 10 とか)

数回測定してみましたが、ざっと測定したいなら-r 1でもそんなに大きな測定値のばらつきはない感じがしました。しかも実際に帯域を埋め尽くすようなデータを流すわけではないので、回線にも優しいと思われます。MRTGで見てた感じでは数百kbpsほどのトラフィックで済んでいるようです。

ということで、帯域測定の参考値として使ってみてもよいかも。