Apache 内存占用过高

Apache 内存占用过高

最近我注意到 httpd 进程开始消耗大量内存 - 一段时间后几乎用完了服务器的 2GB RAM,我没有剩余内存来处理其他事情。以下是 top 告诉我的信息:

26409 apache 15 0 276m 152m 28m S 0 7.4 0:59.12 httpd
26408 apache 15 0 278m 151m 28m S 0 7.4 1:03.80 httpd
26410 apache 15 0 277m 149m 26m S 0 7.3 0:57.22 httpd
26405 apache 15 0 276m 148m 25m S 0 7.3 0:59.20 httpd
26411 apache 16 0 276m 146m 23m S 0 7.2 1:09.18 httpd
17549 apache 15 0 276m 144m 23m S 0 7.0 0:36.34 httpd
22095 apache 15 0 276m 136m 14m S 0 6.6 0:30.56 httpd

在我看来,每个 httpd 进程在处理完请求后都不会释放内存。所以它们都占用了大约 270MB 的空间,这很糟糕。有没有办法让我知道所有内存都去了哪里以及为什么会这样?我最近没有对服务器进行任何调整,所以我肯定不是我搞砸了(以前没有遇到过这个问题)。

该服务器用于提供 PHP 应用程序。

编辑:Apache 配置了 prefork 模块,并且 MaxRequestsPerChild 设置为 4000。

答案1

快速解决方案是使用MaxRequestsPerChild (number)(例如 10000)让 Apache 在处理那么多请求后重新启动每个工作程序。这将丢弃重新启动时使用的内存。

不过,276m 这个数字并不是每个进程使用的内存量。这里对“top”中显示的数值的解释很有帮助:

虚拟仿真测试系统:虚拟映像(kb)任务使用的虚拟内存总量。它包括所有代码、数据和共享库以及已换出的页面。(如果您使用 APC,它使用的内存空间也将包含在此值中)

可再生能源:驻留大小(kb)任务已使用的非交换物理内存。

自发性高血压:共享内存大小(kb)任务使用的共享内存量。它只是反映可能与其他进程共享的内存。

在“顶部”,您可以添加“数据”列 数据:数据+堆栈大小(kb)用于除可执行代码以外的物理内存量,也称为“数据驻留集”大小或 DRS。

该“数据”值更接近于该特定进程所使用的唯一内存,可能并没有那么多。将这 276M 加起来并得到接近 2GB 的数字意味着你重复计算了很多东西。

答案2

请发布从顶部开始的完整屏幕截图,而不仅仅是 httpd 进程(apache如果需要,可以按用户进行过滤)。

顶部的 Mem 和 Swap 部分显示了很多有用的信息 - 例如以下内容来自我的一个系统:

内存:总计 16415160k,已用 16360604k,可用 54556k,缓冲区 173948k
交换:总计 16779768k,已使用 28700k,可用 16751068k,缓存 5006768k

看起来所有内存都在使用中,不是吗 - 全部16Gb!?!?

实际上这是一件好事,因为正如您所看到的,系统实际上没有使用任何交换空间,并且 5Gb 的内存被用作缓存。

Linux 上的情况是,如果有任何可用内存,内核将分配该内存用于文件系统缓存和 I/O 缓冲。这样系统就可以从内存中检索文件系统数据,而不必每次都从磁盘读取。如果某个进程需要内存,那么缓存将缩小一点,并将内存分配给该进程。

相关内容