最近我注意到 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
Run Code Online (Sandbox Code Playgroud)
在我看来,每个 httpd 进程在处理请求后都不会释放内存。所以他们都坐在~270MB,这很糟糕。有没有办法让我知道所有的记忆都去了哪里以及为什么它会保持这种状态?我最近没有做任何服务器调整,所以我确定不是我搞砸了(以前没有遇到过这个问题)。
服务器用于为 PHP 应用程序提供服务。
编辑:Apache 配置了 prefork 模块,MaxRequestsPerChild 设置为 4000。
快速解决方案是使用MaxRequestsPerChild (number)
(例如,10000)让 Apache 在这么多请求后重新启动每个工作程序。这将丢弃重新启动时使用的内存。
276m 数字并不是每个进程使用了多少。'top' 中显示的值的解释在这里很有帮助:
VIRT : Virtual Image (kb) 任务使用的虚拟内存总量。它包括所有代码、数据和共享库以及已换出的页面。(如果你使用的是APC,它所使用的内存空间也会包含在这个值中)
RES : 驻留大小 (kb) 任务使用的非交换物理内存。
SHR:共享内存大小 (kb) 任务使用的共享内存量。它只是反映了可能与其他进程共享的内存。
在'top'中,您可以添加一个'data'列 Data : Data+Stack size (kb) 专用于可执行代码以外的物理内存量,也称为“数据驻留集”大小或DRS。
该“数据”值与该特定进程使用的唯一内存更接近,这可能不是那么多。将这些 276M 相加并得到接近 2GB 的数字意味着您重复计算了很多事情。
归档时间: |
|
查看次数: |
5815 次 |
最近记录: |