最近我注意到,httpd进程开始消耗大量的内存 – 经过一段时间,几乎所有的2GB内存都被服务器使用了,而且我没有任何其他的内存空间。 以下是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应用程序。
编辑:Apacheconfigurationprefork模块和MaxRequestsPerChild设置为4000。
快速的解决scheme是使用MaxRequestsPerChild (number) (例如10000)让Apache在重复请求之后重新启动每个worker。 这将丢弃重新启动时使用的内存。
276m的数字并不是每个进程使用的是多less。 在“顶部”中显示的值的解释在这里是有帮助的:
VIRT :虚拟映像(kb)该任务使用的虚拟内存总量。 它包括所有代码,数据和共享库以及已被换出的页面。 (如果您正在使用APC,则其使用的内存空间也将包含在此值中)
RES :常驻大小(kb)任务使用的未交换物理内存。
SHR :共享内存大小(kb)任务使用的共享内存量。 它只是反映了可能与其他进程共享的内存。
在“顶部”,您可以添加“数据”列。 数据 :数据+堆栈大小(kb)专门用于非可执行代码的物理内存量,也称为“数据驻留集”大小或DRS。
“数据”值更接近于特定进程使用的唯一内存,这可能不是那么多。 把这些276M加起来,得到一个接近2GB的数字,意味着你会重复计算很多东西。
请从顶部发布一个完整的截图,而不仅仅是httpd进程(如果你愿意,可以通过apache用户进行过滤)。
顶部的Mem和Swap部分在这里显示了很多有用的信息,例如以下是来自我的一个系统:
Mem:总共16415160k,使用16360604k,54556k免费,173948k缓冲 互换:16779768k共计,28700k使用,16751068k免费,5006768kcaching
看起来像所有使用的内存不是 – 全部16Gb!?!
其实这是一件好事,因为你可以看到系统没有使用(实际上)任何交换空间,并且5Gb的内存被用作caching。
Linux上会发生什么,如果有任何可用的内存空间,那么内核将分配文件系统caching和I / O缓冲。 这允许系统从内存中检索文件系统数据,而不是每次都从磁盘读取数据。 如果一个进程需要内存,那么caching会缩小一点点,并将内存分配给进程。