Apache服务器存在问题,httpd进程数量众多

23
我们的Apache服务器出现问题。它非常缓慢,CPU使用率非常高(有时甚至显示持续100%)。
它运行在Ubuntu系统上。
你有什么想法是什么原因导致这个问题?
“top”显示如下(可能还有更多未显示在终端窗口中的httpd进程):
top - 11:33:19 up  1:07,  2 users,  load average: 37.79, 35.90, 29.14
Tasks:  86 total,  10 running,  76 sleeping,   0 stopped,   0 zombieCpu(s): 90.6%us,  9.4%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    786432k total,   379584k used,   406848k free,        0k buffersSwap:        0k total,        0k used,        0k free,        0k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                      
 5507 nobody    16   0 54540  19m 5204 S    4  2.6   0:03.70 httpd                          5653 nobody    17   0 59996  24m 4808 R    4  3.2   0:01.98 httpd                         
 3277 nobody    15   0  201m  51m 6724 R    2  6.7   2:14.30 mysqld                         5260 nobody    15   0 53740  18m 4972 S    2  2.4   0:06.53 httpd                         
 5333 nobody    15   0 54536  19m 5152 S    2  2.5   0:06.50 httpd                          3923 nobody    15   0 52644  18m 6372 S    1  2.4   0:16.80 httpd                         
 5519 nobody    15   0 51252  15m 4792 S    1  2.0   0:03.02 httpd                          4048 nobody    15   0 52808  17m 5040 R    1  2.3   0:13.86 httpd                         
 5240 nobody    15   0 53980  18m 4916 S    1  2.4   0:08.42 httpd                         
 5249 nobody    15   0 52908  17m 5188 S    1  2.3   0:08.23 httpd                          5385 nobody    15   0 52568  16m 4824 S    1  2.2   0:04.19 httpd                         
 5395 nobody    16   0 52536  16m 4804 S    1  2.1   0:03.90 httpd                          5422 nobody    16   0 51408  15m 4888 S    1  2.1   0:03.49 httpd                         
 5503 nobody    15   0 52536  16m 4800 S    1  2.1   0:02.67 httpd                          3646 nobody    15   0 52572  16m 5012 S    1  2.2   0:25.42 httpd                         
 3948 nobody    15   0 52844  17m 5008 R    1  2.3   0:17.15 httpd                          5283 nobody    15   0 54000  18m 4944 S    1  2.4   0:07.05 httpd                         
 5300 nobody    15   0 54748  19m 5276 S    1  2.6   0:06.20 httpd                          5304 nobody    15   0 52876  17m 4904 S    1  2.2   0:06.45 httpd                         
 5305 nobody    15   0 52812  17m 4884 S    1  2.2   0:06.02 httpd                          5400 nobody    16   0 52060  16m 4800 R    1  2.1   0:04.10 httpd                         
 5423 nobody    15   0 54764  19m 5196 S    1  2.6   0:04.37 httpd                          5433 nobody    15   0 52168  16m 4844 R    1  2.1   0:03.38 httpd                         
 5497 nobody    15   0 52572  16m 4820 S    1  2.2   0:02.83 httpd                          5498 nobody    15   0 53076  17m 4864 S    1  2.3   0:03.14 httpd                         
 5502 nobody    15   0 51260  15m 4804 S    1  2.0   0:02.70 httpd                          5505 nobody    15   0 54920  19m 4976 S    1  2.5   0:02.68 httpd                         
 5546 nobody    15   0 52584  16m 4664 S    1  2.2   0:02.48 httpd                          5550 nobody    15   0 51244  15m 4796 S    1  2.0   0:02.42 httpd                         
 5652 nobody    15   0 51976  17m 5912 S    1  2.3   0:01.24 httpd                          5659 nobody    15   0 55012  19m 4980 S    1  2.6   0:01.25 httpd                         
 5707 nobody    15   0 51416  15m 4880 S    1  2.1   0:00.09 httpd                          5710 nobody    15   0 51240  15m 4792 S    1  2.0   0:00.14 httpd                         
 5399 nobody    15   0 52568  16m 4856 S    1  2.2   0:03.86 httpd                          5435 nobody    15   0 52596  16m 4864 S    1  2.2   0:02.96 httpd                         
 5467 nobody    15   0 52316  16m 4856 R    1  2.1   0:02.93 httpd                          5501 nobody    15   0 52956  17m 4844 S    1  2.2   0:02.79 httpd                         
 5525 nobody    15   0 54508  19m 4916 S    1  2.5   0:03.41 httpd                          5547 nobody    15   0 52604  18m 5708 S    1  2.3   0:02.77 httpd                         
 5590 root      15   0 19208 1360 1044 R    1  0.2   0:00.39 top                            5627 nobody    15   0 55648  20m 5164 S    1  2.6   0:02.56 httpd                         
 5629 nobody    15   0 51248  15m 4792 S    1  2.0   0:01.62 httpd                          5647 nobody    15   0 52956  17m 4884 S    1  2.2   0:01.16 httpd                         
 5656 nobody    15   0 52588  17m 4884 S    1  2.2   0:00.94 httpd                          5665 nobody    15   0 51244  15m 4792 S    1  2.0   0:01.36 httpd                         
 5709 nobody    15   0 51928  15m 4628 S    1  2.1   0:00.02 httpd                          5711 nobody    16   0 51148  15m 4600 S    1  2.0   0:00.02 httpd                      

1
Apache 处理了多少个连接?您可以使用 netstat -anpt|grep httpd|grep ESTABLISHED|cut -b45-60|cut -d':' -f1|sort -rn|uniq -c 进行监控,有关更多信息,请参见此处。此外,这与 MySQL 有什么关系? - Jon Cairns
你说得对,这与它无关。已删除该标记。 - Andreas Larsson
当我运行该命令时,我收到以下信息: sort:打开失败:+1:没有那个文件或目录 - Andreas Larsson
抱歉,笔误。已经修正。 - Jon Cairns
我成功地运行了: netstat -anpt|grep httpd|grep ESTABLISHED|cut -b45-60|cut -d':' -f1|uniq -c 这让我得到了大约50个IP地址。其中大多数前面有1,7个前面有2。 - Andreas Larsson
好的,netstat -anpt | grep httpd | grep ESTABLISHED | cut -b45-60 | cut -d':' -f1 | sort -rn | uniq -c 给了我大约30个IP地址,每个IP地址前面都有从1到6不等的数字。 - Andreas Larsson
3个回答

32

Apache需要分叉一个进程来处理每个连接的客户端。在这里阅读更多内容

重点是您有很多进程,因为您有很多连接。如果您的服务器因此运行缓慢,则有几个选择:

  1. 优化您的应用程序:剖析您的应用程序代码并尝试优化对服务器负载最大的区域。
  2. 考虑更改到低影响的Web服务器,例如nginx。这样做可能会增加服务器可以处理的连接数。
  3. 添加页面缓存,使用类似于varnish的东西
  4. 添加另一个服务器,并在它们之间进行负载平衡
  5. 增加现有服务器的功能(例如增加RAM、升级处理器、安装更快的硬盘)。

所有这些选项都有时间或金钱成本。不幸的是,这就是事实 :)

在我看来,最快的胜利可能是第2和第3个选项。但这意味着它们被安装时停机,或者有一个备份服务器可供使用。


如果您正在使用基于PHP的应用程序,则尝试使用eAccelerator。这将通过在其编译状态下缓存它们来更快地提供PHP服务。目前,您需要节省CPU,这就是我所看到的,Varnish在这种情况下不会那么有帮助,因为磁盘I / O不是瓶颈...考虑像Jonathan建议的那样使用Nginx可能是一个好主意。 - Masood Alam
@CloudyDna 给出了一些好的建议。我添加了Varnish,不是为了减轻磁盘IO的负担,而是为了暂时缓存整个页面,以节省应用服务器的运行时间,无论是PHP还是其他任何东西。这将减少CPU周期,并且页面加载时间会更快,从而释放Apache进程以向更多客户端提供服务。 - Jon Cairns

14
根据我的经验,数十个httpd进程是DOS攻击。安装了mod_evasive之后,通过top显示的数十个httpd进程几乎被消除,而且在执行更重的查询操作期间,我的mysql CPU负载从平均100%+ / 99%的时间利用率下降到预期的20%负载。
要在RHEL(CentOS/Fedora/Redhat)系统上安装mod_evasive,请执行以下操作:
yum install -y mod_evasive    

重新启动Apache

/sbin/service httpd restart
或者
systemctl restart httpd

就是这样。

即使DOS攻击不是你的问题,防范攻击发生也是明智之举。


我认为这是一个非常有效的回应。在我们这个时代,DDOS攻击变得越来越普遍。 - Shadoath

3

系统和Httpd信息

# cat /proc/version

Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Dec 6 23:06:41 UTC 2016

# httpd -v

Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 14 2016 18:04:44

Make MPM Prefork Configure

# sudo apachectl -t -D DUMP_MODULES |grep mpm

[Thu Jan 12 16:06:11.778080 2017] [so:warn] [pid 23727] AH01574: module wsgi_module is already loaded, skipping
 mpm_prefork_module (shared)

这意味着已安装并启用了mpm_prefork_module,您可以在文件00-mpm.conf中更改为eventworkerprefork(默认)模式,该文件路径为/etc/httpd/conf.modules.d。有关Apache MPM的参考,请访问Apache MPM Common Directives
# sudo cat >> /etc/httpd/conf/httpd.conf <<-'EOF'
<IfModule prefork.c>
    ServerLimit              20
    StartServers             15
    MinSpareServers           5
    MaxSpareServers          10
    MaxClients               15
    MaxRequestsPerChild      25
</IfModule>
EOF
  • 我的虚拟机有2GB内存和2个处理器

详细配置信息请参考上述引用。

重新启动Httpd

# sudo systemctl restart httpd.service

检查状态

# systemctl status httpd.service 

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-01-12 13:40:12 CST; 2h 48min ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 16576 (httpd)
   Status: "Total requests: 3625; Current requests/sec: -70.2; Current traffic:   0 B/sec"
   Memory: 869.7M
   CGroup: /system.slice/httpd.service
           ├─16576 /usr/sbin/httpd -DFOREGROUND
           ├─24122 /usr/sbin/httpd -DFOREGROUND
           ├─24125 /usr/sbin/httpd -DFOREGROUND
           ├─24154 /usr/sbin/httpd -DFOREGROUND
           ├─24157 /usr/sbin/httpd -DFOREGROUND
           ├─24211 /usr/sbin/httpd -DFOREGROUND
           ├─24219 /usr/sbin/httpd -DFOREGROUND
           └─24236 /usr/sbin/httpd -DFOREGROUND

Jan 12 13:40:12 192-168-1-68.node systemd[1]: Starting The Apache HTTP Server...
Jan 12 13:40:12 192-168-1-68.node httpd[16576]: [Thu Jan 12 13:40:12.614941 2017] [so:warn] [pid 16576] AH01574: module wsgi_module is already loaded, skipping
Jan 12 13:40:12 192-168-1-68.node systemd[1]: Started The Apache HTTP Server.

或者

# ps aux|grep httpd

root     16576  0.0  0.0 232232   504 ?        Ss   13:40   0:01 /usr/sbin/httpd -DFOREGROUND
apache   24296 10.9  4.8 542936 91500 ?        S    16:29   0:16 /usr/sbin/httpd -DFOREGROUND
apache   24310 10.6  4.7 542804 89752 ?        S    16:29   0:15 /usr/sbin/httpd -DFOREGROUND
apache   24343 11.2  6.5 542804 123944 ?       S    16:29   0:15 /usr/sbin/httpd -DFOREGROUND
apache   24344 11.1  6.5 542804 124084 ?       S    16:29   0:14 /usr/sbin/httpd -DFOREGROUND
apache   24345 11.6  6.7 542804 126616 ?       S    16:29   0:15 /usr/sbin/httpd -DFOREGROUND
apache   24347 11.0  6.6 542804 125764 ?       S    16:29   0:14 /usr/sbin/httpd -DFOREGROUND
apache   24377 12.0  6.7 542804 126396 ?       S    16:29   0:15 /usr/sbin/httpd -DFOREGROUND
apache   24378 12.4  6.7 542804 126448 ?       S    16:29   0:15 /usr/sbin/httpd -DFOREGROUND
apache   24408 12.3  6.6 542804 126032 ?       S    16:29   0:14 /usr/sbin/httpd -DFOREGROUND
apache   24450 18.6  5.4 511560 102520 ?       R    16:30   0:10 /usr/sbin/httpd -DFOREGROUND
apache   24458 19.4  4.7 498476 89548 ?        S    16:30   0:08 /usr/sbin/httpd -DFOREGROUND
apache   24466 21.4  4.5 495424 86416 ?        R    16:31   0:07 /usr/sbin/httpd -DFOREGROUND
apache   24484  0.5  0.3 236456  5760 ?        S    16:31   0:00 /usr/sbin/httpd -DFOREGROUND
root     24496  0.0  0.0 112652   964 pts/0    S+   16:31   0:00 grep --color=auto httpd

我的Apache服务器每秒接收到2个请求。之前,httpd进程的数量会增加,直到系统停止响应。设置MPM Prefork后,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接