我一直在努力改善 Centos 5.5 VDS 的内存使用情况,现在它有 512MB 的 RAM。我能够使用一个优化脚本来大大改善 MySQL 配置,但在降低 Apache 的内存使用率方面遇到了一些麻烦。我遇到的问题部分是各种网站、论坛等上提供的建议相互矛盾。作为一台生产服务器,我在测试机上采用的正常修改和测试周期会有点太混乱。
更让我困惑的是,我有一台配置尽可能接近 VDS 克隆的开发机,它使用更少的 RAM 和完全相同的 Apache 配置。虽然显然很难施加相同的负载,但在白天或晚上的安静时间比较两者时,我得到的结果是相当接近的。
是否有适用于 Apache 的调整脚本(类似于 MySQL 的脚本),可以通过分析服务器运行时发生的情况来帮助优化配置?
编辑:
要么是我说得不清楚,要么是人们没有阅读这个问题,所以我来澄清一下。
我不是要求这里的任何人提出建议或建议替代方案。我只是想问一下,是否有人知道一个脚本,可以分析服务器上发生的事情,并根据这些信息对 Apache 配置提出建议。
答案1
我不知道 Apache 有任何这样的脚本,可能是因为与 MySQL 相比,只有少数几个因素会影响 Apache 的内存使用情况:
- MaxClients:客户端越多,使用的内存越多。
- 模块:同样,安装的模块/扩展越多,所需的内存就越多。
- 动态脚本:运行动态脚本(如 PHP)可能会增加内存使用量,具体取决于您的 Apache 设置。例如,假设您有 10 个小型 PHP 文件和一个很少使用的大型/内存密集型文件。最终,所有 Apache 客户端都将运行这个大型 PHP 脚本并使用更多内存。
- 编译时间:我没有对 Apache 编译时间设置进行过多的尝试,但如果发现它可以节省一些内存,我也不会感到惊讶。
下面列出了您可以尝试的一些具体方法。如果可能,请先尝试衡量效果并在开发平台上进行测试,或者在生产站点上逐步实施任何更改。
- 尽量保持
MaxClients
低位。在流量较少的网站上,你很可能可以将数字控制在 10 以下。你也可以保留其他相关设置喜欢MaxSpareServers
低。 - 比较 Apache 的 prefork 模式和 worker 模式,看看内存使用情况是否存在显著差异。
- 删除所有你实际上不使用的模块/扩展。这可能比听起来更难,因为确定你正在使用哪些模块/扩展并不总是那么容易。
- 使用较低的值 (100-1000)
MaxRequestsPerChild
如果您正在使用任何动态脚本或看到 Apache 实例的内存使用量随时间推移而缓慢增加。这可防止内存匮乏或泄漏脚本占用过多内存。 - 仅在您确实需要或过去有丰富的 Apache 编译经验时才考虑编译时内存优化。我个人建议在执行此步骤之前先研究替代服务器。
答案2
为什么不考虑使用内存占用小的 Web 服务器:NGINX?它因内存占用低而广受好评,推荐用于在 VPS 上运行的站点。
无论如何,现在 400MB 对于 Web 服务器来说不算多,你可能要考虑更换服务器了!Apache2 占用大量内存。必须对其进行配置,而配置选项令人困惑。
编辑你的 apache 配置,通常在 /etc/apache2/apache2.conf 中
在 mpm_prefork_module 设置中,将 StartServers 设置为 1,将 MinSpares 设置为 1 或 0,将 MaxSpares 设置为 3 之类的值。例如,运行 10 个进程将使 512mb 的服务器超载(Apache2 的默认最小值为 256mb,但您对此无能为力!)。为了减少服务器上的占用空间/少量流量,您可以尝试以下操作:
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 3
MaxClients 150
MaxRequestsPerChild 500
</IfModule>
在测试流量负载时更改上述设置,以查看新设置是否可以处理。
您可以将 Apache 的 KeepAlive 调低为较低的值(在我的情况下为 2~5),这样可以减少等待空闲客户端连接的服务器进程数,因为这些客户端可能不会再请求任何内容。
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 80
减少服务器在请求失败之前等待的时间:
Timeout 45
您还可以阅读以下文章:http://httpd.apache.org/docs/2.0/misc/perf-tuning.html
但同样,这种设置适用于流量非常小的情况NGINX 可以使用相同的硬件完成更多任务。