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によると、これらのエラーはすべて「TCP接続リセット」エラーです。
これがLinode帯域幅グラフです。これは5分の平均であるため、ローパスフィルターがかけられている(瞬間的な帯域幅はおそらくはるかに高い)ことに注意してください。
CPU:
I / O:
これ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緩和の結果であると想定しても安全ですか?
ありがとう!
net.core.netdev_max_backlog
2000年までしか設定しない理由はありますか?私が見たいくつかの例では、ギガビット(および10ギガ)接続の場合、桁違いに高くなっています。