- PR -

netperfでSendSocketSizeを変更するとき

1
投稿者投稿内容
トム
常連さん
会議室デビュー日: 2005/11/22
投稿数: 32
投稿日時: 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 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-11-24 20:54
引用:

未記入さんの書き込み (2005-11-22 19:16) より:
参照元によると、setsockoptでコール要求したときの二倍の値がgetsockoptで帰ってくるのがわかりました。


私がふだん使っているRHEL3でもそうなりますね。
setsockopt(2)でSO_SNDBUFを16384にした後、getsockopt(2)すると
32768が返ってきます。

引用:

しかし、

netperf -H 192.168.0.1

とdefault値を使うと、SendSocketSizeは16384bytesで、スループットが94Mbpsと表示されるのに、逆にこの値になるように指定してみると、

netperf -H 192.168.0.1 -- -s 8192

SendSocketSizeは16384bytesになりますが、スループットが70Mbps程度に落ち込みます。


症状からすると、デフォルトではケーブルに流すデータのための領域が
16384ある、ってなことになってるのかも。

こんなときは Use the Source, Luke! なのですが、ちらっとカーネルを
見てみると、追っかけるのはちょっと手間になりそうです。

setsockopt()でSNDBUFのサイズを変更するときは、引数として渡した数字の
2倍をskという構造体のメンバsndbufに設定するようになっています。
これはマニュアルに書いてあるとおり。
getsockopt()では同じメンバsndbufを参照している。

となると、デフォルトでソケットを作成したときにどうなるのか、
という話になるわけですが...
socket(2)を発行したときにはskを指すポインタはNULLのまま。
つまりそこでは遅延されて、後で本当に必要になったときにしか
作成されない。じゃあ、その「後」ってどこなんだ、そこで何を
やってるんだ、ということになりますが、そこまでは追いかけてません。
トム
常連さん
会議室デビュー日: 2005/11/22
投稿数: 32
投稿日時: 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 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-12-12 22:21
動作からみると、そんな感じですね。
手元にあるnetperf-2.4.1のソースをちょっとだけ見てみましたが、
よくわかりませんでした。が、「Linuxのgetsockopt()はバグってるので
貰ったパッチを入れて対策したよ」みたいなコメントが入ってます。
トム
常連さん
会議室デビュー日: 2005/11/22
投稿数: 32
投稿日時: 2006-06-08 11:21
ご連絡遅れました。
そうですか,バグがあるかもということですか。。。
そこは気づきませんでした。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)