没有任何访客的情况下 Apache 的 RAM 使用率很高

没有任何访客的情况下 Apache 的 RAM 使用率很高

我最近购买了一台 VPS 服务器,配置如下

  • Centos 6 64位
  • 20GB 固态硬盘
  • 512MB 内存
  • 512 VSwap

我托管了大约 10 个网站。其中 4 个是 WordPress。其他是动态(PHP)网站。我的访客很少。但是当我检查 RAM 时,我发现 Apache 占用了大部分内存。当 apache 运行时,内存使用率约为 97%。当停止 apache 时,内存使用率变为 30%。

我该如何配置 Apache 以使其使用更少的 RAM?

在此处输入图片描述

我听说将 InnoDB 转换为 MyISAM 可以解决内存使用问题。但我的 MySQL 只使用较少的内存

答案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 phpApache。内存消耗恢复正常 10 MB。这让我相信是 PHP 设置导致了问题。所以我php.ini从另一台服务器复制过来并重新安装了 PHP(使用yum install php),一切又恢复正常了。比较这两个php.ini文件,我发现我之前链接过browscapphp.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% 的内存才能完成此操作。让内存保持空闲/可用状态就是浪费。诀窍是进行调整,以便您使用最多你的内存,但要留出足够的空间以免引起交换。

相关内容