我在一个非常繁忙的互联网站点上工作,该站点经常会有非常大的流量高峰。 在这些峰值期间,每秒请求数百页,这会产生随机502网关错误。
现在,我们在装有4个SAS 15k驱动器(raid10),16核CPU和24GB DDR3内存的计算机上运行Nginx(1.0.10)和PHP-FPM。 此外,我们还使用了最新的Xcache版本。 该数据库位于另一台计算机上,但是该计算机的负载非常低,并且没有问题。
在正常负载下,一切运行正常,系统负载在1以下,并且PHP-FPM状态报告从未一次真正显示超过10个活动进程。 总是有大约10GB的可用内存。 在正常负载下,机器每秒处理约100次网页浏览。
当巨大的流量高峰到达并且机器每秒请求数百个页面浏览量时,就会出现问题。 我注意到FPM的状态报告会显示多达50个活动进程,但这仍远低于我们配置的300个最大连接数。 在这些峰值期间,Nginx状态报告多达5000个活动连接,而不是正常平均值1000。
操作系统信息: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,所以我尚未完全重新引导计算机,因为它是生产计算机,这将导致停机时间过多。