我有一台具有 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 个)(选项MinSpareServers
和MaxSpareServers
)。
但是,空闲的 Apache 进程通常不会单独使用那么多 RAM,大部分是与所有其他进程共享的。您需要找出真正消耗 RAM 的是什么以及原因。