答案1
在我的例子中,Apache 在mod_php
具有 2GB RAM 的 Centos 64 位 VM 上运行。当我最初安装 Apache 2.4 时,一切运行良好,父 Apache 进程(由 root 拥有)将消耗大约 10 MB 的内存。
后来,当我检查时top
,父进程和所有子进程消耗了 28% 的服务器内存(每个大约 500 MB)。在摆弄了许多设置、mpm forks 和 max servers 等之后,我终于重启了yum remove php
Apache。内存消耗恢复正常 10 MB。这让我相信是 PHP 设置导致了问题。所以我php.ini
从另一台服务器复制过来并重新安装了 PHP(使用yum install php
),一切又恢复正常了。比较这两个php.ini
文件,我发现我之前链接过browscap
,php.ini
它是一个 60 MB 的文件,会在启动时加载到内存中。
所以请检查一下,你可能遇到类似的事情。
答案2
apache/php 内存占用的超级粗略公式是:(工作进程数)x(每个工作进程的最大内存)。实际上,它们是运行 mod_php 还是 php-fpm 进程的 apache 子进程并不重要。
例如,如果您运行的是常规旧版 apache pre-fork mpm,采用默认MaxClients
设置(256),并且 php.ini 的memory_limit
设置为 128MB,那么您的整体 apache 内存占用量可能会高达 32GB!
现在,如果您的服务器基本处于空闲状态且没有流量,它就不会到达那里,但实际上只需要向一个 wordpress(或 drupal 或任何其他)页面发出一个请求,一个工作进程就可以分配大部分 128MB。当您考虑到浏览器并行发出多个请求时,您很容易看到一个简单的设置仅通过几次页面浏览量就飙升至 1GB。
在现实世界中通常不会相当这很糟糕,因为即使每个工作进程都尝试分配该内存,内核也足够智能,可以意识到它们加载的 80% 都是相同的东西,因此它们可以认为它们在内存中拥有自己的 wordpress 副本,而实际上它们只是共享一个。
因此,要回答如何让 Apache 使用更少的 RAM 的问题,只需降低其中一个或两个数字,直到您对内存占用量感到满意(当然您的网站仍能正常工作)。我个人喜欢将 MaxClients 设置为机器上可用 CPU 核心数的 4 倍。
不过,我确实觉得有必要指出,你应该考虑到你最好的选择很可能是什么都不做。许多人对内存消耗抱有错误的节约心态,认为如果内存使用率为 90%,就代表某种浪费或问题。事实恰恰相反!如果此服务器的目的是用动态 php 响应的结果来响应 http 请求,那么它应该需要使用 90% 的内存才能完成此操作。让内存保持空闲/可用状态就是浪费。诀窍是进行调整,以便您使用最多你的内存,但要留出足够的空间以免引起交换。