温馨提示×

如何解决CentOS Apache2内存占用高

小樊
50
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_logaccess_log**,若发现个别进程 RSS 明显大于同类或持续增长,可能存在内存泄漏或异常请求(如大文件、慢查询、攻击)。必要时先用工具(如Valgrind/Heaptrack)对应用层做深入分析。

核心配置优化

  • 选择并优化 MPM(多处理模块)
    • 并发与内存均衡为目标:若应用非线程安全,使用prefork;追求高并发与更低内存开销,优先event(或 worker)。
    • 关键参数建议:
      • prefork:控制进程数量与复用,典型为StartServersMinSpareServersMaxSpareServersMaxRequestWorkers/MaxClientsMaxConnectionsPerChild
      • event/worker:控制线程与连接,典型为StartServersMinSpareThreadsMaxSpareThreadsThreadsPerChildMaxRequestWorkersMaxConnectionsPerChild
  • 持久连接与超时
    • 建议开启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 中同时校核ThreadsPerChildServerLimit/ThreadLimit的乘积不超出上限。
    • 修改后执行systemctl restart httpd并持续观察内存与连接数变化。
  • 缓解疑似泄漏
    • 临时将MaxConnectionsPerChild从常见的4000下调到1000,让进程更频繁回收,降低泄漏累积风险。

系统与内核参数优化

  • 文件描述符限制
    • 在**/etc/security/limits.conf**提升软硬限制,如:
        • soft nofile 65535
        • hard nofile 65535
        • soft nproc 65535
        • hard nproc 65535
  • 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/缓存/代码)。

0