- - PR -
netperfでSendSocketSizeを変更するとき
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-22 19:16
netperf -H 192.168.0.1 -- -s 1024
とコマンドをたたいたとき、測定結果のところに表示されるSendSocketSizeは、2024bytesになり、つまり二倍の値になっています。 参照元によると、setsockoptでコール要求したときの二倍の値がgetsockoptで帰ってくるのがわかりました。 しかし、 netperf -H 192.168.0.1 とdefault値を使うと、SendSocketSizeは16384bytesで、スループットが94Mbpsと表示されるのに、逆にこの値になるように指定してみると、 netperf -H 192.168.0.1 -- -s 8192 SendSocketSizeは16384bytesになりますが、スループットが70Mbps程度に落ち込みます。 SendSocketSizeを同じ値にしているのに、スループットが異なるのは何故なんでしょうか? 気になって夜も眠れません。 どなたかご教授お願いします。 [ メッセージ編集済み 編集者: 未記入 編集日時 2005-11-22 19:22 ] | ||||||||
|
投稿日時: 2005-11-24 20:54
私がふだん使っているRHEL3でもそうなりますね。 setsockopt(2)でSO_SNDBUFを16384にした後、getsockopt(2)すると 32768が返ってきます。
症状からすると、デフォルトではケーブルに流すデータのための領域が 16384ある、ってなことになってるのかも。 こんなときは Use the Source, Luke! なのですが、ちらっとカーネルを 見てみると、追っかけるのはちょっと手間になりそうです。 setsockopt()でSNDBUFのサイズを変更するときは、引数として渡した数字の 2倍をskという構造体のメンバsndbufに設定するようになっています。 これはマニュアルに書いてあるとおり。 getsockopt()では同じメンバsndbufを参照している。 となると、デフォルトでソケットを作成したときにどうなるのか、 という話になるわけですが... socket(2)を発行したときにはskを指すポインタはNULLのまま。 つまりそこでは遅延されて、後で本当に必要になったときにしか 作成されない。じゃあ、その「後」ってどこなんだ、そこで何を やってるんだ、ということになりますが、そこまでは追いかけてません。 | ||||||||
|
投稿日時: 2005-11-28 17:11
いろいろ調べているうちに、あることに気づきました。
ソケットバッファサイズを指定しなければ、 netperf -H 192.168.0.1 何かの値がセットされます。(私の環境では16K、スループット94bps) しかし、sysctl変数をみると、ソケットバッファサイズの最大最小値が64Kになっています。 同じく、 netperf -H 192.168.0.1 -- -s 8K このとき、ソケットバッファサイズは16Kと表示され、スループットは77Mbpsでした。 しかし、VPN通信の状態で測定してみると、 netperf -H 192.168.0.1 (ソケットバッファサイズ16K, スループット75Mbps) netperf -H 192.168.0.1 -- -s 16K (ソケットバッファサイズ32K, スループット52Mbps) つまり、デフォルト値だと思って使用していたソケットバッファサイズは、16Kではなかった可能性があるということです。 実際にデフォルトは64Kなのだから、16Kがデフォルトになるのは変です。 実際、16Kがデフォルトだと、VPN通信時の-sオプションをつけた方のスループットは最低75Mbps出なければおかしいです。 結論 何もオプションをつけない状態ではsysctl変数の値がデフォルトで使用されるが、netperfの出力には違う値がセットされる(表示だけで、実行値はあくまでsysctl変数の値)。 -s(-S)オプションでソケットバッファサイズを指定すると、そのまま指定した値が使用される。netperfには2倍の値が表示されるが、実行値はあくまでオプションで指定した値。 setsockoptで指定した値の2倍がセットされるのはlinuxカーネルの仕様であって、unixではそのままの値がセットされるらしい。 どうですかね? [ メッセージ編集済み 編集者: 未記入 編集日時 2005-11-28 17:14 ] | ||||||||
|
投稿日時: 2005-12-12 22:21
動作からみると、そんな感じですね。
手元にあるnetperf-2.4.1のソースをちょっとだけ見てみましたが、 よくわかりませんでした。が、「Linuxのgetsockopt()はバグってるので 貰ったパッチを入れて対策したよ」みたいなコメントが入ってます。 | ||||||||
|
投稿日時: 2006-06-08 11:21
ご連絡遅れました。
そうですか,バグがあるかもということですか。。。 そこは気づきませんでした。ありがとうございました。 |
1