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


89

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

apを使用して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

回答:


64

接続の数を本当に制限している設定がようやく見つかりました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、ドキュメントはそれが危険であると示唆しているため、有効にするよりも優れたソリューションのようです。

この構成では、1日中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_WAIT8192個の接続が確立された状態で接続を閉じると思いますが、それは私にはできません。


3
これらのパラメータはどこで設定しますか?
Codevalley

2
@Codevalleyシステムに依存する可能性がありますが、Ubuntuサーバーでは/etc/sysctl.confに移動します
ベンウィリアムズ

24

この点で、/ procファイルシステムが提供するものを本当に見たいと思うでしょう。

その最後のページでは、次の情報が興味を引くかもしれません

  • / proc / sys / net / ipv4 / tcp_max_orphans。何かに接続されていないシステムが保持するソケットの最大数を制御します。これを上げると、孤立ソケットごとに 64kバイトのスワップ不可能なメモリを消費する可能性があります
  • / proc / sys / net / ipv4 / tcp_orphan_retriesは、ソケットが孤立して閉じられるまでの再試行の量を制御します。 そのページには、直接興味のあるWebサーバーに関する特定の注意事項があります...

tcp_max_orphansは興味深いですが、機能していないようです。テスト中に孤立したソケットを測定しようとすると、tcp_max_orphansが8,092である間に11,651個のソケットが表示されます。#netstat --inet -p | grep "localhost:www" | sed -e 's / \ + / / g' | cut -d '' -f 1-4,6-7 | 並べ替える| UNIQ -c 11651 TCP 0 0はlocalhost:WWW TIME_WAIT -
ベン・ウィリアムス

設定tcp_orphan_retriesを見て-アイデアビーイングを、ソケットは速く...「淘汰」されている
エイブリー・ペイン

@Jauder Hoの提案+ tcp_orphan_retriesは、状況に勝つ可能性があるように聞こえます。
エイブリーペイン

3

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


2

以下を設定し、tcp_fin_timeoutを設定してみてください。これにより、TIME_WAITがより早く終了するはずです。

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

ここで注意!大変な経験をしました。「これにより、ロードバランシングとNATでフレームがドロップされる可能性があります。これは、ローカルネットワーク上でのみ通信するサーバーにのみ使用してください。」- wiki.archlinux.org/index.php/Sysctl
ヘンク

@Henk私はtcp_tw_recycleそれが潜在的に危険だと思います。tcp_tw_reuseより安全であり、それらを同時に使用する理由は見当たりません。
ヴラディスラフラストルスニー

2

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

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

ワーカーの設定と、Apache内でのキープアライブタイムアウトの種類、一度に実行している予備サーバーの数、およびこれらの追加プロセスが強制終了される速度に注意してください。


1

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

より多くの接続のトレードオフには一般にメモリ使用量が関係し、分岐プロセスがある場合、CPUを圧倒する多くの子プロセスがあります。


1
tcp_fin_timeoutは、カーネルの再構築以外では変更できないTIME-WAITの有効期限を設定するためではなく、名前が示すようにFINのためです。
アレクサンドル・クリリン

0

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


6
いいえ、そうではありません。リモートアドレスが異なる限り、ローカルポートは一意である必要がないため、さらに開くことができます。さらに、OPはサーバーごとに言い、サーバーごとに1つ以上のアドレスを持つことができます。
MarkR

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.