5.3. システム全体の TCP ソケットバッファーの増加
システム全体の TCP ソケットバッファーには、カーネルが受信したデータ、または送信する必要があるデータが一時的に保存されます。net.ipv4.tcp_rmem (読み取り) と net.ipv4.tcp_wmem (書き込み) の両方のソケットバッファーカーネル設定には、それぞれ最小値、デフォルト値、および最大値の 3 つの設定が含まれています。
バッファーサイズを大きすぎる設定にすると、メモリーが無駄に消費されます。各ソケットはアプリケーションが要求するサイズに設定でき、カーネルはこの値を 2 倍にします。たとえば、アプリケーションが 256 KiB のソケットバッファーサイズを要求し、100 万個のソケットを開く場合、システムは潜在的なソケットバッファースペースとしてのみ最大 512 GB RAM (512 KiB x 100 万) を使用できます。
さらに、最大バッファーサイズの値が大きすぎると、レイテンシーが長くなる可能性があります。
前提条件
- かなりの割合で TCP パケットがドロップされました。
手順
接続の遅延を決定します。たとえば、クライアントからサーバーに ping を実行して、平均ラウンドトリップ時間 (RTT) を測定します。
ping -c 10 server.example.com
# ping -c 10 server.example.com ... --- server.example.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 17.208/17.056/19.333/0.616 msCopy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、レイテンシーは 17 ミリ秒です。
次の式を使用して、チューニングするトラフィックの帯域幅遅延積 (BDP) を計算します。
connection speed in bytes * latency in seconds = BDP in bytes
connection speed in bytes * latency in seconds = BDP in bytesCopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、レイテンシーが 17 ミリ秒の 10 Gbps 接続の BDP を計算するには、次のようにします。
(10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytes
(10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytesCopy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/sysctl.d/10-tcp-socket-buffers.confファイルを作成し、要件に基づいて、最大読み取りバッファーサイズまたは書き込みバッファーサイズ、またはその両方を設定します。net.ipv4.tcp_rmem = 4096 262144 42500000 net.ipv4.tcp_wmem = 4096 262144 42500000
net.ipv4.tcp_rmem = 4096 262144 42500000 net.ipv4.tcp_wmem = 4096 262144 42500000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 値をバイト単位で指定します。環境に最適化された値を特定するには、以下の大体の目安を参考にしてください。
-
デフォルトのバッファーサイズ (2 番目の値): この値をわずかに増やすか、最大でも
524288(512 KiB) に設定します。デフォルトのバッファーサイズが大きすぎると、バッファーの崩壊が発生し、その結果、遅延が急増する可能性があります。 - 最大バッファーサイズ (3 番目の値): 多くの場合、BDP の 2 倍から 3 倍の値で十分です。
-
デフォルトのバッファーサイズ (2 番目の値): この値をわずかに増やすか、最大でも
/etc/sysctl.d/10-tcp-socket-buffers.confファイルから設定をロードします。sysctl -p /etc/sysctl.d/10-tcp-socket-buffers.conf
# sysctl -p /etc/sysctl.d/10-tcp-socket-buffers.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow net.ipv4.tcp_rmemまたはnet.ipv4.tcp_wmemパラメーターの 2 番目の値を変更した場合は、新しい TCP バッファーサイズを使用するようにアプリケーションを再起動します。3 番目の値のみを変更した場合は、自動チューニングによってこれらの設定が動的に適用されるため、アプリケーションを再起動する必要はありません。
検証
- オプション: iperf3 を使用して TCP スループットをテストします。
パケットドロップが発生したときに使用したのと同じ方法を使用して、パケットドロップ統計を監視します。
パケットドロップが依然として発生するが、レートが低い場合は、バッファーサイズをさらに増やします。