Apache 最近在空闲时占用了更多的 CPU

Apache 最近在空闲时占用了更多的 CPU

我已经运行带有标准 LAMP 堆栈的 Ubuntu 14.04 服务器一段时间了,系统会通过每日电子邮件向我报告每小时平均 CPU 使用率。很长一段时间以来,报告的 CPU 空闲时间大部分都在 90 多(这是一台负载较轻的服务器)。

大约一个月前,这种情况发生了变化,服务器现在报告的空闲时间是 80 多小时,而不是 90 多小时。top这表明 Apache 消耗了最多的 CPU:

top - 00:20:43 up 39 days, 22:34,  1 user,  load average: 0.34, 0.41, 0.39
Tasks: 165 total,   2 running, 163 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.0 us,  0.7 sy,  0.0 ni, 89.2 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:   6110180 total,  5500892 used,   609288 free,   232448 buffers
KiB Swap:        0 total,        0 used,        0 free.  3502368 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
16235 www-data  20   0  503848  77680  41564 S   8.3  1.3   0:04.28 apache2
16124 www-data  20   0  506624  86688  47888 S   8.0  1.4   0:06.23 apache2
16351 www-data  20   0  506456  79224  41364 S   7.3  1.3   0:01.54 apache2
16301 www-data  20   0  506356  78908  41156 S   7.0  1.3   0:02.93 apache2
16102 www-data  20   0  507116  87292  48272 S   6.6  1.4   0:06.88 apache2
 1343 mysql     20   0 2670112 540216   8308 S   2.7  8.8 988:08.92 mysqld
16354 www-data  20   0  503248  76144  40636 S   1.3  1.2   0:01.29 apache2
16100 www-data  20   0  507016  80436  41524 S   1.0  1.3   0:07.12 apache2

我为此绞尽脑汁想找出我可能做了什么更改导致这种情况。在这段时间内,网络流量没有增加(事实上,它一直低于正常水平),我可以坐着看,apachetop上面的输出继续,没有发生什么事情top

我今晚尝试应用所有最新补丁,希望也许是在最近的更新中引入了一些临时故障并且已经得到解决,但无济于事。

然后我突然想到,这大概就是我在服务器上安装 mod_security 的同一时间。从那时起,我就一直在观察模式下运行它。我今天晚上禁用了它并重新启动了 apache,但负载似乎没有受到更改的影响。

有人能建议我如何诊断 Apache 正在忙于做什么吗?这目前不是一个主要问题,但我想在它成为一个主要问题之前了解它!

答案1

原来是智利的某个火鸡每秒在我没有使用 apachetop 监控的 WordPress 网站上轮询 xmlrpc.php 几次。阻止有问题的 IP 地址很好地解决了这个问题!

如果有人再次来这里查看,我使用了 mod_status 来帮助我找到问题的根源。具体来说,在安装并启用 mod_status 后,我在我的一个虚拟主机上启用了 /server-status 路径,如下所示(替换<my-current-ip>为我的客户端 PC 当前面向公众的 IP 地址):

<VirtualHost *:443>
    ServerName myhost.com
    ...
    <Location /server-status>
            SetHandler server-status
            Require ip <my-current-ip>
    </Location>
    ...
</VirtualHost>

然后访问https://myhost.com/server-status以全面了解系统上的网络流量。这很快就揭示了进入相关虚拟主机上的 xmlrpc.php 脚本的大部分流量。

从那里,我跟踪了该虚拟主机的访问日志,可以看到活动模式和源 IP 地址。然后就可以使用 ufw 阻止 IP 地址,如下所示:

sudo ufw insert 1 deny from <the-bad-ip>

注意:在该命令中使用“插入 1”可确保它在防火墙配置中的任何“默认允许”规则(例如端口 80 和 443)之前应用,否则过滤器将像巧克力茶壶一样无用!

相关内容