当我看到CPU使用率很高但内存使用率较低时,应该如何调整apache?


8

我的CentOS Web节点(LAMP堆栈)的CPU使用率很高,但内存使用率却很低。几乎所有过程都是apache。我知道我可以添加其他Web节点,直到我的CPU使用率变得合理为止,但是我想这里有一些快速的调优技巧可能会在很长一段路要走。

CPU弹跳在90-100%之间。Mysql弹跳介于5%和45%之间。Apache构成了其余部分。

最佳:

top - 21:15:49 up 46 days, 20:39,  4 users,  load average: 34.17, 44.62, 51.03
Tasks: 133 total,  32 running, 101 sleeping,   0 stopped,   0 zombie
Cpu(s): 90.4%us,  9.6%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.1%st
Mem:   8388608k total,  6116448k used,  2272160k free,    84160k buffers
Swap: 16777208k total,       68k used, 16777140k free,  3488044k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
15775 mysql     15   0  827m 153m 3712 S 43.7  1.9   0:55.04 mysqld
15911 apache    16   0  275m  10m 3872 S 24.1  0.1   0:03.15 httpd
15816 apache    16   0  288m  23m 4116 R 23.5  0.3   0:11.88 httpd
15807 apache    15   0  281m  17m 5028 S 21.5  0.2   0:11.71 httpd
15897 apache    16   0  277m  13m 4104 S 21.2  0.2   0:02.68 httpd
15834 apache    16   0  276m  11m 3916 S 20.6  0.1   0:05.22 httpd
15842 apache    16   0  275m  11m 4116 S 19.3  0.1   0:07.86 httpd
15870 apache    16   0  294m  30m 5044 R 17.4  0.4   0:06.36 httpd
15782 apache    15   0  278m  13m 4124 R 12.2  0.2   0:08.54 httpd
15819 apache    15   0  280m  17m 5016 S 11.6  0.2   0:07.01 httpd
15683 apache    16   0  288m  23m 4128 R 10.9  0.3   0:09.90 httpd
15876 apache    16   0  284m  19m 3880 R 10.6  0.2   0:04.35 httpd
15878 apache    15   0  276m  11m 4104 S 10.6  0.1   0:06.42 httpd
15913 apache    16   0  275m  10m 3920 R  9.6  0.1   0:07.98 httpd
15898 apache    16   0  280m  16m 4104 S  9.3  0.2   0:02.85 httpd
15817 apache    16   0  277m  13m 4108 S  9.0  0.2   0:05.55 httpd
15843 apache    16   0  280m  15m 4104 R  8.7  0.2   0:10.80 httpd
15812 apache    16   0  280m  16m 5012 R  8.0  0.2   0:05.18 httpd
15844 apache    16   0  281m  16m 4116 R  7.4  0.2   0:08.63 httpd
15833 apache    16   0  281m  18m 5036 R  7.1  0.2   0:04.76 httpd
15795 apache    16   0  280m  15m 3920 R  6.8  0.2   0:08.65 httpd
15704 apache    15   0  280m  16m 4096 S  6.4  0.2   0:09.06 httpd
15849 apache    16   0  280m  15m 4124 R  6.4  0.2   0:05.59 httpd
15806 apache    16   0  276m  11m 3876 S  6.1  0.1   0:10.33 httpd
15902 apache    16   0  280m  15m 3912 R  6.1  0.2   0:03.40 httpd
15688 apache    16   0  279m  14m 4116 R  5.8  0.2   0:06.07 httpd
15904 apache    16   0  280m  15m 3860 R  5.8  0.2   0:02.74 httpd
15703 apache    16   0  281m  17m 5048 R  5.1  0.2   0:03.86 httpd
15705 apache    16   0  281m  17m 5044 R  4.5  0.2   0:13.54 httpd
15821 apache    15   0  276m  11m 4072 S  4.5  0.1   0:04.24 httpd
15830 apache    16   0  278m  13m 4112 R  4.2  0.2   0:06.37 httpd
15850 apache    16   0  277m  12m 3872 R  3.9  0.2   0:04.64 httpd
15912 apache    15   0  276m  11m 3920 S  3.9  0.1   0:05.58 httpd
15804 apache    15   0  280m  15m 3932 R  3.5  0.2   0:09.13 httpd
15805 apache    16   0  281m  15m 3932 R  3.5  0.2   0:09.00 httpd
15899 apache    16   0  277m  12m 4104 R  2.6  0.2   0:03.26 httpd
15701 apache    16   0  277m  12m 3920 R  2.3  0.2   0:08.35 httpd
15781 apache    15   0  274m 9.8m 3924 S  1.9  0.1   0:10.48 httpd
15848 apache    15   0  276m  11m 3876 S  1.9  0.1   0:06.63 httpd
15901 apache    15   0  275m  10m 3916 S  1.9  0.1   0:02.18 httpd
15879 apache    16   0  280m  16m 4104 R  1.3  0.2   0:02.03 httpd
15820 apache    16   0  281m  17m 5260 R  1.0  0.2   0:05.24 httpd

相关的httpd.conf:

Timeout 120
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

您的应用程序在哪里?PHP的?您是否正在使用像APC这样的操作码缓存?
HTTP500 2012年

是的,PHP。我有memcache和apc,但现在都没有利用。我正在构建单独的内存缓存服务器,以避免在重新启动节点时丢失服务器。
瑞安

您的apache进程可能正在等待来自MySQL的响应并堆积。您介意发布MySQL的my.conf吗?另外,您是否在MySQL中配置了慢速日志?如果有的话,这些告诉你什么?
KM。

1
您是否与prefork或合作worker?在新版本发布,代码更改,服务器更新等之后,您是否会遇到此类问题?
Grosshat 2012年

Answers:


5

可能是某些在mod_php中运行的PHP脚本消耗了过多的CPU时间。总体建议是笼统的,每个建议都会有一些好处:

  • 安装APC缓存并检查其是否正在实际运行(APC捆绑了apc.php文件,该文件显示了APC状态以及缓存的命中率和未命中率)
  • 安装nginx并将其作为反向代理安装在apache之前-它将减少服务静态文件的开销,并为服务器动态内容留出更多的CPU资源
  • 使用%t%T指令将CustomLog添加到apache并检查日志-您将看到wichwich请求运行时间最多,从而消耗最多的CPU
  • 优化/重写这些脚本

2
问题肯定是在Apache进程中运行的,但不是Apache本身。的mod_php的确是最有可能的原因。您需要分析正在运行的PHP脚本,并弄清楚这些脚本在浪费CPU,尽管不是数据库。如果数据库是瓶颈,您将看到许多IO阻塞的Apache进程正在等待数据库的响应。Apache / PHP进程吞噬CPU的事实意味着它们没有在等待IO(除非您正在运行使用繁忙的等待和非阻塞IO的脚本,在这种情况下,您已经找到了原因)。
Mikko Rantalainen 2012年

您可以为我推荐第二个建议吗?任何如何指导?
mahyard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.