CentOS 9 中内存泄漏排查实战:使用 vmstat/ps/pmap 定位泄漏进程
内存泄漏表现为系统可用内存持续下降,即使无新增负载。数学上可表示为: $$ M_t = M_{t-1} + \Delta L $$ 其中$M_t$为$t$时刻内存占用,$\Delta L$为泄漏增量。验证条件: $$ \frac{\partial size_{anon}}{\partial t} > 0 \quad \text{(持续正增长)} $$:Nginx内存泄漏。
·
CentOS 9 内存泄漏排查实战指南
一、内存泄漏的特征
内存泄漏表现为系统可用内存持续下降,即使无新增负载。数学上可表示为: $$ M_t = M_{t-1} + \Delta L $$ 其中$M_t$为$t$时刻内存占用,$\Delta L$为泄漏增量。
二、排查工具链
| 工具 | 作用 | 关键参数 |
|---|---|---|
vmstat |
监控系统级内存趋势 | free/buff列 |
ps |
定位高内存进程 | rss/%mem |
pmap |
分析进程内存映射细节 | -x(扩展信息) |
三、实战排查步骤
1. 系统级监控 (vmstat)
vmstat -S m 5 # 每5秒输出(单位MB)
观察指标:
free列:持续下降表明内存泄漏si/so:交换区活动激增是泄漏佐证- 典型泄漏模式:$free_{t+n} < free_t$ 且 $buff_{t+n} \approx buff_t$
2. 进程定位 (ps)
ps -eo pid,rss,%mem,cmd --sort=-rss | head -20
分析要点:
- 筛选$rss > 500$MB的异常进程(阈值依系统调整)
- 连续运行三次,计算$rss$增量$\Delta rss = rss_{t2} - rss_{t1}$
3. 内存映射分析 (pmap)
pmap -x <PID> # 替换为可疑进程ID
关键区域:
[anon]段:未关联文件的内存块(泄漏高发区)- 多次执行对比:$size_{anon}(t2) > size_{anon}(t1)$
- 计算泄漏速率:$\frac{\Delta size_{anon}}{\Delta t}$
4. 泄漏验证
watch -n 10 'pmap -x <PID> | grep anon' # 每10秒监控匿名内存
验证条件: $$ \frac{\partial size_{anon}}{\partial t} > 0 \quad \text{(持续正增长)} $$
四、典型案例分析
场景:Nginx内存泄漏
vmstat显示free从800MB→200MB(2小时)ps发现Nginx进程$rss$从50MB→650MBpmap对比:+ 00007f8a5b22e000 65408K rw--- [ anon ]- 结论:Nginx模块未释放请求缓存
五、优化建议
- 结合
valgrind进行源码级诊断(需开发环境) - 监控公式:设警报阈值
$$ \frac{\Delta size_{anon}}{\Delta t} > k \cdot M_{total} $$
$k$为系数(建议0.5%),$M_{total}$为总内存 - 定期回收:配置
cron重启可疑服务
注:CentOS 9需确保工具更新:
sudo dnf install procps-ng pmap
更多推荐




所有评论(0)