Apache占用了太多的CPU

我试图pipe理一个亚马逊网站上的服务器,每月收到约1亿网页浏览量。 不幸的是,我的5个开发团队中没有人拥有更多的服务器pipe理经验。

现在我们把MaxClients设置为1400.目前我们的stream量是平均的,我们有1150个Apache进程正在运行,每个进程使用大约2%的CPU! 在这1150个中,有800个正在睡觉,但仍占用CPU。 我相信有办法来优化这个。 我有几个想法:

  1. 看来Apache正在为每一个连接创build一个新的进程。 这是正常的吗?
  2. 有没有办法更快地杀死睡眠过程?
  3. 我们应该打开KeepAlive吗? 每个页面加载大约15-20个中等大小的graphics和大量的javascript / css。

所以,这是我们的Apache设置。 我们计划尽快订购一个服务器pipe理员,但是我会很感激一些build议,直到find一个人。

Timeout 25 KeepAlive Off MaxKeepAliveRequests 200 KeepAliveTimeout 5 <IfModule prefork.c> StartServers 100 MinSpareServers 20 MaxSpareServers 50 ServerLimit 1400 MaxClients 1400 MaxRequestsPerChild 5000 </IfModule> <IfModule worker.c> StartServers 4 MaxClients 400 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> 

全顶级输出:

 top - 23:44:36 up 1 day, 6:43, 4 users, load average: 379.14, 379.17, 377.22 Tasks: 1153 total, 379 running, 774 sleeping, 0 stopped, 0 zombie Cpu(s): 71.9%us, 26.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 1.9%si, 0.0%st Mem: 70343000k total, 23768448k used, 46574552k free, 527376k buffers Swap: 0k total, 0k used, 0k free, 10054596k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1756 mysql 20 0 10.2g 1.8g 5256 S 19.8 2.7 904:41.13 mysqld 21515 apache 20 0 396m 18m 4512 R 2.1 0.0 0:34.42 httpd 21524 apache 20 0 396m 18m 4032 R 2.1 0.0 0:32.63 httpd 21544 apache 20 0 394m 16m 4084 R 2.1 0.0 0:36.38 httpd 21643 apache 20 0 396m 18m 4360 R 2.1 0.0 0:34.20 httpd 21817 apache 20 0 396m 17m 4064 R 2.1 0.0 0:38.22 httpd 22134 apache 20 0 395m 17m 4584 R 2.1 0.0 0:35.62 httpd 22211 apache 20 0 397m 18m 4104 R 2.1 0.0 0:29.91 httpd 22267 apache 20 0 396m 18m 4636 R 2.1 0.0 0:35.29 httpd 22334 apache 20 0 397m 18m 4096 R 2.1 0.0 0:34.86 httpd 22549 apache 20 0 395m 17m 4056 R 2.1 0.0 0:31.01 httpd 22612 apache 20 0 397m 19m 4152 R 2.1 0.0 0:34.34 httpd 22721 apache 20 0 396m 18m 4060 R 2.1 0.0 0:32.76 httpd 22932 apache 20 0 396m 17m 4020 R 2.1 0.0 0:37.34 httpd 22933 apache 20 0 396m 18m 4060 R 2.1 0.0 0:34.77 httpd 22949 apache 20 0 396m 18m 4060 R 2.1 0.0 0:34.61 httpd 22956 apache 20 0 402m 24m 4072 R 2.1 0.0 0:41.45 httpd 

在我看来,你正在使用prefork MPM。 这个答案的大部分假设一样多。

看来Apache正在为每一个连接创build一个新的进程。 这是正常的吗?

对于prefork? 是。

有没有办法更快地杀死睡眠过程?

你确定这些stream程没有做任何事吗? 使用MaxSpareSevers设置,最多只能有50个空闲进程。 启用mod_status并设置ExtendedStatus应允许您查看Apache记分板,并允许您查看正在发生的事情。

我们应该打开KeepAlive吗? 每个页面加载大约15-20个中等大小的graphics和大量的javascript / css。

打开KeepAlive是个好主意。 它将允许客户端pipe理请求,并允许您更高效地重用Apache进程。

与大多数调整一样。 首先测量创build基线,然后改变一件事情,然后重新测量以确定您所改变的效果。 使用(和绘制)mod_status对此很有帮助。

你可能能够使用工人MPM,这往往有助于performance。 但是,一些库(特别是一些PHP库)不能很好地与mpm工作。 因人而异

要确定您正在使用的是哪个mpm,请运行:apache2 -V(或者根据发行版的不同,httpd -V)

有关这个主题写的整本书,但要保持简单:

在单独的层中运行数据库

你的数据库工作量和networking服务器的工作量是完全不同的,并且会以相互竞争的方式颠覆资源。 最好让他们分开,这将有助于你在未来扩大规模。

隔离静态和dynamic内容

考虑运行一个像nginx这样的更快速的web服务器来完成静态内容并且完全抛弃apache。 如果可以的话,到处运行nginx。

KeepAlive肯定会有所帮助

很多资源正在被连接的撕裂和撕裂所烧毁。

PageTest

对于更好的build议,我强烈build议: http : //www.webpagetest.org/ 。 这将告诉你为什么该网站需要很长的时间来加载,并有一些最佳实践提示,以解决性能:启用gzip压缩,缩小JavaScript和css等,等等给它一个阅读。