Apache占用太多CPU

and*_*ber 3 memory httpd central-processing-unit apache-2.2

我正在尝试管理 Amazon 上的服务器,用于每月接收约 1 亿次综合浏览量的网站网络。不幸的是,我的 5 名开发人员团队中没有人拥有丰富的服务器管理经验。

现在我们将 MaxClients 设置为 1400。目前我们的流量大约是平均水平,我们总共有 1150 个 Apache 进程在运行,每个进程使用大约 2% 的 CPU!在这 1150 个中,有 800 个当前正在休眠,但仍在占用 CPU。我相信有办法优化这个。我有几个想法:

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

所以,这是我们的 Apache 设置。我们确实计划尽快与服务器管理员签约,但在我们找到某人之前,我真的很感激一些建议。

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>
Run Code Online (Sandbox Code Playgroud)

全顶输出:

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
Run Code Online (Sandbox Code Playgroud)

hel*_*oel 5

有很多关于这个主题的书,但为了简单起见:

在单独的层中运行数据库

您的数据库工作负载和 Web 服务器工作负载完全不同,它们将以相互竞争的方式消耗资源。最好将它们分开,这将有助于您将来扩展。

隔离静态和动态内容

考虑为静态内容运行一个更快的网络服务器,比如 nginx,并完全放弃 apache。如果可以,请在任何地方运行 nginx。

KeepAlive 肯定会有所帮助

您的许多资源都因连接的拆除和拆除而被消耗。

页面测试

如需更多好的建议,我强烈推荐:http : //www.webpagetest.org/。这将向您展示为什么该站点需要很长时间才能加载,并提供了许多修复性能的最佳实践提示:启用 gzip 压缩、缩小 javascript 和 css 等。请阅读它。