解決策 1:
接続数を実際に制限している設定を最終的に見つけました:net.ipv4.netfilter.ip_conntrack_max
.これは 11,776 に設定されており、何を設定しても tcp_fin_timeout
待たなければならない前にテストで処理できるリクエストの数です より多くの接続が利用可能になるまで数秒。 conntrack
テーブルは、カーネルが接続の状態を追跡するために使用するものです。テーブルがいっぱいになると、カーネルはパケットのドロップを開始し、これをログに出力します:
Jun 2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.
次のステップは、カーネルが TIME_WAIT
内のすべての接続をリサイクルするようにすることでした。 パケットをドロップするのではなく、状態を維持します。 tcp_tw_recycle
をオンにすることで、それを実現できます。 または ip_conntrack_max
を増やす ip_local_port_range
までに接続に使用できるローカル ポートの数よりも大きくなる .カーネルがローカル ポートから離れると、接続のリサイクルが開始されると思います。これはより多くのメモリ追跡接続を使用しますが、 tcp_tw_recycle
をオンにするよりも良い解決策のようです ドキュメントはそれが危険であることをほのめかしているので.
この構成では、一日中 ab を実行でき、接続が不足することはありません:
net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768 61000
tcp_max_orphans
設定はテストに影響を与えませんでした。その理由はわかりません。 TIME_WAIT
で接続を閉じると思います かつては 8192 個あったと述べていますが、私にはそうではありません。
解決策 2:
この点に関して、/proc ファイルシステムが提供するものを実際に見てみたいと思います。
- 米国エネルギー省の TCP チューニング ガイド
- さまざまな OS の TCP チューニング パラメータ:es
- IBM の「オンザフライで Linux を管理する」
- /proc/sys/net/ipv4 に対する LinuxInsight.com のドキュメント
その最後のページで、次のことに興味があるかもしれません:
- /proc/sys/net/ipv4/tcp_max_orphans。システムが保持するソケットの最大数を制御します 何かに付いている。これを上げると、孤立したソケットごとに 64kbyte のスワップ不可能なメモリを消費する可能性があります .
- /proc/sys/net/ipv4/tcp_orphan_retries。ソケットが孤立して閉じられるまでの再試行回数を制御します。 そのページには、直接関心のあるウェブ サーバーに関する特定の注意事項があります...
解決策 3:
それを直接設定する調整可能変数はないと思います。これは、TCP/IP チューニングのカテゴリに分類されます。何を調整できるかを調べるには、'man 7 tcp' を試してください。これらの設定には sysctl ( 'man 8 sysctl' ) が使用されます。 'sysctl -a | grep tcp を実行すると、チューニングできるもののほとんどが表示されますが、すべてが表示されるかどうかはわかりません。また、これが変更されていない限り、TCP/IP ソケットはファイル記述子のように開かれます。したがって、そのリンクのこのセクションと次のセクションが、探しているものかもしれません。
解決策 4:
tcp_fin_timeout の設定と同様に、次の設定を試してください。これにより、TIME_WAIT がより迅速に終了するはずです。
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
解決策 5:
ストック apache(1) は、250 の同時接続のみをサポートするように事前定義されていました。さらに多くの接続が必要な場合は、1 つのヘッダー ファイルを変更して、より多くの同時セッションを許可していました。これが Apache 2 でも当てはまるかどうかはわかりません。
また、Apache を実行するアカウントに対して、より多くのオープン ファイル記述子のロードを許可するオプションを追加する必要があります。これは、前のコメントでは指摘できませんでした。
ワーカーの設定と Apache 自体のキープアライブ タイムアウトの種類、同時に実行している予備のサーバーの数、およびこれらの余分なプロセスが強制終了される速度に注意してください。