偶尔,在一天中的某个时间段,我会遇到 10 分钟的极度迟缓,在此期间,我的请求所花的时间比平时长 50-1000 倍。注意:我使用的是 Apache/2.2.16 (Debian),运行的是 PHP 5.3.3
Newrelic 显示时间不是花在数据库中,而是花在 PHP 执行第一行代码之前(根据一些跟踪)。同时,我看到吞吐量大幅下降到正常水平的近 1/3。
当我查看图表时,我可以看到 CPU、内存、磁盘 IO 和 CPU waitIO 都处于稳定水平:根本没有峰值。在此期间,我没有在 PHP 或 Web 服务器的错误日志中看到任何错误消息。服务器的内存绰绰有余,根据 newrelic 的说法,它只使用了大约 25%。总内存为 3.3 GB。
注意:两个核心的平均负载约为 0.25,因此负载相当低。我通常每分钟收到大约 1000-1500 个请求。响应时间通常为 15 毫秒到 150 毫秒。
下面是我的一些 Apache 配置:
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 550
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MaxClients 550
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
MaxClients 设置得这么高,因为我们每个进程的平均内存非常低:大约 1-4mb
我能想到的唯一解释是我的主机断线了或者出现了某种连接问题。这并不让我感到惊讶,因为这个主机 (rimuhosting) 一直不太可靠。
还有其他可能的解释吗?
答案1
是的,在排除性能故障时需要考虑一些问题,其中大多数问题可以在/etc/sysctl.conf
文件中进行调整。
Apache 和 PHP 容易受到多种资源耗尽拒绝服务攻击,特别是 SlowLorisfile.fs-max
耗尽、套接字耗尽、短暂开放端口数量耗尽。
检查sysctl -w net.ipv4.ip_local_port_range="1024 8048"
在高峰时段是否有任何影响。该命令通知操作系统使用从端口 1024 到 8048 来响应请求,如果您的服务器在某个时候受到重击,您可能会陷入套接字耗尽的境地。
另外,运行netstat -na | egrep -c TIME_WAIT
并netstat -na | egrep -c STAB
观察套接字使用模式。
编辑:比那些计数命令更好:watch -n1 'cat /proc/net/sockstat'