为什么我的吞吐量突然下降,并且运行缓慢,而 CPU 却没有增加

为什么我的吞吐量突然下降,并且运行缓慢,而 CPU 却没有增加

偶尔,在一天中的某个时间段,我会遇到 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_WAITnetstat -na | egrep -c STAB观察套接字使用模式。

编辑:比那些计数命令更好:watch -n1 'cat /proc/net/sockstat'

相关内容