私は、トラフィックが非常に大きく急増することが多い、かなり忙しいインターネットサイトで働いています。これらのスパイクの間、毎秒数百ページが要求され、これによりランダムな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に変更したため、マシンを完全にリブートしていません。実稼働マシンであり、ダウンタイムが長すぎるためです。
これで修正されるはずです...
あなたが持っている:fastcgi_buffers 4 256k;
次のように変更しますfastcgi_buffers 256 16k; //合計4096k
また、fastcgi_max_temp_file_sizeを設定します。これにより、応答がfastcgiバッファーを超え始めた場合にディスクへのバッファーが無効になります。
Unixソケットはデフォルトで128接続を受け入れます。この行を/etc/sysctl.conf
に入れるとよいでしょう
net.core.somaxconn = 4096
場合によっては役に立たない-ソケットの代わりに通常のポートバインドを使用します。300+のソケットは新しいリクエストをブロックし、nginxに502を表示させるためです。
@氏。ブーン
8コア14 GBのRAMがあります。しかし、システムは非常に頻繁にゲートウェイのタイムアウトを与えます。
以下の修正を実装しても問題は解決しませんでした。より良い修正を探しています。
次のものがあります:fastcgi_buffers 4 256k;
次のように変更します。
fastcgi_buffers 256 16k; //合計4096k
また、fastcgi_max_temp_file_size 0、を設定すると、応答がfastcgi
バッファーを超え始めた場合にディスクへのバッファリングが無効になります。
ありがとう。