webdevqa.jp.net

高負荷時の502ゲートウェイエラー(nginx / php-fpm)

私は、トラフィックが非常に大きく急増することが多い、かなり忙しいインターネットサイトで働いています。これらのスパイクの間、毎秒数百ページが要求され、これによりランダムな502ゲートウェイエラーが発生します。

Nginx(1.0.10)とPHP-FPMを、16コアCPUと24GBのDDR3 RAMを搭載した4x SAS 15kドライブ(raid10))のマシンで実行します。また、最新のXcacheバージョン:DBは別のマシンにありますが、このマシンの負荷は非常に低く、問題はありません。

通常の負荷ではすべてが完全に実行され、システム負荷は1未満であり、PHP-FPMステータスレポートには一度に10個以上のアクティブなプロセスが表示されることはありません。常に約10GBのRAMが使用可能です。通常の負荷では、マシンは1秒あたり約100ページビューを処理します。

問題は、トラフィックの急増が到着し、マシンから毎秒数百のページビューが要求されたときに発生します。 FPMのステータスレポートには、最大50個のアクティブなプロセスが表示されますが、設定した最大接続数300を下回っています。これらのスパイクの間、Nginxステータスは、通常の平均1000ではなく、最大5000のアクティブな接続を報告します。

OS情報:CentOSリリース5.7(最終)

CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GH(16コア)

php-fpm.conf

daemonize = yes
listen = /tmp/fpm.sock
pm = static
pm.max_children = 300
pm.max_requests = 1000

Rlimit_filesをセットアップしていません。知っている限り、システムのデフォルトを使用する必要があるからです。

fastcgi_params(標準ファイルに追加された値のみ)

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

fastcgi_pass            unix:/tmp/fpm.sock;

nginx.conf

worker_processes        8;
worker_connections      16384;
sendfile                on;
tcp_nopush              on;
keepalive_timeout       4;

Nginxは、Unixソケットを介してFPMに接続します。

sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.eth0.rp_filter=1
net.ipv4.conf.lo.rp_filter=1
net.ipv4.ip_conntrack_max = 100000

limits.conf

* soft nofile 65536
* hard nofile 65536

これらは、次のコマンドの結果です。

ulimit -n
65536

ulimit -Sn
65536

ulimit -Hn
65536

cat /proc/sys/fs/file-max
2390143

質問: PHP-FPMの接続が不足していない場合、負荷はまだ低く、多くのRAMが利用可能です。これらのランダム化の原因となっている可能性のあるボトルネック高トラフィック時の502ゲートウェイエラー?

注:デフォルトでは、このマシンのulimitは1024でした。65536に変更したため、マシンを完全にリブートしていません。実稼働マシンであり、ダウンタイムが長すぎるためです。

43
Mr.Boon

これで修正されるはずです...

あなたが持っている:fastcgi_buffers 4 256k;

次のように変更しますfastcgi_buffers 256 16k; //合計4096k

また、fastcgi_max_temp_file_sizeを設定します。これにより、応答がfastcgiバッファーを超え始めた場合にディスクへのバッファーが無効になります。

24
Timothy Perez

Unixソケットはデフォルトで128接続を受け入れます。この行を/etc/sysctl.confに入れるとよいでしょう

net.core.somaxconn = 4096
21
kait

場合によっては役に立たない-ソケットの代わりに通常のポートバインドを使用します。300+のソケットは新しいリクエストをブロックし、nginxに502を表示させるためです。

1
Misiek

@氏。ブーン

8コア14 GBのRAMがあります。しかし、システムは非常に頻繁にゲートウェイのタイムアウトを与えます。
以下の修正を実装しても問題は解決しませんでした。より良い修正を探しています。

次のものがあります:fastcgi_buffers 4 256k;

次のように変更します。

fastcgi_buffers 256 16k; //合計4096k

また、fastcgi_max_temp_file_size 0、を設定すると、応答がfastcgiバッファーを超え始めた場合にディスクへのバッファリングが無効になります。

ありがとう。

0
Bhavin Visariya