Linux 内存故障排查“三板斧”速查表
专栏:ExASIC July 1, 2026, 11:23 a.m. 9 阅读
/proc/[pid]/status

今天我们用到的命令虽然看起来复杂,但核心逻辑非常清晰。我把它们整理成了一份 Linux 内存故障排查“三板斧”速查表,方便你日后直接复用。

1. 宏观系统概览(看总量)

  • free -h
    查看全局内存水位。重点关注 available(实际可用内存),它比 free 更准确。

  • numastat -m | grep -A 4 "Node"
    解决“全局内存剩很多,但局部(某颗CPU)内存不够”的问题,多路服务器必查。

  • cat /proc/sys/vm/swappiness
    确认内核是否“偏爱”使用 Swap(你的值是 10,非常健康,不激进)。

2. 排查“谁吃了 Swap”(核心脚本)

这是今天最实用的脚本,分为三个版本,由简到繁:

① 基础版(只看进程名 + 原始 kB)

for i in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $i 2>/dev/null
done | grep kB | sort -k2 -rn | head -20

② 进阶版(加入“用户名”)
核心改进:利用 stat -c '%U' 获取进程目录的属主,比解析 UID 更直接。

for d in /proc/[0-9]*; do
  user=$(stat -c '%U' "$d" 2>/dev/null)
  awk -v u="$user" '/^Name:/{n=$2} /^VmSwap:/{s=$2} END{if(s) print s,u,n}' "$d/status" 2>/dev/null
done | sort -k1 -rn | head -20

③ 终极版(自动缩放单位 GB/MB/KB)
解决读数不直观的问题,适合汇报或文档输出。

for d in /proc/[0-9]*; do 
  user=$(stat -c '%U' "$d" 2>/dev/null)
  awk -v u="$user" '/^Name:/{n=$2} /^VmSwap:/{s=$2} END{if(s) print s,u,n}' "$d/status" 2>/dev/null
done | sort -k1 -rn | head -20 | awk '{
  s=$1
  if (s >= 1048576) { unit="GB"; val=s/1048576 }
  else if (s >= 1024) { unit="MB"; val=s/1024 }
  else { unit="KB"; val=s }
  printf "%-15s %-20s %10.2f %s\n", $2, $3, val, unit
}'

3. 关键知识点(脚本里的“骚操作”)

  • /proc/[0-9]*:只遍历数字命名的目录,避开 /proc/self 这类特殊目录,避免报错。

  • sort -k1 -rn:这里的 -k1 指的是按第一列(Swap 数值)降序排列,一定要在换算单位之前排序,否则按字符串排序会出错(比如 9.2 GB 排不过 800 MB)。

  • stat -c '%U':获取文件/目录的属主名,这是获取进程真实用户最快的方法。

4. 如果决定“清理”这些 Swap

  • sudo swapoff -a && sudo swapon -a
    强制将 Swap 里的数据搬回物理内存(前提是当前物理内存足够装得下,你现在剩 400G,绝对安全)。

感谢阅读,更多文章点击这里:【专栏:ExASIC】
公众号:【ExASIC】

分享数字集成电路设计中的经验和方法。分享让工作更轻松。

最新20篇 开设专栏