关于Apache和内存使用的问题

关于Apache和内存使用的问题

我很好奇 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_modulempm_prefork_module?使用其中任何一个,您都可以调低数字StartServersMinSpareServers/ MinSpareThreads。这将降低 Apache 在启动时消耗的初始资源量。但是,随着流量的增加,Apache 将继续分叉/产生额外的进程/线程来处理负载,资源将会增加。

另外,不要管你的服务器有多少“可用”内存。如果 Linux 找到可用内存,它会将其用于缓存磁盘数据并充当缓冲区。如果“缓存”中有大量数据,则表明你的系统运行良好。如果实际进程需要更多内存,你会发现 Linux 会从缓存中清除部分内存并将其提供给需要的进程。

相关内容