我很好奇 Apache 如何处理它创建的每个进程的内存分配。我目前正在运行 Debian 服务器。
目前我的服务器有 8GB 内存,已经运行了大约 7 天。目前显示我的服务器有大约 50MB 可用内存。
当我运行“top -u www-data”时,我可以看到当前正在运行的所有 Apache 进程。在 VIRT 列中,我看到每个进程都在 354m,RES 列在 9254 和 60m 之间变化。
我觉得奇怪的是,当我重新启动 Apache 时,进程 ID 确实发生了变化,但它们会自动恢复占用大约相同数量的内存。
基本上我担心的是 Apache 占用了太多内存。目前我已将 MaxKeepAliveRequests 设置为 100,将 KeepAliveTimeout 设置为 3。我还设置了以下指令:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 200
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
现在,当我访问服务器时,我并没有真正看到任何性能问题。平均负载通常保持很长时间,我只是似乎拥有相当低的可用内存量。它几乎不会交换(760k 是我见过的最高值)。
我只是担心 Apache 占用了太多内存。如果这是正常的,并且不会导致服务器自我关闭,我可以学会忍受这种情况。但这似乎不太对劲。
任何意见都将不胜感激。谢谢
乔希·彭宁顿
答案1
VIRT 大小不是很有用。它包括各种实际上未使用的映射内存页面。请改为查看 RES。RES 减去 SHR 更接近实际的每个进程内存占用量。
某些进程的 RES 为 60m,比我预期的要高一些。您是否使用了可能分配大量内存的模块(mod_perl、mod_php、mod_python)?
答案2
您知道您正在使用哪个模块吗?mpm_worker_module
或mpm_prefork_module
?使用其中任何一个,您都可以调低数字StartServers
和MinSpareServers
/ MinSpareThreads
。这将降低 Apache 在启动时消耗的初始资源量。但是,随着流量的增加,Apache 将继续分叉/产生额外的进程/线程来处理负载,资源将会增加。
另外,不要管你的服务器有多少“可用”内存。如果 Linux 找到可用内存,它会将其用于缓存磁盘数据并充当缓冲区。如果“缓存”中有大量数据,则表明你的系统运行良好。如果实际进程需要更多内存,你会发现 Linux 会从缓存中清除部分内存并将其提供给需要的进程。