Walter 向您演示如何
为 Apache Web 服务器
优化内存分配

walter_move_ec2

由于我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例上存在内存压力,在该实例上运行的 Apache Web 服务器间歇性地变得无响应。我该如何解决这个问题?

在运行 Apache Web 服务器的实例上,造成内存压力的两个最常见原因是:应用程序内存泄漏,或低效的 Apache 配置导致交换。

诸如“oom-killer”、“分支进程失败”这样的系统日志消息或其他关于内存不足的消息通常意味着 EC2 实例的内存已耗尽。 

查看系统日志消息

您可以从终端会话或 Amazon EC2 控制台查看系统日志消息。

要查看来自终端会话的系统日志消息,请建立到 EC2 实例的终端会话。您可以在以下位置之一查看 EC2 实例的系统日志消息:

Linux Distro 系统日志位置
Debian 或 Ubuntu /var/log/syslog
CentOS 或 RHEL /var/log/messages
使用 systemd 的系统 journalctl

要从控制台查看系统日志,请打开 Amazon EC2 控制台,然后选择 EC2 实例。从操作菜单中,选择实例设置,然后选择获取系统日志

检测内存泄漏

1.    启动到 EC2 实例的终端会话。如果无法连接,则可能需要重新启动实例。

2.    在终端会话中,运行 top 命令以在 EC2 实例上显示内存驻留进程列表。

3.    按所用内存百分比的降序顺序对列表进行排序。要对基于 rpm 的实例进行排序,请按 Shift+O,然后按 n。在其他 Linux 发行版上,选择适当的选项以按内存使用情况对进程进行排序。

4.    扫描为 Apache 进程返回的 %MEM 值所组成的列,并计算平均值。

5.    如果一个或多个 Apache 进程与其他 Apache 进程的 %MEM 值相比具有异常大的 %MEM 值,则可能存在内存泄漏。此内存泄漏可能是由于服务器上运行的 Web 应用程序造成的。

6.    编辑 EC2 实例的 httpd.conf 文件,并将 MaxConnectionsPerChild 配置变量的默认值从 4000 更改为 1000。请注意,MaxConnectionsPerChild(Apache 2.3.9 或更高版本)以前称为 MaxRequestsPerChild。旧名称仍受支持。

此更改可减少 EC2 实例上的内存压力,直到可识别和解决内存泄漏的根源。

7.    在终端会话中,通过运行 service 命令重新启动 Web 服务器:

service httpd graceful

减少交换的可能性

您可以通过设置 MaxRequestWorkersServerLimit 配置变量,来设置生成的进程数限制。请注意,在 Apache 2.3.13 之前,MaxRequestWorkers 称为 MaxClients。旧名称仍受支持。

限制为用户提供服务的进程数可防止服务器因 RAM 短缺而发生交换。通过将 Apache 进程的典型平均内存使用量除以您要分配给 Apache 的内存总百分比,来计算限制值。

1.    按照以下方式计算 MaxRequestWorkers(或 MaxClients)和 ServerLimit 配置变量的限制值:

如果您的 EC2 实例具有超过 4 GB 的 RAM:

用 90% 除以 Apache 进程的平均 %MEM 值。例如,假设平均 %MEM 值为 0.8%,将 90% 除以 0.8%

0.9 / 0.008 = 112.5

将结果舍入到最接近的整数。在本示例中,限制值为 112。

如果您的 EC2 实例具有不超过 4 GB 的 RAM:

用 80% 除以 Apache 进程的平均 %MEM 值。例如,假设平均 %MEM 值为 0.8%,将 80% 除以 0.8%,结果为 100。

注意:计算这些值的假设前提是,实例是专用 Web 服务器。如果要在服务器上托管其他应用程序,请在执行计算之前从 90% 或 80% 中减去这些应用程序使用的内存总百分比。如果在具有 4 GB 或更少 RAM 的实例上运行除 Apache 之外的其他应用程序,性能可能会降低。

2.    编辑 EC2 实例的 httpd.conf 文件,更新 MaxClients(或 MaxRequestWorkers)和 ServerLimit 配置变量,并保存更改。例如:

MaxClients  112 
ServerLimit 112

3.    通过从终端会话运行 service 命令,重新启动 Web 服务器:

service httpd graceful

此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 访问 AWS 支持中心

发布时间:2016 年 1 月 7 日

更新时间:2019 年 1 月 4 日