我的 Apache 服务器处于停滞状态,连接数达到最大值,CPU 使用率达到 500%。几个月来它一直运行良好,但今天发生了一些事情,让它变得异常。非常简单的 Apache 进程占用了大量 CPU:
Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
0-0 31154 0/45/45 R 23.85 3 1 0.0 0.47 0.47 ? ? ..reading..
0-0 31154 0/36/36 _ 24.66 0 1 0.0 0.43 0.43 81.152.251.175 mysite.net GET /css/dwn.css HTTP/1.1
0-0 31154 0/33/33 R 23.92 2 179 0.0 0.69 0.69 ? ? ..reading..
0-0 31154 0/1/1 W 0.07 119 0 0.0 0.00 0.00 117.102.163.190 mysite.net POST /includes/offers/ajax.php HTTP/1.1
0-0 31154 1/64/64 C 24.74 0 1 26.8 1.85 1.85 24.127.122.188 mysite.net GET /images/soc.png HTTP/1.1
0-0 31154 0/51/51 _ 24.87 0 899 0.0 0.78 0.78 86.111.144.194 mysite.net GET /includes/offers/window.php?file=57860&tooltip=true HTTP/1.
0-0 31154 0/18/18 R 11.00 77 1 0.0 0.27 0.27 ? ? ..reading..
如您所见,简单请求..reading..
和类似请求GET /images/soc.png HTTP/1.1
占用了 24.5+ 的 CPU 量。我想知道这是否是某种日志记录错误,服务器试图处理巨大的日志文件。请告诉我你们对此的看法。
答案1
您提供的样本很小,但我以前见过类似的事情。问题可能实际上不是 Web 服务器,请进一步查看上游的数据库等。数据库是否已达到最大连接数或正在受到惩罚?
如果您有很多进程处于发送回复状态,您会看到类似的症状,例如...
> 0-0 31154 0/1/1 W 0.07 119 0 0.0 0.00 0.00
> 117.102.163.190 mysite.net POST /includes/offers/ajax.php HTTP/1.1
请注意,在“发送回复状态”(W) 中,自最近请求开始以来的秒数 (SS) 时间很高。
答案2
请提供您的 httpd.conf 文件,我可以看到所有线程都使用相同的 PID,这可能会导致每个线程的子进程数量受到限制。另外,正如您所提到的,您的服务器在尝试读取时卡住了,这可能表明尝试从没有响应的数据库获取某些数据时出现了问题,但这也可能表明您的配置存在问题,您应该调整请求 TTL。如果您愿意,可以在 php 级别完成此操作。