我有一个运行apache的VPS,在Dreamhost上的内存不足。 Dreamhost说问题是WordPress的configuration,但我认为这是他们的股票答案。 我看了,主要的networking托pipe来自mediawiki。 我有时会有20-30个http进程在运行,他们都在运行php,而mediawiki正在为我的前两个站点提供动力。
所以我正在寻找方法来减lessmediawiki的内存占用的build议。 我目前正在运行版本1.16.4,我看到的是显着落后于当前版本。 (Dreamhost应该为我升级,但显然他们没有。)
我的第一个build议是确保你正在解决正确的问题。
- 在合理的时间范围内跟踪你的内存使用情况,看看它有多高(如果你可以将这一点与增加的stream量相关联)。
- 如果你已经有一些监测(如Munin),你应该能够看到记忆的趋势
- 否则,使用sar(例如,如果你已经安装了,sar -r -f / var / log / sa / sa17会给你今天的内存信息)。
确定哪些进程实际上正在使用你的内存。
- 您的问题可能不直接与MediaWiki相关。 虽然PHP可能会消耗大量的内存,但是MySQL和Apache尤其适合大量的内存使用。
- 使用top(或htop)或ps aux –sort -rss来查看哪些进程消耗的内存最多。
- 如果你的问题是PHP,你可能会成功地减lessphp.ini中的memory_limit
减lessApache的内存使用量
- 20到30个apache进程会消耗大量的内存(可能超过500MB)
- 如果可以,请从Apache切换到轻量级Web服务器,如nginx或lighttpd。 这些应该适用于大多数CMS,但不支持某些configuration(例如使用.htaccess文件)。
- 消除你不需要的apache扩展–apache会将它自己的一个几乎完整的拷贝(包括所有的扩展等)加载到它处理的每个请求的内存中。
- 减lessApache产生的服务器进程的数量。 Apache进程通常每个启动大约10MB,每次使用可以增加到30 + MB。
- 如果宕机时间是可以接受的,请考虑以下方法(否则只是估算和计算):
- 使用几个小时后,查看Apache进程使用的平均内存
- 停止Apache并记下你使用过的内存 – 这应该告诉你你的操作系统和所有正在运行的服务(MySQL等)需要多less。 重新启动Apache
- 把你的总内存和你的基本系统使用的内存之间的差异,减去一点(至less10%)的安全性,除以你的平均Apache进程大小。
- 为StartServers,MinSpareServers,MaxSpareServers和MaxClients设置较低的值。 保持MaxClients低于上面计算的数字,其他值仍然更低。
- 将MaxRequestsPerChild设置为一个非零值(100-300应该是好的)
- 使用更less的服务器进程,您不需要太长时间 – 所以确保您的KeepAliveTimeout低(10秒应该是足够的,可能更低,不超过15秒 – 值取决于您的网站如何使用)
有关这个非常好的指南,以优化Apache的低内存的其他build议。
17.2版本的占地面积是否低于16.2?
- 实际上它们之间只有6个版本(16.2-16.5,17.0-17.2),此外,次要版本通常是安全更新 – 所以我不希望有重大变化,除了版本17.0(快速查看更新日志不build议对内存pipe理进行任何重大更改)。 如果你真的认为这是问题,那么启动一个虚拟机(例如VirtualBox),安装这两个版本,然后运行一个负载testing(ab,siege,httperf等) – 监视内存使用情况并比较结果。
有一个聪明的方法,我可以使用caching来减less内存量?
- 这取决于你的问题的来源是什么:
- 如果这是PHP生成您的网页的静态副本,当他们改变,并提供这些。
- 如果你的问题与Apache有关,服务静态资产仍然需要大量的内存(尽pipecaching总是一个好主意)。
- 您可以使用CDN来减less对静态资产的请求 – 这将有助于Apache的内存使用。
有一些不太理想的select,你可以考虑:
- 使用一个轻量级的服务器作为反向代理 – 这将有助于静态请求,如果这些构成了你的请求的大部分,应该有助于内存使用(在Apache被正确调整之后) – 但是,运行一个额外的服务器使用一些额外的内存(并增加了系统的复杂性)。
- 使用诸如Varnish之类的caching层(通常这是为了从内存中运行),目的是以使用更多内存为代价更快地提供页面 – 但是,您可以将其设置为使用文件作为caching。 就像使用反向代理一样,这将减less后端的负载,但是本身需要一些内存 – 如果你正在试验,你可以看到增益是否抵消了成本。
- validation您的操作码caching(例如APC)是否正在工作,并可能使用文件备份存储而不是内存来存储caching。
为什么我同时运行apache httpd和php5.cgi?
- 可能是因为您正在使用FastCGI。 对PHP文件的请求不是由Apache执行的(mod_php就是这样),而是由PHP的CGI接口执行。 您可能会发现另一个CGI接口(PHP-FPM)提供了更好的资源pipe理(它可以与mod_fastcgi一起使用)。
有没有一个简单的方法来找出哪些mediawiki部分使用最ram?
- 我build议最好的方法来完成这个是禁用任何你可以(扩展/插件等),并运行负载testing。 你可能在一些分析器(例如XDebug)方面有一些成功,但是我不认为结果会很容易采取行动(而且通常更倾向于花费时间)。 如果您的请求需要很长时间才能执行,则某些stream程pipe理器(例如PHP-FPM)会提供“缓慢日志”function。
有没有办法减less提取的文件数量? 我的networking日志充满获取到user.gif,bullet.gif,external.png,document.png — mediawiki的主题怎么不使用精灵?
- 你可以看看谷歌的mod_pagespeed – 这将帮助你缩小,优化图像等 – 但是,它需要一些努力来正确设置。 除此之外,您可以根据自己的喜好修改主题或使用其他主题。 确保用户的浏览器caching图像等。 可能会减less特定types资产的logging(例如静态对象)
如果可能,从Apache切换到lighttpd或nginx。 那些可以非常有效地为您的静态内容。 然后为你的dynamic内容configurationFastCGI或fcgid。 这样可以有效地分离静态和dynamic内容,并将这些内容隔离开来。
是的,我故意遗漏了我使用的每个关键字的网页链接。 谷歌他们,并决定什么适合您的需求。
我build议你从CGI / FastCGI迁移到PHP-FPM + nginx。 PHP-FPM保留了PHP解释器池,并且不会为每个请求产生每一个解释器(我认为即使是FastCGI也是如此)。
从我自己的testing中看到,与configuration良好的字节码优化器(我使用APC的效果不错)相比,内存消耗降低了15%,最高可降低35%。 真正的交易正在从Apache和FastCGI中走出来,因为Apache的工作人员池产生了太多的孩子,而他们每个人都反过来产生了PHP解释器,这些解释器在4/5之后才导致内存不足,交换性能差。
正如上面所提到的,分析什么是现在正在吃掉你的记忆, 我敢打赌,APC是按照这个职位 造成 的
我可以确认MediaWiki的高内存使用情况 – 但只有编译好的PHP字节码。 APC高速caching查看器揭示了编译后的字节码在几次命中之后大约为20 MB。 所有“正常”网站(不使用WordPress,Drupal或Joomla)的字节码都小于1MB。
然后是由PHP报告的真正的内存使用情况:一个快速testing表明,一个MediaWiki页面加载只消耗约5 MB的内存,几乎相同的Joomla。 一些更轻量级的内容pipe理系统使用更less:每页加载1.8-3 MB(当然取决于页面结构的复杂性)。
至于坏内存的使用,我已经看到,虽然,一个标准的WordPress安装和一个非常简单的页面可能会使用高达20-30 MB的内存,更复杂的页面结构更多和相当多的CPU时间。 所以DreamHost真的知道最常见的问题。