Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何调整 Apache Web 服务器的内存分配,以防止我的 EC2 Linux 实例中出现内存不足错误?
我在 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例上运行的 Apache Web 服务器间歇性地没有响应。我在实例的系统日志中收到“out of memory”(内存不足)、“oom”、“oom-killer”、“failure to fork process”(分叉进程失败)或其他内存不足消息。
简短描述
默认情况下,Apache 可以同时接受 256 个连接。使用 Apache 配置中的 ServerLimit 来配置此配额。
小型实例类型(例如 t2.small)的内存仅为 2 千兆字节 (GB),无法管理 256 个同时进行的 Apache 连接。因此,当服务器流量过大时,您可能会收到以下错误之一:
- “Out of memory”(内存不足)
- “Oom”
- “Oom-killer”
- “Failure to fork process”(分叉进程失败)
- 关于系统日志中内存不足的说明
要分析您的实例系统日志,请根据您的操作系统 (OS) 发行版查看以下日志文件:
- 对于 Debian 和 Ubuntu,请查看 /var/log/syslog。
- 对于 Amazon Linux、CentOS 和 Red Hat Enterprise Linux (RHEL),请查看 /var/log/messages。
解决方法
为避免实例出现内存错误,请为服务器接受的 Apache 和 httpd 并发连接数设置配额。使用 Apache 配置中的 MaxRequestWorkers (Apache 2.4) 参数来设置配额。对于非线程化的 Prefork 服务器,MaxRequestWorkers 表示 Apache 根据服务器请求启动的最大子进程数。
以下解决方法适用于 Web 服务器使用的默认 Prefork Apache 多处理模块 (MPM) 模型。要确认您的 MPM,请运行以下命令:
# apachectl -V | grep "MPM"
要计算要为 MaxRequestWorkers 设置的近似值,请确定您的工作负载对以下设置的使用情况:
- 您的服务器的物理 RAM
- 其他服务使用内存后剩余的内存
- 占用最多内存的 Apache 进程
**注意:**最佳做法是对 MaxRequestWorkers 使用 REMAINING RAM 的 90-100%,以平衡服务器性能和稳定性。但是,您的工作负载可能有不同的需求。
计算服务器的物理 RAM
要计算 RAM,请运行以下命令:
# free -m | grep Mem: | awk '{print $2}'
计算其他服务使用内存后剩余的内存
首先,计算除 Apache 之外的所有主要服务的内存使用量。针对每个服务运行以下命令:
# usage_mbytes=0; for usage_by_pids in `ps -C $proc_cmd -o rss | grep -v RSS`; do usage_mbytes=$(($usage_mbytes + $usage_by_pids)); done; echo $(($usage_mbytes/1024)) MB;
**注意:**在前面的命令中,请将 $proc_cmd 替换为服务名称或命令。例如,使用 mysqld 来计算 mysqld 服务的内存使用量。
计算出每个服务的内存使用量后,将这些值相加,以得到所有其他主要服务的内存使用总量。
然后,使用以下公式从服务器的物理 RAM(以兆字节 (MB) 为单位)中减去所有其他主要服务的内存使用量:
剩余内存 =(服务器的物理 RAM)-(所有其他主要服务的内存使用量)
确定使用最多内存的 Apache 进程
要确定使用最多内存的进程,请运行以下命令:
# sudo bash -c 'high_mem=0; for pid in $(ps aux | grep -E "httpd|apache2" | grep -v ^root | awk "{print \$2}"); do memory=$(pmap -d $pid | grep "writeable/private" | awk "{print \$4}" | sed "s/[^0-9]//g"); if [[ $memory -gt $high_mem ]]; then high_mem=$memory; fi; done; echo $((high_mem/1024)) MB'
记下该进程使用的内存量。
计算 MaxRequestWorkers
使用以下公式计算 MaxRequestWorkers:
MaxRequestWorkers =(剩余内存 * 90/100)/(最大的 Apache 进程消耗的内存)
注意:请将剩余内存替换为其他服务使用内存后剩余的内存,将最大的 Apache 进程消耗的内存替换为最大进程使用的内存。
上述计算方法同样适用于基于 Ubuntu、Debian 和 RHEL 的系统。但是,Apache 配置路径和文件名取决于操作系统类型。根据您的操作系统设置 MaxRequestWorkers。
**注意:**以下示例使用 Apache 版本 2.4 或更高版本。
Debian 和 Ubuntu
完成以下步骤:
-
要在编辑器模式下打开 /etc/apache2/mods-available/mpm_prefork.conf 文件,请运行以下命令:
# vi /etc/apache2/mods-available/mpm_prefork.conf
-
将 MaxRequestWorkers 参数更改为您计算出的值。
示例:<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers your_value MaxConnectionsPerChild 0 </IfModule>
**注意:**请将 your_value 替换为计算出的 MaxRequestWorkers 值。此外,请根据您的需求配置其他参数。
-
保存文件,然后退出该文件。
-
运行以下命令以执行 Apache 语法检查:
# apachectl configtest
-
如果您收到 Syntax OK(语法正常)的输出,请运行以下命令重启 Apache:
# systemctl restart apache2
Amazon Linux、CentOS 和 RHEL
完成以下步骤:
-
创建一个路径为 /etc/httpd/conf.d/mpm_prefork.conf 的文件,然后添加以下命令块:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers your_value MaxConnectionsPerChild 0 </IfModule>
**注意:**请将 your_value 替换为计算出的 MaxRequestWorkers 值。此外,请根据您的需求配置其他参数。
-
保存文件,然后退出该文件。
-
运行以下命令以检查 Apache 的配置语法:
# httpd -t
-
如果您收到 Syntax OK(语法正常)的输出,请运行以下命令重启 Apache:
# systemctl restart httpd
相关信息

相关内容
- 已提问 2 年前lg...