6.5. システム全体の UDP ソケットバッファーの増加
ソケットバッファーには、カーネルが受信したデータ、または送信する必要があるデータが一時的に保存されます。
- 読み取りソケットバッファーには、カーネルが受信したがアプリケーションがまだ読み取っていないパケットが保持されます。
- 書き込みソケットバッファーには、アプリケーションがバッファーに書き込んだものの、カーネルがまだ IP スタックとネットワークドライバーに渡していないパケットが保持されます。
UDP パケットが大きすぎてバッファーサイズを超えている場合、またはパケットの送受信速度が速すぎる場合、カーネルはデータがバッファーから削除されるまで、新しい受信 UDP パケットをドロップします。この場合、ソケットバッファーを増やすことでパケットロスを防ぐことができます。
バッファーサイズを大きすぎる設定にすると、メモリーが無駄に消費されます。各ソケットはアプリケーションが要求するサイズに設定でき、カーネルはこの値を 2 倍にします。たとえば、アプリケーションが 256 KiB のソケットバッファーサイズを要求し、100 万個のソケットを開く場合、システムは潜在的なソケットバッファースペースとしてのみ 512 GB RAM (512 KiB x 100 万) を必要とします。
前提条件
- かなりの割合で UDP パケットがドロップされました。
手順
/etc/sysctl.d/10-udp-socket-buffers.confファイルを作成し、要件に基づいて最大読み取りバッファーサイズまたは書き込みバッファーサイズ、あるいはその両方を設定します。net.core.rmem_max = 16777216 net.core.wmem_max = 16777216値をバイト単位で指定します。この例の値は、バッファーの最大サイズを 16 MiB に設定します。両方のパラメーターのデフォルト値は
212992バイト (208 KiB) です。/etc/sysctl.d/10-udp-socket-buffers.confファイルから設定をロードします。# sysctl -p /etc/sysctl.d/10-udp-socket-buffers.confより大きなソケットバッファーサイズを使用するようにアプリケーションを設定します。
net.core.rmem_maxおよびnet.core.wmem_maxパラメーターは、アプリケーションのsetsockopt()関数が要求できる最大バッファーサイズを定義します。setsockopt()関数を使用しないようにアプリケーションを設定すると、カーネルはrmem_defaultおよびwmem_defaultパラメーターの値を使用することに注意してください。詳細は、アプリケーションのプログラミング言語のドキュメントを参照してください。アプリケーションの開発者ではない場合は、開発者にお問い合わせください。
- 新しい UDP バッファーサイズを使用するには、アプリケーションを再起動します。
検証
パケットドロップの発生時に使用したものと同じ方法を使用して、パケットドロップの統計情報を監視します。
パケットドロップが依然として発生するが、レートが低い場合は、バッファーサイズをさらに増やします。