Linux 内存监控与问题排查技术文档

一、free查看内存常见误区

通过 free -h查看内存时,需关注 available(系统可立即分配的内存),而非 free(未被使用的物理内存)。

Linux 内存管理逻辑:空闲内存会被系统用于缓存(buff/cache),缓存会在内存需求时自动释放;仅当 available趋近于 0 时,才需关注内存不足问题。

二、进程内存指标解析

top 命令查询内存相关参数

使用 top命令查看,按下 M键(大写)

  • VIRT(虚拟内存):进程申请的虚拟地址空间(含未实际使用部分),参考意义低;
  • RES(常驻内存):进程实际占用的物理内存,需重点关注;
  • SHR(共享内存):多进程共享的内存(如 lib 库),会被重复计算,单独统计无实际意义。

proc 查询

执行 cat /proc/[PID]/status | grep -E "(VmRSS|VmSwap|VmHWM)"

[PID]替换为实际应用进程号

  • VmRSS:当前进程占用的物理内存;
  • VmSwap:进程占用的 swap 空间;
  • VmHWM(高水位标记):进程运行以来的最大内存占用。

swap 监控

si(swap in,从磁盘读内存)、so(swap out,内存写磁盘)持续非 0 表示系统内存紧张,性能会下降。

查看 si/so 通过 vmstat 1查看 siso列。

找出高 swap 进程

for pid in /proc/[0-9]*; do
  swap=$(awk '/VmSwap:/{print $2}' $pid/status 2>/dev/null)
  if [ -n "$swap" ] && [ "$swap" -gt 1000 ]; then
    name=$(awk '/Name:/{print $2}' $pid/status)
    echo "Swap KB - $name ($swap/KB)"
  fi
done | sort -n | tail -10

OOM 监控

系统内存不足时会触发 OOM Killer 终止进程,查看 OOM 日志的方式:

  • dmesg | grep -i "out of memory" -A 10
  • journalctl -k | grep -i oom

OOM 优先级调整

  • 查看进程 OOM 分数:cat /proc/[PID]/oom_score
  • 调整 OOM 分数权重:echo -500 > /proc/[PID]/oom_score_adj(范围 - 1000~1000,-1000 表示进程不会被 OOM Killer 终止,需谨慎使用)。

内存泄漏检测

可采用以下脚本定时监控内存情况,实际生产中建议配合探针使用

while true; do
  echo "$(date) $(ps -p [PID] -o rss= | awk '{print $1/1024}') MB"
  sleep 300
done >> /tmp/mem_monitor.log

系统内存参数优化

swappiness

控制系统使用 swap 的倾向,默认值 60,建议设为 10(减少 swap 使用,优先用内存):

drop_caches

手动清理缓存(正常场景不建议使用,缓存用于加速 IO,清理后需重新读取磁盘)

  • 释放 PageCache(文件缓存)
echo 1 > /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/drop_caches
  • 释放 PageCache + dentries(目录缓存) + inodes(文件索引)

    echo 2 > /proc/sys/vm/drop_caches
    
  • 释放所有缓存(最彻底,但影响最大,仅在测试场景,如性能测试之前使用)

    echo 3 > /proc/sys/vm/drop_caches