如何优化 CentOS Apache2 的内存使用
导读:优化思路与快速估算 目标是让 Apache 的常驻内存稳定在物理内存可承受范围内,同时保留必要的并发能力。先做一次“单进程内存基线”估算:在高峰期用命令查看单个 httpd 进程常驻内存(RSS),例如: ps -o rss,cmd -...
优化思路与快速估算
- 目标是让 Apache 的常驻内存稳定在物理内存可承受范围内,同时保留必要的并发能力。先做一次“单进程内存基线”估算:在高峰期用命令查看单个 httpd 进程常驻内存(RSS),例如:
- ps -o rss,cmd -C httpd | tail -n +2 | awk ‘{ sum+=$1} END { print “RSS per httpd (KB):”, sum/NR} ’
- 或 top/htop 观察单个进程 RES。
- 估算公式:MaxRequestWorkers ≤ 可用内存 / 单进程RSS。例如:可用内存 4GB、单进程 RSS 40MB,则 MaxRequestWorkers 不宜超过约 100。若估算值过大,应降低并发或优化应用/模块内存占用。
- 基线确认后,再按下文步骤逐项优化与压测验证。
MPM 选择与核心参数
- 确认当前 MPM(多处理模块):
- httpd -V | grep -i mpm(CentOS 常见为 prefork;若使用 worker/event,参数名略有差异)
- 按 MPM 调整关键并发与生命周期参数(示例为合理起点,需结合压测微调):
- prefork(进程模型,适合非线程安全模块如部分 mod_php)
< IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 # 依据“单进程RSS×该值”不超过可用内存 MaxConnectionsPerChild 1000 # 非0可在长周期运行后回收增长的内存 < /IfModule> - worker/event(线程/事件模型,适合线程安全场景)
< IfModule mpm_worker_module> StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 150 MaxConnectionsPerChild 1000 < /IfModule>
- prefork(进程模型,适合非线程安全模块如部分 mod_php)
- 连接与超时(减少长连接占用):
- KeepAlive On
- MaxKeepAliveRequests 100
- KeepAliveTimeout 5
- 修改后重启生效:systemctl restart httpd(或 apache2)。上述参数名在不同 MPM 下含义一致或相近,但数值取舍需以压测为准。
应用与模块层优化
- 启用压缩与缓存,降低带宽与时延,减少长连接与重复计算:
- 启用压缩:LoadModule deflate_module modules/mod_deflate.so;DeflateCompressionLevel 6
- 启用缓存: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
- 静态资源过期:启用 mod_expires,为图片/CSS/JS 设置合适 Cache-Control/Expires,减少重复请求与后端压力。
- 精简模块:只启用必需模块(如 a2dismod 禁用不需要的模块),降低常驻内存与攻击面。
- 若使用 PHP,优先采用 PHP-FPM + OPcache,并合理设置 pm.max_children(同样用“单进程/子进程 RSS × 数量 ≤ 可用内存”估算),避免传统 mod_php 在高并发下的内存放大。
系统层与运维策略
- 文件描述符与内核参数(提升可达并发与稳定性):
- /etc/security/limits.conf
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 - /etc/sysctl.conf(按需启用,示例为通用网络与内存调优)
执行 sysctl -p 使配置生效。net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 8192 vm.swappiness = 10 vm.overcommit_memory = 1
- /etc/security/limits.conf
- 监控与日志:
- 实时监控:top/htop、apachetop;观察进程 RSS、请求排队与 5xx 错误。
- 日志分析:定期查看 /var/log/httpd/error_log 与 access_log,定位异常请求、慢请求与潜在攻击。
- 缓存与临时文件清理(谨慎操作):
- 仅在内存紧张且确认影响时执行:sync & & echo 3 > /proc/sys/vm/drop_caches(可能导致 IO 飙升,不建议作为常规手段)。
内存泄漏与异常增长的应对
- 若发现内存随时间持续增长,优先排查应用代码与模块(如 PHP 脚本存在泄漏)。在问题未修复前,可将 MaxConnectionsPerChild/MaxRequestsPerChild 设置为较小值(如 50–100),周期性回收进程以抑制泄漏影响;同时结合错误日志与监控定位根因并修复。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何优化 CentOS Apache2 的内存使用
本文地址: https://pptw.com/jishu/750249.html
