2011-12-01 15 views
5

Linuxカーネルハッカー、write(2)のソケットやファイルへの合理的なバッファサイズは何ですか?それはいくつかのページサイズの倍数であることは明らかですが、それはどれですか?それは問題ですか? 「小さすぎる」と「大きすぎる」とは何ですか?ソケットとファイルの両方の推奨バッファサイズ

+0

何か、それはデフォルトでは送信キューに収まるものですので、 (setsockoptで遊びたいのでない限り) 。 – Damon

+1

@Damon:「何か」が正解であるかどうかはわかりません。少なくとも、バッファは確実に整列されるべきです。 – Cartesius00

+0

ほとんどの人にとって、デフォルトはほとんどの場合有効です(ネットワークスタックを書いている人が完全なばかではないと仮定することは妥当です)。大量のデータ(実際には巨大)を定期的に送信し、待ち時間に厳しい制約がある場合を除き、通常は気にする必要はありません。 "合理的な"サイズのものはどれも、送信バッファにコピーされ、送信されます。それがすべてではない場合、 'write'はあなたが求めているものより少ない量を書きます(その量を返します)。いずれにしても、それはうまく動作します。 – Damon

答えて

7

ピアへのあなたの遅延はあなたが100Mbpsの接続を持っているとしましょう、で、50ミリ秒の遅延、そしてあなたが

100MBps * 0.050 sec/8 = 0.625MB = 625KB 

を計算することができますが、Linux 2.6でのデフォルトのウィンドウサイズが周りでどのように大きなに依存そう2.2MBps(110キロバイト/ 0.050) 、周りにあなたのthroughtを制限する110キロバイトは、修正することができませ128キロバイト未満setsockopt

int ret, sock, buf_size; 
sock = socket(AF_INET, SOCK_STREAM, 0); 
buf_size = 625*1024; 
ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size)); 
ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size));