Apache 使用所有 16 GB 内存,如何限制其进程和内存使用?

iCy*_*org 2 apache out-of-memory ubuntu-14.04

我们在 16GB AWS 实例上,我发现它真的很慢。当我跑

ps -aux | grep apache
Run Code Online (Sandbox Code Playgroud)

我可以看到大约 60 多个 apache 进程。

在此处输入图片说明

当我跑

watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"
Run Code Online (Sandbox Code Playgroud)

它显示了 apache 使用的几乎所有内存。

在此处输入图片说明

当我跑

curl -L https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl
Run Code Online (Sandbox Code Playgroud)

要查看如何优化 Apache,它建议我增加 MaxRequestWorkers 的数量,因此我将其设为 550。我还将 MaxConnectionsPerChild 从 0(无限制)更改为 10000。

这是我的 /etc/apache2/mods-enabled/mpm_prefork.conf 文件

<IfModule mpm_prefork_module>
        StartServers              5
        MinSpareServers           5
        MaxSpareServers          10
        MaxRequestWorkers        550
        MaxConnectionsPerChild   10000
</IfModule>
Run Code Online (Sandbox Code Playgroud)

你能告诉我我们如何优化 apache 内存使用,这样它就不会导致整个站点瘫痪吗?

小智 8

我在 EC2 中的一个实例遇到了类似的问题,这就是我所做的并建议:

  1. 如果您使用的是 prefork,请确保通过键入这两个命令来加载模块 apache2 -lsudo apache2 -M 如果您可以在这两个命令中的任何一个的结果中看到加载了 prefork 模块,则进入下一步。否则,请确保先加载它,否则您将毫无意义地更改配置。

  2. 运行此命令以查找每个 apache2 进程使用的平均内存ps aux | grep 'apache2' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'调用该值x

  3. 使用重新启动您的 apache 服务器sudo service apache2 restart并记下您有多少可用内存。我所做的是200MB-500MB从空闲内存中减去一个额外的缓冲以备后用。调用那个值y

  4. 将空闲内存的值除以y每个进程使用的内存量,x这就是MaxRequestWorkers = y/x

  5. 至于MaxConnectionsPerChildthen的值,您可以对其进行调整,直到获得正确的配置。如果它太大,那么该进程将在被杀死之前继续使用越来越多的内存。如果它太小,那么进程会死得太快,这会给您的系统带来开销。我通常把它放在4000和之间10000

  6. 其中一些步骤是从以下链接中接受的答案中获取的:StackExchange:httpd 内存使用,其中一种解决方案还建议在不需要某些模块时禁用它们。

我建议您先执行步骤 1-5,看看是否能解决您的问题!

祝你好运!