Apache 2.4.9随机工作人员的100%CPU负载

我拥有一个t1.micro EC2实例。 Ubuntu发布升级之后,我得到了Apache 2.4.6,我开始注意到100%的CPU负载

top - 19:37:58 up 2:55, 2 users, load average: 3.90, 2.90, 1.82 Tasks: 95 total, 4 running, 91 sleeping, 0 stopped, 0 zombie %Cpu(s): 3.9 us, 7.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 88.9 st KiB Mem: 629976 total, 588412 used, 41564 free, 39412 buffers KiB Swap: 2097144 total, 0 used, 2097144 free, 326932 cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6688 www-data 20 0 114m 17m 12m R 34.3 2.9 3:07.74 apache2 6719 www-data 20 0 113m 10m 6052 R 33.3 1.8 3:16.99 apache2 6721 www-data 20 0 113m 9.8m 5004 R 32.0 1.6 3:04.13 apache2 

我决定从这个 ppa安装另一个Apache版本,所以我现在得到了2.4.9,但问题仍然存在。

我所尝试的:1.删除所有模块,只添加必要的。 目前负载的是:

 lrwxrwxrwx 1 root root 36 Apr 9 19:16 access_compat.load -> ../mods-available/access_compat.load lrwxrwxrwx 1 root root 28 Apr 9 19:17 alias.conf -> ../mods-available/alias.conf lrwxrwxrwx 1 root root 28 Apr 9 19:17 alias.load -> ../mods-available/alias.load lrwxrwxrwx 1 root root 33 Apr 9 19:18 authz_core.load -> ../mods-available/authz_core.load lrwxrwxrwx 1 root root 38 Apr 9 19:18 authz_groupfile.load -> ../mods-available/authz_groupfile.load lrwxrwxrwx 1 root root 33 Apr 9 19:18 authz_host.load -> ../mods-available/authz_host.load lrwxrwxrwx 1 root root 33 Apr 9 19:18 authz_user.load -> ../mods-available/authz_user.load lrwxrwxrwx 1 root root 26 Apr 9 19:18 dir.conf -> ../mods-available/dir.conf lrwxrwxrwx 1 root root 26 Apr 9 19:18 dir.load -> ../mods-available/dir.load lrwxrwxrwx 1 root root 27 Apr 9 19:19 mime.conf -> ../mods-available/mime.conf lrwxrwxrwx 1 root root 27 Apr 9 19:19 mime.load -> ../mods-available/mime.load lrwxrwxrwx 1 root root 34 Apr 9 19:11 mpm_prefork.conf -> ../mods-available/mpm_prefork.conf lrwxrwxrwx 1 root root 34 Apr 9 19:11 mpm_prefork.load -> ../mods-available/mpm_prefork.load lrwxrwxrwx 1 root root 27 Apr 9 14:39 php5.conf -> ../mods-available/php5.conf lrwxrwxrwx 1 root root 27 Apr 9 14:39 php5.load -> ../mods-available/php5.load lrwxrwxrwx 1 root root 30 Apr 9 19:19 rewrite.load -> ../mods-available/rewrite.load lrwxrwxrwx 1 root root 29 Apr 9 19:20 status.conf -> ../mods-available/status.conf lrwxrwxrwx 1 root root 29 Apr 9 19:20 status.load -> ../mods-available/status.load 
  1. 重新安装Apache到一个更新的版本(见上面,我在2.4.9现在仍然在那里)

  2. 停止和启动实例(希望它会进入另一个硬件) – 没有运气

  3. 我正在testing的网站是基于WP的安装了W3TC插件,我禁用了W3TC静态文件的缩小。 我决定这样做,因为我注意到它有时在状态模块中缩小的文件上。

  4. 将WP升级到最新版本(3.8.2) – 没有任何改变

  5. 现在看看状态模块的输出,我看到没有任何模式,以什么请求卡住 – 绝对随机。 例如: http ://pastebin.com/JxLbbzCB – 看到POST /wp-admin/admin-ajax.php已经在W(发送回复)中停留了62秒,5-0请求也在W状态下为250秒。

所有这些“W”工作者加载100%的CPU,导致EC2实例启动CPU节stream。

更新 :这里是strace信息挂起的过程之一:

 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999997}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) send(16, "", 0, MSG_NOSIGNAL) = 0 select(17, [16], [16], NULL, {1, 0}) = 1 (out [16], left {0, 999998}) 

而且这个过程还没有结束就会持续下去

更新: ps auxf的输出| grep apache2:

 root@domU-12-31-39-02-26-E9:~# ps auxf|grep apache2 root 2761 0.0 0.1 4168 852 pts/1 S+ 19:52 0:00 \_ grep --color=auto apache2 root 2549 0.0 2.3 115720 15104 ? Ss 19:50 0:00 /usr/sbin/apache2 -k start www-data 2554 0.0 0.8 115800 5660 ? S 19:50 0:00 \_ /usr/sbin/apache2 -k start www-data 2555 0.2 3.6 117944 22872 ? S 19:50 0:00 \_ /usr/sbin/apache2 -k start www-data 2556 0.2 3.7 119252 23360 ? S 19:50 0:00 \_ /usr/sbin/apache2 -k start www-data 2557 9.9 1.2 115932 8068 ? R 19:50 0:14 \_ /usr/sbin/apache2 -k start www-data 2558 9.7 1.2 115932 8068 ? R 19:50 0:14 \_ /usr/sbin/apache2 -k start www-data 2562 0.0 0.8 115800 5660 ? S 19:50 0:00 \_ /usr/sbin/apache2 -k start www-data 2564 0.0 0.8 115800 5656 ? S 19:50 0:00 \_ /usr/sbin/apache2 -k start www-data 2566 20.7 1.2 115932 8044 ? R 19:50 0:28 \_ /usr/sbin/apache2 -k start www-data 2567 35.9 1.2 115932 8072 ? R 19:50 0:49 \_ /usr/sbin/apache2 -k start www-data 2568 10.8 1.2 115932 8080 ? R 19:50 0:14 \_ /usr/sbin/apache2 -k start www-data 2571 0.0 0.8 115800 5644 ? S 19:51 0:00 \_ /usr/sbin/apache2 -k start www-data 2572 0.0 0.8 115800 5644 ? S 19:51 0:00 \_ /usr/sbin/apache2 -k start www-data 2573 0.0 0.8 115800 5644 ? S 19:51 0:00 \_ /usr/sbin/apache2 -k start www-data 2574 0.0 0.7 115752 4900 ? S 19:51 0:00 \_ /usr/sbin/apache2 -k start root@domU-12-31-39-02-26-E9:~# 

尾部输出/var/log/apache2/error.log(为其他虚拟主机configuration的错误日志目前为空):

 [Mon Apr 21 19:50:22.201343 2014] [:notice] [pid 2552] FastCGI: process manager initialized (pid 2552) [Mon Apr 21 19:50:22.692477 2014] [mpm_prefork:notice] [pid 2549] AH00163: Apache/2.4.9 (Ubuntu) mod_fastcgi/mod_fastcgi-SNAP-0910052141 PHP/5.5.3-1ubuntu2.3 configured -- resuming normal operations [Mon Apr 21 19:50:22.692580 2014] [core:notice] [pid 2549] AH00094: Command line: '/usr/sbin/apache2' 

免费-m

  total used free shared buffers cached Mem: 615 596 18 0 217 142 -/+ buffers/cache: 236 378 Swap: 2047 22 2025 

df -h

 Filesystem Size Used Avail Use% Mounted on /dev/sda1 30G 22G 6.1G 79% / devtmpfs 299M 12K 299M 1% /dev none 62M 208K 62M 1% /run none 5.0M 0 5.0M 0% /run/lock none 308M 0 308M 0% /run/shm none 100M 0 100M 0% /run/user 

在t1.mirco实例上大量使用Apache 2.4就像坐在一对牙签上的矮胖子。 他太大又沉重! 所以当然他把牙签压成碎片,滚下山坡。

你至less有两个基本的解决scheme来解决这个问题的根本原因:

  1. 获得更多的服务器资源,窃取时间更less。 无论是用AWS,还是去数字海洋寻求价值。
  2. 停止使用Apache 2作为面向守护进程的客户端。 要么迁移到像Lighttpd,Nginx一样更轻量级,要么实现像Varnish一样的高速caching代理层。

最可能的问题是apache的内存不足。 Apache没有足够的内存来正确完成,从而进入不可预测的状态,导致CPU循环。

我build议减less虚拟机的内存占用(或移动到更大的虚拟机)。 通过实验findMaxClient的正确设置。 从最小设置开始,如果这可以修复CPU问题,请增加MaxClients和MaxSpareServers,直到find余额。

从这开始(假设你使用prefork),看看问题是否依然存在:

 ListenBacklog 10 <IfModule prefork.c> StartServers 1 MinSpareServers 1 MaxSpareServers 1 MaxClients 1 MaxRequestsPerChild 1000 </IfModule>