web-dev-qa-db-ja.com

Linuxサーバーの最大接続数を制限するものは何ですか?

Linuxサーバーで開くことができるソケットの最大数TCPソケットの最大数を制御するカーネルパラメータまたは他の設定はどれですか?より多くの接続を許可することのトレードオフは何ですか?

ab を使用してApacheサーバーの負荷テストを行っているときに、サーバーで開いている接続を最大にするのは非常に簡単であることに気付きました。接続の再利用を許可するabの-kオプションを省略して、約10,000を超えるリクエストを送信すると、Apacheは最初の11,0​​00ほどのリクエストを処理し、その後60秒間停止します。 netstatの出力を見ると、TIME_WAIT状態の11,0​​00接続が示されています。どうやら、これは正常です。 TCPの信頼性の理由 のためにクライアントが接続を完了した後でも、接続はデフォルトで60秒開いたままになります。

これはサーバーをDoSする簡単な方法のようで、通常のチューニングと注意事項は何なのかと思います。

これが私のテスト出力です:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> Apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.Apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

テスト中に実行したnetstatコマンドは次のとおりです。

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab
91
Ben Williams

ようやく、接続数を実際に制限している設定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_maxip_local_port_rangeが接続に使用できるようにしたローカルポートの数よりも大きくなるように増やすことで、これを実現できます。カーネルがローカルポートからなくなると、接続のリサイクルが始まります。これはより多くのメモリ追跡接続を使用しますが、tcp_tw_recycleをオンにするよりも優れた解決策のように思われます。

この構成では、一日中実行でき、接続が不足することはありません。

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の設定はテストに影響を与えませんでした。その理由はわかりません。 8192個になるとTIME_WAIT状態の接続を閉じると思いますが、私にはそれができません。

66
Ben Williams

この点に関して、/ procファイルシステムが何を提供する必要があるかを実際に調べたいと思います。

その最後のページで、次のことに興味があるかもしれません。

  • / proc/sys/net/ipv4/tcp_max_orphans 、システムが保持するソケットの最大数を制御しますnot何かに接続されています。これを上げると、64kbyteものスワップ不可能なメモリを消費する可能性がありますOrphanソケットごと
  • / proc/sys/net/ipv4/tcp_Orphan_retries は、ソケットが孤立して閉じられるまでの再試行回数を制御します。 このページには、あなたに直接関係のあるWebサーバーに関する特定の注記があります...
24
Avery Payne

これを直接設定する調整パラメータはないと思います。これは、TCP/IPチューニングのカテゴリに分類されます。チューニングできるものを見つけるには、「man 7 tcp」を試してください。 sysctl( 'man 8 sysctl')を使用してこれらを設定します。 'sysctl -a | grep tcp 'は、調整できるもののほとんどを表示しますが、それらすべてを表示するかどうかはわかりません。また、これが変更されていない限り、TCP/IPソケットはファイル記述子のように開きます。したがって this であり、そのリンクの次のセクションがあなたが探しているものかもしれません。

3
Kyle Brandt

次の設定とtcp_fin_timeoutの設定を試してください。これにより、TIME_WAITがより早く終了します。

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
2
Jauder Ho

従来のApache(1)は、250の同時接続のみをサポートするように事前定義されていました。それ以上必要な場合は、より多くの同時セッションを許可するように変更するヘッダーファイルが1つありました。これがApache 2でも当てはまるかどうかはわかりません。

また、Apacheを実行するアカウントに対してより多くのオープンファイル記述子のロードを許可するオプションを追加する必要があります-以前のコメントでは指摘できなかったものです。

ワーカーの設定と、Apache自体の内部にあるキープアライブタイムアウトの種類、同時に実行している予備のサーバーの数、およびこれらの余分なプロセスが停止する速度に注意してください。

2
rasjani

TIME_WAIT状態で費やす時間を削減できます(net.ipv4.tcp_fin_timeoutを設定)。 ApacheをYAWSやnginxなどで置き換えることができます。

より多くの接続のトレードオフには、通常、メモリ使用量が含まれます。フォークプロセスがある場合、CPUを圧迫する多くの子プロセスがあります。

1
Devdas

2.4バージョンのApache HTTPサーバーベンチマークツール ab には、-s timeoutオプションがあります。参照ab(Apache Bench)エラー:apr_poll:指定されたタイムアウトの期限が切れました(Windowsでは70007)

このオプションは問題を解決します。

0
Dzwiedziu-nkg

単一のIPアドレスで開くことができるソケットの絶対数は2 ^ 16であり、カーネルではなくTCP/UDPによって定義されます。

0
Jason Tan