两个内存数字为什么不同
实例报告的内存占用与操作系统看到的物理内存经常对不上,原因主要有几类:分配器没有把释放的内存归还给系统,于是留下碎片;进程内存被换到了交换分区,物理占用低于报告值;写时复制与内存整理期间还会出现额外的页。判断方法很直接:报告值明显低于物理占用,通常意味着碎片或额外复制页;物理占用明显低于报告值,则要警惕内存被换出。
基本信息
| 报告口径 | 实例自己统计的分配器占用 |
|---|---|
| 系统口径 | 操作系统看到的进程常驻物理内存 |
| 对比方式 | 两个数字直接相减并看比值 |
| 常见差异源 | 碎片、未归还页、换页、写时复制 |
| 判断依据 | 差值方向决定排查线索 |
典型使用场景
- 物理内存持续高于报告值,评估是否需要做内存整理或滚动重启
- 系统内存紧张时排查实例是否被换出,确认延迟变差的根因
- 容器环境核对 cgroup 统计与实例自身的口径差异
- 容量规划时为碎片留出余量,避免按报告值直接申请规格
- 大实例快照后内存长时间不回落,判断是否为未归还页
对比查看
对比查看
redis-cli INFO memory | grep -E 'used_memory:|used_memory_rss|mem_fragmentation_ratio'
ps -o pid,rss,vsz,cmd -p $(pgrep -d, redis-server) # 进程级物理内存
cat /proc/$(pgrep -o redis-server)/status | grep -E 'VmRSS|VmSwap' # 换出情况
free -h # 系统整体内存与交换分区差异方向与处置
| 现象 | 主要原因 | 处置方向 |
|---|---|---|
| 物理占用明显高于报告值 | 内存碎片或快照复制页未归还 | 观察碎片率,必要时滚动重启 |
| 物理占用明显低于报告值 | 内存被换出到交换分区 | 检查系统内存,避免换页 |
| 比值长期偏高 | 分配器不归还内存 | 评估内存整理与重启节奏 |
| 容器内口径差异大 | cgroup 统计与实例口径不同 | 以容器监控与实例指标相互印证 |
物理占用低于报告值时先查交换分区,这是延迟突然变差的常见原因,不要把内存被换出误当成内存还有很多余量。
容器环境里两个口径还受 cgroup 统计方式影响,核对时要明确比较的是容器视角还是宿主机视角,否则结论会自相矛盾。