Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

TCP ソケットバッファーを調整する

Solution Verified - Updated -

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.