我很好奇Apache如何处理如何将内存分配给它创build的每个进程。 我目前正在运行一个Debian服务器。
现在我的服务器有8GB的内存,现在已经有7天了。 现在它显示我的服务器有大约50MB的可用内存。
当我运行“top -u www-data”时,我看到所有正在运行的Apache进程。 在VIRT列中,我看到每个过程都在354米,RES列在9254到60米之间变化。
我觉得奇怪的是,当我重新启动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>
现在,当我访问服务器时,我没有看到任何性能问题。 平均负载持续时间很长,我似乎只有很less的可用内存。 几乎不会调换(760k是我见过的最高的)。
我似乎只是担心Apache正在占用太多内存。 如果这是正常的,它不会导致服务器自杀,我可以学习忍受这一点。 这似乎不正确。
任何投入将不胜感激。 谢谢
约什·彭宁顿
VIRT大小不是很有用。 它包括各种不被真正使用的映射内存页面。 请看看RES。 RES减SHR更接近您的实际每进程内存足迹。
某些过程60m的RES比我想象的要高一些。 你是否使用任何可能分配大量内存的模块(mod_perl,mod_php,mod_python)?
你知道你正在使用哪个模块吗? mpm_worker_module还是mpm_prefork_module ? 使用它们中的任何一个,都可以调整StartServers和MinSpareServers / MinSpareThreads的数量。 这将降低Apache在启动时消耗的初始资源量。 但是,随着stream量的增加,Apache将继续分叉/产生额外的进程/线程来处理负载,资源将会增加。
另外,忽略你的服务器有多less“空闲”的内存。 如果Linuxfind可用的内存,它将使用它来caching磁盘中的数据以及充当缓冲区。 如果“caching”中有大量数据,那么系统运行良好。 如果实际进程需要更多的内存,你会发现Linux将从Cached中清除一些内存,并将其提供给需要的进程。