Linuxでは、次のコマンドを使用して、システムパケットのデフォルトの受信バッファーサイズ(UDPなど)を指定できます。
sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.rmem_default=<value>
しかし、私が疑問に思うのは、アプリケーション(たとえばc
内)が、実行時にUDPソケットごとの受信バッファーサイズを指定することにより、システムのデフォルトをオーバーライドすることは可能ですか?
デフォルトから値を増やすことはできますが、最大値を超えて増やすことはできません。 setsockopt
を使用して、SO_RCVBUF
オプションを変更します。
int n = 1024 * 1024;
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
// deal with failure, or ignore if you can live with the default size
}
これはポータブルソリューションであることに注意してください。受信バッファーサイズを増やすために任意のPOSIXプラットフォームで動作するはずです。 Linuxには、しばらくの間 autotuning (2.6.7以降、および 妥当な最大バッファーサイズ 2.6.17以降)があり、これは負荷に基づいて受信バッファーサイズを自動的に調整します。自動調整のあるカーネルでは、setsockopt
を使用して受信バッファーサイズを設定しないことをお勧めします。これを行うと、カーネルの自動調整が無効になります。ただし、他のプラットフォームでは、setsockopt
を使用してバッファサイズを調整する必要がある場合があります。