这个场景要解决什么
系统卡顿同时伴随换页活动,就要判断是真内存不足、缓存策略问题,还是应用存在泄漏。处理顺序是先保命再根治:先让服务恢复可用,再去找消耗大户与增长趋势。判断的核心指标是可用内存与换入换出量,而不是被缓存占满的那一列。
基本信息
| 适用场景 | 内存压力大,swap 出现明显换入换出 |
|---|---|
| 目标 | 定位消耗源并恢复可用性 |
| 工具链 | free、vmstat、ps、smem、slabtop、cgroup 统计 |
| 判读要点 | 看 available 与 swap 活动,不只看 free 那一列 |
典型使用场景
- 服务突然变慢并伴随磁盘响动,怀疑正在换页
- 容器被限制内存后频繁重启
- 需要确认是文件缓存还是真实使用量在增长
- 排查内核对象占用异常偏高
- 评估该加内存还是该调整应用参数
第 1 步 总体
第 1 步 总体
free -h
vmstat 1 5 | tail -n +2 # 重点看 si 与 so
head /proc/meminfo第 2 步 找大户
第 2 步 找大户
ps aux --sort=-rss | head -n 15
pidstat -r 1 3 | head
smem -rk 2>/dev/null | head -n 15 || echo 'smem 未安装,用 ps 替代'第 3 步 内核与缓存
第 3 步 内核与缓存
grep -E 'Slab|SReclaimable|SUnreclaim' /proc/meminfo
slabtop -s c -o | head第 4 步 处置与防复发
第 4 步 处置与防复发
# 先留证据:把 ps 与 vmstat 快照存档,再决定重启或扩容
# 防复发:在单元里设内存上限,或调整应用堆参数
# 排查泄漏:按固定间隔记录常驻内存,看是否单调上升指标口径
| 指标 | 含义 | 怎么判 |
|---|---|---|
| free 列 | 完全空闲的内存 | 数值偏小本身不是问题 |
| available 列 | 估算可再分配给新应用的内存 | 判断压力要看这一列 |
| buff/cache | 页缓存与缓冲 | 可回收,不等于被占用 |
| si / so | 每秒换入换出量 | 持续非零说明真在用 swap |
| Slab | 内核对象占用 | 持续增长要查是哪个子系统 |
只看 free 列就重启服务,会丢掉现场证据。重启前先保存进程内存快照与采样数据,否则同样的故障还会再来一次。
清理页缓存会造成短时 IO 抖动,而且治标不治本。除非在做基准测试,否则不要把它当作日常运维手段。