Apache 占用了 2GB 的内存

Apache 占用了 2GB 的内存

我有一台 1GB VPS 服务器,运行 12.0.4 ubuntu。一切运行正常,大多数时候我的 RAM 使用量显示约为 700 MB。但是每周左右服务器都会随机出现内存不足并崩溃的情况。它会恢复并启动除 Mysql 之外的所有服务。

我发现我没有交换内存,所以我创建了 256MB 交换文件并对其进行配置。它运行正常,但两周后这次仍然崩溃。

我不是专家,因为您已经知道了。所以,我想请教一下为什么我的服务器在正常运行时占用了这么多内存。我的意思是,我在不同时间观察它,它总是占用 700-800MB 内存,并且负载稳定。没有在晚上运行的 cron 之类的。我有几个wordpress blog,但它们的负载稳​​定,从未看到任何“大容量”负载。

我确实有 Vesta 控制面板,据我所知,所有报告都是正常的。然而,我注意到的一件事是,Apache 总是显示 1900MB 的内存消耗,而我的系统总内存较低。我安装了 nginx 反向 Web 服务器[不确定 vesta 为我做了什么]。其他一切都很好,只是 apache 一直处于 1900MB。而且似乎当这个使用量增加时,它会导致服务器崩溃。

那么,有没有什么方法可以减少 apache 的使用?我还应该采取什么措施来使我的服务器在当前负载下保持稳定。

编辑:

根据建议,这是我的 MPM 配置

<IfModule mpm_prefork_module>
    StartServers          8
    MinSpareServers       5
    MaxSpareServers      20
    ServerLimit         256
    MaxClients          200
    MaxRequestsPerChild 4000
</IfModule>

这是我的apache2ctl -l

Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  prefork.c
  http_core.c
  mod_so.c

虽然我之前提到过,但我在服务器上运行基于 Wordpress (PHP) 的博客,还有Redmine(Ruby on Rail),它使用 Nginx 和 apache 运行,方式与其他网站相同。不,我不使用 python。

答案1

Apache prefork MPM配置有ServerLimit256 表示您已将其配置为最大内存使用量约为 256 个进程,典型的 PHP5 Apache 模块中每个进程大约占用 15-30 MB 内存。计算一下,您就会知道,在客户端数量众多的小型服务器上,内存使用量会激增。

相反,要用更严格的限制来配置它。例如

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit         25
    MaxClients          20
    MaxRequestsPerChild 4000
</IfModule>

重新启动 Apache 以使用新的 MPM 配置。

这将使 Apache 以 5 个进程启动,确保它有 5 个进程可供新来的客户机使用,只有当超过 10 个进程未使用且硬限制为 25 时才关闭进程。根据您的需要进行调整。

或者,研究使用PHP-FPM而不是将 PHP 作为 Apache 模块。这效率更高,也是 Ubuntu 14.04 的默认配置。请注意,您将拥有一个单独的 PHP 进程池,并且您将不是然后使用 Apache prefork MPM(以及它更高效的确切原因)。

只需阅读常规 Ubuntu/Apache/PHP-FPM 文档即可了解如何配置所有这些。

答案2

在一台服务器上安装 mysql 和 apache 是个非常糟糕的主意。用户越多,访问数据库的权限就越大,当然,数据库也会使用 CPU 和内存。因此,您让 apache 不停地查询,用户会变得不耐烦,可能需要重新加载页面,甚至进行更多查询。您知道我哪里说对了吗?在您的情况下,不仅是 apaxhe,mysql 也需要使用相同的稀疏资源。

我告诉你,不要用 apache(大炮)去杀一只鸟(80 个用户)。使用 nginx(-npm),更轻量,不会消耗那么多资源。

大多数人不明白 Apache 要求资源用于可能的连接(因此建议降低这一点)

此程序被编写为可随时提供页面。因此,它将占用资源(即使没有连接,也一样)并保持它们处于活动状态。抱歉,我不是英语母语人士,所以我希望我能以您理解的方式解释它。简短版本 80 用户和 apache 在小型虚拟主机上不匹配!使用 nginx,这应该可以解决您的问题,否则将数据库移至另一台小型服务器。

相关内容