温馨提示×

怎样调整CentOS Apache内存使用

小樊
46
2025-09-30 18:31:10
栏目: 智能运维

一、前置准备:确认当前内存使用情况

在调整前,需先了解Apache及系统的内存占用现状,为后续参数设置提供依据:

  • 查看Apache进程内存占用:使用ps aux | grep httpd命令,重点关注%MEM(内存占用百分比)和RSS(实际内存使用量,单位KB)列,识别高内存进程。
  • 实时监控系统内存:通过top命令(按M键按内存排序)或free -m命令,查看系统总内存、已用内存、剩余内存及Swap使用情况。

二、核心调整:修改Apache配置文件(MPM模块参数)

Apache的内存使用主要由**MPM(多处理模块)**决定,CentOS默认使用prefork(进程模式,适合兼容性场景),高性能场景建议切换至worker(线程模式)或event(异步线程模式)。需根据模块类型调整对应参数:

1. 切换MPM模块(可选但推荐)

编辑Apache配置文件(/etc/httpd/conf/httpd.conf/etc/apache2/apache2.conf),注释prefork模块,启用workerevent模块:

# 注释prefork模块(若存在)
# <IfModule mpm_prefork_module>
#     ...
# </IfModule>

# 启用worker模块(示例配置)
<IfModule mpm_worker_module>
    StartServers             2       # 启动时的工作进程数(每个进程包含多个线程)
    MinSpareThreads         25       # 最小空闲线程数
    MaxSpareThreads         75       # 最大空闲线程数
    ThreadLimit             64       # 单个进程的最大线程数(需≤ThreadsPerChild)
    ThreadsPerChild         25       # 每个工作进程创建的线程数
    MaxRequestWorkers      150       # 最大并发请求数(=ThreadsPerChild×StartServers)
    MaxConnectionsPerChild   0       # 每个进程处理的请求数(0=无限制,建议设为1000~10000防内存泄漏)
</IfModule>

注:worker模式通过线程处理请求,内存占用远低于prefork(每个线程共享进程内存)。

2. 调整prefork模块参数(若坚持使用)

若因兼容性需保留prefork模块,需调整以下参数平衡并发与内存:

<IfModule mpm_prefork_module>
    StartServers             5       # 启动时的进程数(根据负载调整)
    MinSpareServers          5       # 最小空闲进程数(避免频繁创建进程)
    MaxSpareServers         10       # 最大空闲进程数(避免内存浪费)
    MaxRequestWorkers      150       # 最大并发进程数(关键参数,需匹配内存容量)
    MaxConnectionsPerChild 1000      # 每个进程处理的请求数(防内存泄漏)
</IfModule>

3. 优化KeepAlive设置

KeepAlive可减少TCP连接开销,但会增加内存占用(长连接保持进程/线程活跃)。调整以下参数:

KeepAlive On                     # 启用KeepAlive
MaxKeepAliveRequests    100      # 每个连接的最大请求数(避免单个连接占用过久)
KeepAliveTimeout        5        # 连接保持时间(秒,建议5~10秒)

注:若网站静态资源多(如图片、CSS),可适当增大MaxKeepAliveRequests;若动态请求多,建议缩短KeepAliveTimeout

三、辅助优化:减少内存占用的其他措施

1. 禁用不必要的模块

Apache默认加载大量模块,禁用未使用的模块可释放内存。执行以下命令查看已加载模块:

httpd -M  # 或 apachectl -M

禁用模块(如statusautoindex):

LoadModule status_module modules/mod_status.so  # 注释掉此行(在配置文件中)

2. 启用缓存模块

通过缓存静态资源(HTML、CSS、JS)减少重复请求,降低内存负载:

# 启用mod_cache和mod_disk_cache
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_disk_cache.so

# 配置缓存路径和大小
CacheEnable disk /
CacheRoot "/var/cache/apache2"
CacheDirLevels 2
CacheDirLength 1

3. 调整内核参数(可选)

通过修改内核参数优化内存管理:

# 降低vm.swappiness(减少Swap使用,优先用物理内存)
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p

# 允许内存过量使用(避免OOM Killer频繁终止进程)
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p

四、应用更改与持续监控

  • 重启Apache服务:修改配置后,执行sudo systemctl restart httpd(CentOS 7/8)或sudo systemctl restart apache2(部分版本)使更改生效。
  • 监控内存使用:调整后通过tophtopapachetopsudo yum install apachetop)实时查看内存占用,若MaxRequestWorkers设置过高导致内存耗尽,需逐步降低该值至系统稳定。

注意事项

  • 内存匹配MaxRequestWorkers需根据服务器内存计算(如每进程占用50MB,1GB内存建议设置为1024MB/50MB=20,留足系统预留内存)。
  • 测试环境验证:生产环境调整前,务必在测试环境模拟负载,避免参数设置不当导致服务崩溃。
  • 日志分析:定期检查/var/log/httpd/error_log(或error.log),关注内存泄漏或配置错误提示。

0