使用Apache在Linux上随机高CPU使用率

最近我的networking服务器出现了一些奇怪的问题。 在过去的一天左右,这个网站似乎随机有所放缓,我们似乎没有遇到任何大的额外stream量,但是快速浏览“top”和httpd似乎是从3-10 %到99%左右,然后在80年代中期之后短暂触及然后回落。 例如:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2443 apache 25 0 256m 20m 5472 R 88.2 2.1 3:22.29 httpd 

这似乎每30分钟左右发生一次。 奇怪的是同时发生这种情况我可以运行Apache服务器状态页面,并将获得(例如):

 CPU Usage: u700.5 s6.22 cu0 cs0 - 20.2% CPU load 

所以我的问题是双重的:

  1. 有谁知道为什么这个问题可能在最后一天左右出现(没有对服务器进行任何修改)
  2. 为什么我的CPU使用率统计数据会远远高于服务器状态,哪个是正确的?

Apache的服务器状态页面的CPU使用率是自Apache启动以来的平均使用率,所以它不会像这样出现峰值。 当你得到这些负载尖峰时,你可以检查服务器状态页面,看看哪些页面/客户端正在服务器(ExtendedStatus必须打开)。

您也可以使用netstat来查看当前正在访问您的计算机的客户端:

  netstat -an | grep ESTABLISHED 

如果您在多个小时内运行此操作并发生stream量高峰,则可能会发现重新获得的IP地址,并可能会跟踪到特定的机器人/爬虫。 如果情况确实如此,您可以考虑使用robots.txt来限制机器人爬行您的网站的行为。

编辑:在繁忙的服务器上面的netstat命令应该显示一些条目,如:

 tcp 0 0 10.2.212.13:80 216.146.52.21:24979 ESTABLISHED tcp 0 0 10.2.212.13:80 86.174.113.138:54901 ESTABLISHED tcp 0 0 10.2.212.13:80 94.1.216.253:51204 ESTABLISHED tcp 0 0 10.2.212.13:80 24.9.61.204:62936 ESTABLISHED 

客户的IP地址将在右侧。 如果你只看到1或2行,那就意味着在那一刻只有你的ssh连接。 当你的负载增加时再次检查。 您也可以删除grep来列出所有连接,虽然这将包含大量旧的TIME_WAIT。

我将从扩展的服务器状态开始,看看在stream量峰值期间是否可以显示任何明显的爬行器。

检查您的访问日志。 你可能会有一个dataminer或爬行器击中你的网站的每一页,因为间隔是如此的规律。

创build一个简单的可执行文件

 #!/usr/bin/sh # use IP netstat -na |grep ESTABLISHED # use NAMES # netstat -ta |grep ESTABLISHED 

“ta”会打印出DNS名称,取消注释哪一个你喜欢。

然后放入一个间隔运行文件的程序,比如crontab。 我会阅读这个手册页,你甚至可能无法使用它。 您将需要将输出发送到日志以供将来使用。 如果您想记下运行的时间,可以将脚本添加到脚本中。 crontab的例子:

 #minute hour dayofmonth monthofyear dayofweek 0,15,30,45 * * * * <path/to/script> > <log> 

这是用crontab -e编辑的(再次阅读手册页)。

您可以使用这个来sortingaccess.log中的顶级条目:

 awk '{print $1}' access_log | sort |uniq -c |sort -n 

如果你真的看到网页响应慢,看看I / O等待,有时CPU使用“高”是没有什么大不了的。

我怀疑你正在四核CPU上运行。 在这种情况下,您可能很容易就会遇到这样的情况,即top会返回%作为每个内核的负载,而其他工具则会将这个数字除以内核的数量,以获得CPU的总体负载数据。

就变化而言,我倾向于给出与Hyppy相同的build议。