监控Apache内存需区分单进程与整体服务,用htop/ps查RSS,smaps分析内存构成,脚本定时记录趋势,并结合mod_status状态关联分析。

监控 Apache 进程的内存消耗波动,关键在于区分「单个进程」和「整体服务」的内存行为,并持续采集、对比、可视化变化趋势。Ubuntu 和 CentOS 上方法高度一致,核心围绕实时观测、历史采样与进程级聚焦。
用 htop 或 ps 精准抓取当前内存占用
Apache 在 prefork 模式下每个子进程独立占用内存,在 event 或 worker 模式下线程共享但仍有差异。直接看单个 httpd/apache2 进程的 %MEM 或 RES 值最直观:
-
htop(推荐):安装后运行
sudo htop,按 F6 → 选择 %MEM 排序,快速定位内存最高的 Apache 子进程;按 F4 输入 apache2 或 httpd 可高亮过滤 -
ps + awk 统计总量:执行以下命令,获取所有 Apache 进程 RSS 内存总和(单位 KB):
ps -o rss= -C apache2 | awk '{sum += $1} END {print sum " KB"}'(Ubuntu)ps -o rss= -C httpd | awk '{sum += $1} END {print sum " KB"}'(CentOS) - 注意:RSS(Resident Set Size)比 %MEM 更可靠,它反映实际驻留物理内存,不受虚拟内存干扰
用 smap 分析单个进程的内存构成
当发现某个 Apache 子进程内存异常偏高,可深入其内存映射细节,排查是否由模块、缓存或泄漏引起:
- 先查出目标 PID:
ps aux | grep 'apache2|httpd' | head -n 5 - 查看该进程的内存分布:
sudo cat /proc/PID/smaps | grep -E '^(Size|RSS|MMU|Anonymous|Swap)' - 重点关注 Anonymous(堆/栈分配,过高可能有泄漏)、MMUPageSize(大页使用情况)、Swap(是否被交换出去)
用脚本定时记录波动并生成趋势
内存不是静态值,需长期观察波动规律(如每分钟一次,保留 24 小时):
- 写一个简易采集脚本(保存为
/usr/local/bin/monitor-apache-mem.sh):#!/bin/bash<br>echo "$(date '+%F %T'),$(ps -o rss= -C apache2 2>/dev/null | awk '{sum+=$1} END{print sum+0}')" >> /var/log/apache_mem.log - 添加定时任务:
sudo crontab -e,加入:*/1 * * * * /usr/local/bin/monitor-apache-mem.sh - 后续可用
tail -n 100 /var/log/apache_mem.log快速查看近期峰值,或导入 Excel/Grafana 画折线图
结合 mod_status 看内存关联状态
mod_status 本身不直接报内存,但它能告诉你「哪些状态导致内存上升」:
- 启用 ExtendedStatus 后访问
/server-status?auto,关注:
– BusyWorkers 和 IdleWorkers 比例(大量 Busy 可能意味着请求堆积、响应慢、连接未释放)
– ReqPerSec 与 %CPU 是否同步飙升(若 CPU 不高但内存涨,更倾向内存泄漏)
– State 列中长时间处于W(Sending Reply)或K(Keepalive)的连接,可能拖慢回收,间接推高进程内存 - 把 mod_status 的请求速率、Worker 状态与内存日志对齐分析,能定位是流量驱动还是代码/配置缺陷
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/126894.html