0

Linux(Ubuntu 12.04)とWindows 7の両方でこのコードを呼び出すと、非常に異なる結果が得られます。

DatagramSocket socket = new DatagramSocket(4445);
socket.setReceiveBufferSize(Integer.MAX_VALUE);
System.out.println("SO_RX_BUFFER SET TO:"+socket.getReceiveBufferSize());

Linuxを入手:SO_RX_BUFFER SET TO:131071

Windowsでは次のようになります:SO_RX_BUFFER SET TO:2147483647

なぜオペレーティングシステム間で大幅に異なるのですか?なぜLinuxにとってこんなに小さな価値があるのでしょうか?Linuxのバッファサイズを大きくする方法はありますか?

4

2 に答える 2

2

ここで起こっていることは、ホストオペレーティングシステムの動作が異なることです。

  • Linuxの場合、OSは、アプリケーションに要求できるものに上限を設けています。これに対処するには、OS構成設定を変更する必要があります。これには「root」権限が必要であり、アプリケーションで実行しないでください。

    このページには、Linuxネットワークのチューニングに関する基本的な情報があります。

  • Windowsの場合、OSは制限を設定しないか、(より可能性が高い)OSが課す制限よりも大きい場合、ユーザーが要求したバッファサイズをサイレントに上書きします。


そうは言っても、ここで何をしているのかを考える必要があります。バッファリングされたネットワークパケット(RXおよびTX)は、ほとんどの場合、物理メモリに保持する必要があります。制限を増やすと、OSがそれ自体のためにより多くのRAMページを予約するように強制され、通常のアプリケーションで使用可能なメモリが減少します。

2番目の問題は、アプリケーションが追いつくのが難しいという基本的な問題がある場合、ネットワークバッファリングの量を増やすと有害になる可能性があることです。最悪の場合、アプリケーションは古いパケットを継続的に処理し、新しいパケットは破棄されます。つまり、余分なバッファリングにより、データの損失を(必然的に)排除することなく、レイテンシが悪化します。

于 2012-10-20T00:13:35.817 に答える
0

これは重複しているよう です。SO_RCVBUFの値を変更しても機能しないのはなぜですか。

Linuxには設定ファイルの制限があるようです。

以下を追加します。

net.core.rmem_max = 16777216(または制限を設定したいもの)

/etc/sysctl.confへ

問題を解決しました。

于 2012-10-20T00:02:21.830 に答える