Apache 保持连接超时

Apache 保持连接超时

我有一台具有 2 个核心和 2GB RAM 的服务器,其内存利用率存在困难。

当我运行 free -m 时,我通常会得到不到 50MB 的可用空间 - 现在它显示有 378MB 可用空间,而实际上网站上只有 1 个用户:

             total       used       free     shared    buffers     cached
Mem:          1869       1772         96          5         34        247
-/+ buffers/cache:       1491        378
Swap:         1023         34        989

当我运行 ps-aux 时,我看到许多昨天启动且仍然打开的 httpd 请求。

apache    5789  0.0  3.8 1038176 72904 ?       S    03:18   0:27 /usr/sbin/httpd
apache    5790  0.0  3.3 1029400 64216 ?       S    03:18   0:26 /usr/sbin/httpd
apache    5792  0.1  3.4 1031124 65876 ?       S    03:18   0:35 /usr/sbin/httpd
apache   28042  0.1  3.3 1029648 64868 ?       S    04:53   0:28 /usr/sbin/httpd
apache   28043  0.0  3.8 1038412 73420 ?       S    04:53   0:23 /usr/sbin/httpd
apache   31728  0.1  3.8 1038516 73008 ?       S    07:53   0:14 /usr/sbin/httpd
root     31912  0.0  0.7 968160 14860 ?        Ss    2014   0:03 /usr/sbin/httpd
apache   31914  0.0  0.0 246808  1364 ?        S     2014   0:01 /usr/sbin/httpd
apache   31915  0.1  3.7 1038644 71700 ?       S     2014   1:02 /usr/sbin/httpd
apache   31916  0.1  3.7 1038480 71844 ?       S     2014   0:56 /usr/sbin/httpd
apache   31917  0.0  3.1 1026120 60044 ?       S     2014   0:52 /usr/sbin/httpd
apache   31920  0.1  4.1 1045972 79940 ?       S     2014   0:59 /usr/sbin/httpd
apache   31921  0.0  3.8 1039180 73040 ?       S     2014   0:50 /usr/sbin/httpd
apache   31923  0.1  3.3 1029684 63908 ?       S     2014   0:59 /usr/sbin/httpd
apache   31924  0.1  3.2 1027808 61632 ?       S     2014   0:53 /usr/sbin/httpd
apache   31927  0.1  3.2 1027844 61664 ?       S     2014   0:54 /usr/sbin/httpd
apache   31929  0.1  3.8 1039660 73528 ?       S     2014   0:59 /usr/sbin/httpd
apache   31931  0.1  3.2 1028592 62492 ?       S     2014   0:58 /usr/sbin/httpd
apache   31933  0.0  3.2 1029036 62876 ?       S     2014   0:52 /usr/sbin/httpd
apache   31934  0.1  3.3 1029568 63232 ?       S     2014   0:54 /usr/sbin/httpd
apache   32022  0.0  3.8 1038928 73104 ?       S     2014   0:41 /usr/sbin/httpd

按内存使用情况排序的 top 输出是:

31920 apache    20   0 1021m  78m 9064 S  0.0  4.2   0:59.48 httpd
31929 apache    20   0 1015m  71m 8428 S  0.0  3.8   1:02.44 httpd
28043 apache    20   0 1014m  71m 9176 S  0.0  3.8   0:26.59 httpd
32022 apache    20   0 1014m  71m 8796 S  0.0  3.8   0:44.04 httpd
31921 apache    20   0 1014m  71m 8408 S  0.0  3.8   0:51.95 httpd
31728 apache    20   0 1014m  71m 8768 S  0.0  3.8   0:15.00 httpd
 5789 apache    20   0 1013m  71m 8716 S  0.0  3.8   0:28.57 httpd
  591 apache    20   0 1013m  71m 8756 S  0.0  3.8   0:42.92 httpd
31916 apache    20   0 1014m  70m 8368 S  0.0  3.8   0:59.94 httpd
31915 apache    20   0 1014m  70m 8384 S  0.0  3.7   1:04.74 httpd
 5792 apache    20   0 1006m  64m 8744 S  0.0  3.4   0:37.37 httpd
 5790 apache    20   0 1006m  63m 8800 S  0.0  3.4   0:28.23 httpd
28042 apache    20   0 1005m  63m 9176 S  0.0  3.4   0:29.50 httpd
  584 apache    20   0 1006m  62m 8456 S  0.0  3.4   0:37.14 httpd
  586 apache    20   0 1006m  62m 8412 S  0.0  3.4   0:44.48 httpd
  588 apache    20   0 1006m  62m 8424 S  0.0  3.4   0:43.11 httpd
  587 apache    20   0 1006m  62m 8420 S  0.0  3.4   0:47.20 httpd
31923 apache    20   0 1005m  62m 8796 S  0.0  3.3   1:01.21 httpd
31933 apache    20   0 1005m  62m 8376 S  0.0  3.3   0:54.89 httpd
31927 apache    20   0 1004m  60m 8392 S  0.0  3.2   0:58.68 httpd
31924 apache    20   0 1003m  60m 8412 S  0.0  3.2   0:53.68 httpd
31934 apache    20   0 1003m  60m 8408 S  0.0  3.2   0:56.56 httpd
31917 apache    20   0 1003m  60m 8404 S  0.0  3.2   0:54.97 httpd
 1871 root      20   0  157m  17m 1968 S  0.0  0.9   0:53.10 lfd
 5597 apache    20   0  952m  16m 5212 S  0.0  0.9   0:01.02 httpd
31912 root      20   0  945m  14m  13m S  0.0  0.8   0:03.37 httpd
 5854 root      20   0 98364 4676 3672 S  0.0  0.2   0:00.09 sshd
 6557 postfix   20   0 82264 4420 3292 S  0.0  0.2   0:00.04 cleanup
 6560 postfix   20   0 82168 4316 3324 S  0.0  0.2   0:00.03 smtp
 4411 postfix   20   0 81964 4048 3096 S  0.0  0.2   0:00.04 pickup
 5856 root      20   0  105m 1944 1528 S  0.0  0.1   0:00.02 bash

在我的 httpd.conf 中我有:

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2


<IfModule prefork.c>
StartServers       4
MinSpareServers    12
MaxSpareServers   24
ServerLimit      50
MaxClients       50
MaxRequestsPerChild  3000
</IfModule>

从上面我假设这意味着 KeepAlive 已打开但它只会使任何会话保持 2 秒的活动状态 - 如果这是正确的,为什么我仍然有很多昨天正在运行的进程以及我该如何补救这个问题?

答案1

要确认 Apache 占用了所有内存,您可以使用以下代码片段:

function memperuser() {
ps aux | awk 'NR != 1 {x[$1] += $4} END{ for(z in x) {print z, x[z]"%"}}'
}

然后输入会员用户

查看共享和私有内存细分的另一种有用方法是使用ps_mem.py

这将向您显示 Apache 消耗了多少共享内存和私有内存。

您还应该查看 httpd.conf 中的所有 LoadModule 条目,并确定是否需要所有这些条目。通常最大的罪魁祸首是 mod_php。如果您不需要 PHP,那么只需禁用该模块。它可能会在 httpd.d/ 下的自己的配置中加载

如果你不使用 PHP,你也可以通过使用 mpm_event 或 mpm_worker 代替 mpm_prefork 来减少 Apache 的内存占用。阿帕奇网站有一些关于如何使用不同 MPM 模块的非常好的文档。

您可以使用最新的4月 apr、apr-util 和 apr-iconv和 Apache 2.4 分支。如何编译和/或安装它在很大程度上取决于您的设置,因此我将参考您特定的操作系统论坛。

所有这些选项实际上取决于您如何使用 Apache。

答案2

keepalive并且KeepAliveTimeout只控制与客户端的会话保持活动的时间,但是如果会话关闭,这并不意味着进程会被终止,因为配置中的任何进程最多可以处理 3000 个请求(MaxRequestsPerChild)。

您的系统配置为保持最多 24 个空闲 Apache 进程(启动 Apache 后立即启动 12 个)(选项MinSpareServersMaxSpareServers)。

但是,空闲的 Apache 进程通常不会单独使用那么多 RAM,大部分是与所有其他进程共享的。您需要找出真正消耗 RAM 的是什么以及原因。

相关内容