如何减少mediawiki的内存使用量?

vy3*_*y32 1 vps mediawiki memory-usage dreamhost

我有一个运行 apache 的 VPS,它在 Dreamhost 上内存不足。Dreamhost 说问题在于 wordpress 配置,但我认为这是他们的标准答案。我看过了,主要的网络托管来自mediawiki。我有时会运行 20-30 个 http 进程,它们都在运行 php,而 mediawiki 正在为我的前两个站点提供支持。

因此,我正在寻找有关减少 mediawiki 内存占用的方法的建议。我目前正在运行 1.16.4 版,我认为它明显落后于当前版本。(Dreamhost 应该为我升级它,但显然他们没有。)

  • 17.2 版是否比 16.2 版占用空间小?
  • 有没有一种聪明的方法可以使用缓存来减少内存量?
  • 是否有减少内存的配置选项?
  • 为什么我同时运行 apache httpd 和 php5.cgi?
  • 有没有一种简单的方法可以找出哪些 mediawiki 部分使用的内存最多?
  • 有没有办法减少获取的文件数量?我的网络日志充满了对 user.gif、bullet.gif、external.png、document.png 的提取——为什么 mediawiki 的主题不使用精灵?

谢谢!

cyb*_*x86 5

我的第一个建议是确保您正在解决正确的问题。

  • 在合理的时间范围内跟踪您的内存使用情况并查看它的使用情况(以及您是否可以将其与流量增加等相关联)。
    • 如果您已经进行了一些监控(例如 Munin),您应该能够看到内存趋势
    • 否则,请使用 sar(例如,如果您已经设置了它,则 sar -r -f /var/log/sa/sa17 将为您提供今天的内存信息)。

确定哪些进程实际在使用您的内存。

  • 您的问题可能与 MediaWiki 没有直接关系。虽然 PHP 可能会消耗大量内存,但 MySQL 尤其是 Apache 是大量内存使用的理想选择。
    • 使用 top(或 htop)或 ps aux --sort -rss 查看哪些进程消耗的内存最多。
    • 如果您的问题是 PHP,您可能会成功减少 php.ini 中的 memory_limit

减少 Apache 的内存使用

  • 20 到 30 个 apache 进程会消耗大量内存(可能超过 500MB)
  • 如果可以,请从 Apache 切换到轻量级 Web 服务器,例如 nginx 或 lighttpd。这些应该适用于大多数 CMS,但不支持某些配置(例如使用 .htaccess 文件)。
  • 消除您不需要的 apache 扩展 - Apache 将为它处理的每个请求加载一个几乎完整的自身副本 - 包括所有扩展等 - 到内存中。
  • 减少 Apache 产生的服务器进程的数量。Apache 进程通常从每个 10MB 开始,随着使用,每个进程可以增加到 30+MB。
    • 如果停机时间是可以接受的,请考虑以下方法(否则只需估计并进行数学计算):
      • 使用几个小时后,查看 Apache 进程使用的平均内存
      • 停止 Apache 并记下您使用的内存 - 这应该告诉您您的操作系统和所有正在运行的服务(MySQL 等)需要多少。重启阿帕奇
      • 取总内存与基本系统使用的内存之间的差值,为安全起见减去一点(至少 10%),然后除以平均 apache 进程大小。
  • 为 StartServers、MinSpareServers、MaxSpareServers 和 MaxClients 设置较低的值。保持 MaxClients 低于您上面计算的数字,其他值仍然较低。
  • 将 MaxRequestsPerChild 设置为非零值(100-300 应该不错)
  • 使用较少的服务器进程,您不希望任何捆绑太久 - 因此确保您的 KeepAliveTimeout 较低(10 秒应该足够,可能更低,不高于 15 秒 - 该值取决于您的站点的使用方式)

关于针对低内存优化 Apache 的这个非常好的指南,还有其他建议。

17.2 版是否比 16.2 版占用空间小?

  • 这些之间实际上只有 6 个版本(16.2-16.5、17.0-17.2),此外,次要版本通常是安全更新 - 所以我不希望有重大变化,除了 17.0 版(快速查看更新日志)不建议对内存管理进行任何重大更改)。如果您真的认为这是问题所在,请启动一个虚拟机(例如使用 VirtualBox),安装这两个版本,然后对它们运行负载测试(ab、siege、httperf 等)- 监视内存使用情况并比较结果。

有没有一种聪明的方法可以使用缓存来减少内存量?

  • 这取决于您的问题的根源是什么:
    • 如果是 PHP,则在页面更改时生成页面的静态副本,并提供这些副本。
    • 如果您的问题出在 Apache 上,那么提供静态资产仍然需要大量内存(尽管缓存总是一个好主意)。
      • 您可以使用 CDN 来减少对静态资产的请求 - 这应该有助于 Apache 上的内存使用。

您可能会考虑一些不太理想的选择:

  • 使用轻量级服务器作为反向代理 - 它有助于处理静态请求,如果这些请求占请求的很大一部分,应该有助于内存使用(在 Apache 正确调整之后) - 但是,运行额外的服务器会使用一些额外的内存(并增加了系统的复杂性)。
  • 使用诸如 Varnish 之类的缓存层 - 通常这旨在从内存中运行 - 目的是以使用更多内存为代价更快地提供页面服务 - 但是,您可以将其设置为使用文件作为缓存。就像使用反向代理一样,这将减少后端的负载,但本身需要一些内存 - 如果您准备进行试验,您可以查看收益是否抵消了成本。
  • 验证您的操作码缓存(例如 APC)是否正常工作,并可能使用文件支持的存储而不是内存来存储缓存。

为什么我同时运行 apache httpd 和 php5.cgi?

  • 可能是因为您使用的是 FastCGI。对 PHP 文件的请求不是由 Apache 执行的(就像 mod_php 的情况),而是由 PHP 的 CGI 接口执行。您可能会发现另一个 CGI 接口 - PHP-FPM - 提供了更好的资源管理(它可以与 mod_fastcgi 一起使用)。

有没有一种简单的方法可以找出哪些 mediawiki 部分使用的内存最多?

  • 我建议实现此目的的最佳方法是禁用所有可能的内容(扩展程序/插件等)并运行负载测试。使用某些分析器(例如 XDebug)可能会取得一些成功,但我不认为结果会那么容易执行(并且通常会花费更多时间)。如果您的请求需要很长时间才能执行,一些流程管理器(例如 PHP-FPM)会提供“slowlog”功能。

有没有办法减少获取的文件数量?我的网络日志充满了对 user.gif、bullet.gif、external.png、document.png 的提取——为什么 mediawiki 的主题不使用精灵?

  • 您可以查看 Google 的 mod_pagespeed - 它会帮助您进行缩小、优化图像等 - 尽管正确设置确实需要一些努力。除此之外,您可以根据自己的喜好修改主题或使用其他主题。确保图像等被用户的浏览器缓存。可能会减少某些类型资产(例如静态对象)的日志记录