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

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

我在 Dreamhost 上有一个运行 apache 的 VPS,内存一直不足。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 的主题不使用精灵?

谢谢!

答案1

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

  • 在合理的时间范围内跟踪您的内存使用情况,并查看其变化程度(以及是否可以将其与诸如流量增加之类的因素关联起来)。
    • 如果你已经有一些监控工具(例如 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 等)需要多少内存。重新启动 Apache
      • 计算您的总内存和基本系统使用的内存之间的差值,为安全起见减去一点(至少 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 - 它将帮助您缩小、优化图像等 - 尽管确实需要花费一些精力才能正确设置。除此之外,您可以根据自己的喜好修改主题或使用其他主题。确保图像等由用户的浏览器缓存。可能减少某些类型资产(例如静态对象)的日志记录

答案2

如果可能的话,从 Apache 切换到 lighttpd 或 nginx。它们可以提供静态内容非常有效地。然后为动态内容配置 FastCGI 或 fcgid 之类的东西。这样,您就可以有效地分离静态内容和动态内容,并将它们相互隔离。

是的,我故意省略了我使用的每个关键词的网络链接;请用 Google 搜索它们并决定哪个适合您的需求。

答案3

我建议您放弃 CGI/FastCGI,转而使用 PHP-FPM + nginx。PHP-FPM 会保留一个生成的 PHP 解释器池,并且不会为每个请求生成每个解释器(我认为 FastCGI 也会这样做)。

从我自己的测试来看,结合配置良好的字节码优化器(我使用 APC,效果不错),内存消耗至少下降 15%,最高下降 35%。真正的问题是远离 Apache 和 FastCGI,因为 Apache 工作池生成了太多子进程,而每个子进程又生成 PHP 解释器,这在 4/5 天后就导致内存不足/交换,性能不佳。

如上所述,分析一下现在是什么在消耗你的记忆力,我敢打赌 APC 正在造成按照这个帖子

答案4

我可以确认 MediaWiki 的内存使用量很高 - 但仅限于编译后的 PHP 字节码。APC 缓存查看器显示,经过几次点击后,编译后的字节码大约为 20 MB。所有“正常”站点(不使用 WordPress、Drupal 或 Joomla)的字节码都小于 1 MB。

然后是 PHP 报告的实际内存使用情况:快速测试显示,MediaWiki 页面加载仅消耗大约 5 MB 内存,与 Joomla 的内存使用情况基本相同。一些更轻量级的内容管理系统使用的内存要少得多:每页加载约 1.8-3 MB(当然取决于页面结构的复杂性)。

至于内存使用率低的问题,我见过标准的 WordPress 安装和一个非常简单的页面可能占用多达 20-30 MB 的内存,而更复杂的页面结构占用的内存更多,占用的 CPU 时间也更多。所以 DreamHost 确实知道最常见的问题。

相关内容