高負荷時にTCPリセットでWebサーバーが接続を切断するのはなぜですか?


10

nginxで小さなVPSを設定しています。私はそれから可能な限り多くのパフォーマンスを絞りたいので、最適化と負荷テストを実験してきました。

Blitz.ioを使用して小さな静的テキストファイルをGETすることで負荷テストを行っています。同時接続数が約2000に達すると、サーバーがTCPリセットを送信しているように見えるという奇妙な問題が発生します。大量ですが、htopを使用すると、サーバーはまだCPU時間とメモリを節約できます。そのため、この問題の原因を突き止めて、さらにプッシュできるかどうかを確認したいと思います。

Ubuntu 14.04 LTS(64ビット)を2GB Linode VPSで実行しています。

このグラフを直接投稿するのに十分な評判がないので、ここにBlitz.ioグラフへのリンクがあります。

ここに画像の説明を入力してください

問題の原因を突き止め、理解するために私が行ったことは次のとおりです。

  • nginx設定値worker_rlimit_nofileは8192に設定されています
  • しているnofileため、両方のハードとソフト制限のために64000に設定rootし、www-dataユーザー(と実行をnginxの何)で/etc/security/limits.conf
  • 問題が発生している兆候はありません/var/log/nginx.d/error.log(通常、ファイル記述子の制限に達している場合、nginxはそのことを示すエラーメッセージを出力します)

  • 私はufwセットアップを持っていますが、レート制限ルールはありません。ufwログは何もブロックされていないことを示しており、同じ結果でufwを無効にしてみました。

  • に表示エラーはありません /var/log/kern.log
  • に表示エラーはありません /var/log/syslog
  • 次の値をに追加し/etc/sysctl.confてロードしましたsysctl -pが、効果はありません。

    net.ipv4.tcp_max_syn_backlog = 1024
    net.core.somaxconn = 1024
    net.core.netdev_max_backlog = 2000
    

何か案は?

編集:私は新しいテストを行い、非常に小さなファイル(3バイトのみ)で3000接続に増加しています。これがBlitz.ioのグラフです。

Blitz.ioグラフ

ここでも、Blitzによると、これらのエラーはすべて「TCP接続リセット」エラーです。

これがLinode帯域幅グラフです。これは5分の平均であるため、ローパスフィルターがかけられている(瞬間的な帯域幅はおそらくはるかに高い)ことに注意してください。

ここに画像の説明を入力してください

CPU:

ここに画像の説明を入力してください

I / O:

ここに画像の説明を入力してください

これhtopがテストの終わり近くです: htop

エラーが発生し始めたときにキャプチャを開始して、別の(ただし、似たような)テストでtcpdumpを使用してトラフィックの一部をキャプチャしました。 sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

誰かがそれを見てみたい場合のファイルは次のとおりです(〜20MB):https ://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing

Wiresharkの帯域幅グラフは次のとおりです。

ここに画像の説明を入力してください (線はすべてのパケット、青いバーはTCPエラーです)

キャプチャーの解釈(および私は専門家ではない)から、TCP RSTフラグはサーバーではなく負荷テストソースから送信されているように見えます。それで、負荷テストサービス側に問題がないと想定した場合、これは、負荷テストサービスとサーバー間の何らかのネットワーク管理またはDDOS緩和の結果であると想定しても安全ですか?

ありがとう!


プロバイダーは何らかのDDoS緩和策を行っていますか?これはテストを妨害する可能性があります。
マイケルハンプトン

@MichaelHampton Linodeがそれをしないと私はかなり確信しています。
EEAA 2015

Linodeコントロールパネルからネットワークグラフを投稿できますか?このテストは実際にどれだけの帯域幅を使用していますか?
EEAA 2015

私はもう少し調査し、元の投稿をより多くの情報で更新しました。また、負荷テストサービスとLinodeの間のネットワークプロバイダーが何も実行していないことを必ずしも意味するわけではありませんが、LinodeでDDOS軽減を行わないことも確認しました。ありがとう!
エリックスワン

1
net.core.netdev_max_backlog2000年までしか設定しない理由はありますか?私が見たいくつかの例では、ギガビット(および10ギガ)接続の場合、桁違いに高くなっています。
Moshe Katz

回答:


1

接続リセットの原因はいくつでもあり得ます。ロードテスターは、接続を開始するための使用可能なエフェメラルポートが不足している可能性があります。途中のデバイス(NATを実行しているファイアウォールなど)は、NATプールを使い果たし、接続のソースポートを提供できない可能性があります。接続制限に達した可能性のあるロードバランサーまたはファイアウォール また、インバウンドトラフィックでソースNATを実行すると、ポートが枯渇する可能性もあります。

両端からのpcapファイルが本当に必要になります。探したいのは、接続の試みが送信されたがサーバーに到達せず、サーバーによってリセットされたように見えるかどうかです。その場合は、線に沿った何かが接続をリセットする必要がありました。NATプールの枯渇は、この種の問題の一般的な原因です。

また、netstat -stはいくつかの追加情報を提供する場合があります。


1

私自身の最近の同様のチューニング経験に基づいて、試してみるべきいくつかのアイデア。参照あり:

あなたはそれが静的テキストファイルだと言います。上流処理が行われている場合に備えて、明らかにドメインソケットはTCポートベースの接続でTCPスループットを向上させます。

https://rtcamp.com/tutorials/php/fpm-sysctl-tweaking/ https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

アップストリーム終端に関係なく:

multi_acceptとtcp_nodelayを有効にします:http ://tweaked.io/guide/nginx/

TCPスロースタートを無効にする:https : //stackoverflow.com/questions/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

TCP輻輳ウィンドウの最適化(initcwnd):http : //www.nateware.com/linux-network-tuning-for-2013.html


1

開いているファイルの最大数を設定するには(それが問題を引き起こしている場合)、「fs.file-max = 64000」を/etc/sysctl.confに追加する必要があります


0

TIME_WAITコマンドnetstat -patunl| grep TIME | wc -lを使用して状態にあるポートの数を確認し、net.ipv4.tcp_tw_reuse1に変更してください。


TIME_WAIT状態にあるポートの数を確認するにはどうすればよいですか?
エリックスワン

netstatまたはを使用しssます。完全なコマンドで回答を更新しました!
fgbreel

テストを再実行し、テストwatch -n 1 'sudo netstat -patunl | grep TIME | wc -l'全体を通して0 を返します。上記で投稿したPCAPファイルの分析に基づいて、負荷テスターとサーバー間のDDOS緩和の結果としてリセットが行われているのは確かですが、誰かがそれを確認できればすばらしいと思います!
エリックスワン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.