如何解决CentOS Apache2内存占用高
小樊
42
2025-11-15 22:19:51
定位与快速缓解
- 确认内存使用与进程分布:使用free -m查看整体内存,使用top/htop按内存排序,观察是否有个别 httpd 进程占用异常偏高。
- 快速缓解峰值压力:临时降低MaxRequestWorkers/MaxClients,并缩短KeepAliveTimeout,可立即减少并发进程/线程数与驻留连接,从而降低内存占用。
- 仅作临时应急:在内存紧张时可执行sync && echo 3 > /proc/sys/vm/drop_caches释放页缓存,但可能引发IO飙升,不建议频繁使用。
- 排查异常与泄漏迹象:查看**/var/log/httpd/error_log与access_log**,若发现个别进程 RSS 明显大于同类或持续增长,可能存在内存泄漏或异常请求(如大文件、慢查询、攻击)。必要时先用工具(如Valgrind/Heaptrack)对应用层做深入分析。
核心配置优化
- 选择并优化 MPM(多处理模块)
- 以并发与内存均衡为目标:若应用非线程安全,使用prefork;追求高并发与更低内存开销,优先event(或 worker)。
- 关键参数建议:
- prefork:控制进程数量与复用,典型为StartServers、MinSpareServers、MaxSpareServers、MaxRequestWorkers/MaxClients、MaxConnectionsPerChild。
- event/worker:控制线程与连接,典型为StartServers、MinSpareThreads、MaxSpareThreads、ThreadsPerChild、MaxRequestWorkers、MaxConnectionsPerChild。
- 持久连接与超时
- 建议开启KeepAlive On,并适度降低KeepAliveTimeout(如 5 秒)与MaxKeepAliveRequests(如 100),在复用连接与减少驻留之间取平衡。
- 内容压缩与缓存
- 启用mod_deflate压缩HTML/CSS/JS,启用mod_cache/mod_disk_cache缓存静态资源,显著降低带宽与时延、减少后端压力。
- 协议与连接
- 启用HTTP/2(mod_http2)提升并发效率;如存在后端瓶颈,可用mod_proxy/mod_cache做反向代理与缓存。
容量计算与上限控制
- 估算单个 httpd 进程的平均内存(RSS)
- 在稳定负载下取若干 httpd 进程的 RSS 均值(单位 MB)。
- 计算可用的 MaxRequestWorkers/MaxClients
- 若内存**> 4GB**:上限 ≈ 0.9 × 总内存 / 平均 RSS;若内存≤ 4GB:上限 ≈ 0.8 × 总内存 / 平均 RSS。
- 示例:总内存8GB、平均 RSS 30MB,上限 ≈ 0.9 × 8192 / 30 ≈ 245。
- 配置与生效
- 在 prefork 中将MaxRequestWorkers/MaxClients设为计算值;在 event/worker 中同时校核ThreadsPerChild与ServerLimit/ThreadLimit的乘积不超出上限。
- 修改后执行systemctl restart httpd并持续观察内存与连接数变化。
- 缓解疑似泄漏
- 临时将MaxConnectionsPerChild从常见的4000下调到1000,让进程更频繁回收,降低泄漏累积风险。
系统与内核参数优化
- 文件描述符限制
- 在**/etc/security/limits.conf**提升软硬限制,如:
- TCP 与内核内存
- 在**/etc/sysctl.conf**中优化网络与内存回收(按需调整):
- 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
- vm.swappiness = 10
- 执行sysctl -p使配置生效。
监控与长期治理
- 持续监控与日志分析
- 使用top/htop、free -m、sar(来自sysstat)观察内存、CPU、IO 与网络;定期审计error_log/access_log,识别异常 UA、爬虫、慢请求与攻击特征。
- 渐进式变更与压测
- 任何配置调整先在测试环境验证,变更后以小步增量方式推进,并结合压测(如ab/wrk/siege)观察吞吐、P95/P99 延迟、内存与连接数。
- 架构层面优化
- 对静态资源启用CDN;对动态内容引入反向代理/缓存层;必要时做负载均衡与应用层优化(SQL/缓存/代码)。