TCP ソケットバッファーを調整する
Environment
- Red Hat Enterprise Linux 4
- Red Hat Enterprise Linux 5
- Red Hat Enterprise Linux 6
Issue
- ソケットバッファーがあふれたためにパケットが紛失しました。
- netstat -s を実行すると、ソケットバッファーが低いためにパケットが紛失したことが報告されました。
Resolution
- TCP ソケットバッファーサイズは、以下のファイルで設定されています。
$ cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4194304
$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
- TCP ソケットバッファーは、カーネルレベルで入力および出力パケットを処理する柔軟性のあるバッファーです。現在の負荷に基づいて、サイズを変更します。上のファイルの 3 つの数値は、バッファーのサイズ制限について示しています。最初の数値は、バッファーの最小サイズです。2 番目の数値は、ソケットをオープンしたときのデフォルトサイズで、最後の数値はバッファーの最大サイズになります。
- /etc/sysctl.conf ファイルにパラメータを追加すると、この値を変更することができます。
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 87380 4194304
マシンに十分なメモリーと、1GB または 10GB のネットワークカードがある場合にバッファーのプルーニングが発生すると、最大が 16MB にまで増えます。プロダクション環境に適用する前に、その値を使い同じような負荷でマシンをテストすることが推奨されます。
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
- この変更は、以下のコマンドを実行してロードする必要があります。
# sysctl -p
-
設定するバッファーを大きくしすぎないようにしてください。バッファーが大きすぎると、 パフォーマンスに影響します。これらのバッファーはシステムの物理メモリを使用しています。そのため、それぞれの TCP 接続に対して、メモリ量を取得するソケットバッファーがあります。バッファーが大きすぎると接続が増えるため、メモリが不足する問題が発生します。また、バッファーにデータを読み書きするたびに、ソケット全体が読み込まれます。これにより、送受信する通常のパケットよりもバッファーが大きすぎると、ソケット内のデータ量に関わらずすべてのファイルがアプリケーションによって読み込まれるため、オーバーヘッドが発生します。
-
ソケットのバッファーサイズを増やした場合の影響については、What are the implications of changing socket buffer sizes? を参照してください。
* これらの設定は、バッファーを手動で設定するアプリケーションコール setsockopt(SO_RCVBUF)
によって異なります。
上述の sysctl メモリー設定がスループットの増加を提供しない場合は、 setsockopt(SO_RCVBUF)
コールを増やすか、setsockopt(SO_RCVBUF)
コールをアプリケーションコードから削除することが推奨されます。setsockopt(SO_RCVBUF)
コールを削除すると、カーネルでメモリー値の自動的に調整できるようになります。
Diagnostic Steps
- netstat -s の出力結果から、ソケットバッファーの負荷が高いかどうかを確認することができます。
$ netstat -s | grep socket
1617 packets pruned from receive queue because of socket buffer overrun
798 TCP sockets finished time wait in fast timer
29 delayed acks further delayed because of locked socket
346941 packets collapsed in receive queue due to low socket buffer
-
削られたり、破損したパケットがある場合は、調整が必要になります。
-
アクティビティが少ないサーバーでは、負荷またはメモリーの逼迫に変更が見られない可能性もあります。sysctl を変更すると、数千もの接続が発生していてビジーなサーバーに与える影響が大きくなります。これを踏まえて、テストを行います。
BEFORE CHANGE (On non busy server)
10:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
10:50:01 AM 611988 15515156 96.21 1368 8560820 10050932 62.30 8101972 6045188 4604
11:00:01 AM 224920 15902224 98.61 1284 8917416 10182208 63.11 8204204 6331076 4952
AFTER CHANGE (On non busy server)
10:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
10:53:39 AM 752268 15374876 95.34 1168 8388744 10207324 63.26 8826552 5067064 768
10:53:40 AM 752832 15374312 95.33 1168 8388744 10206940 63.26 8826848 5067064 768
10:53:41 AM 752052 15375092 95.34 1168 8388744 10207068 63.26 8827452 5067064 880
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments