发布于2026-08-16 阅读(0)
扫一扫,手机访问
最直观、也最管用的办法,就是直接用 ps 命令去看某个进程累计产生了多少缺页:ps -o pid,comm,minflt,majflt -C nginx 或 ps -o pid,comm,minflt,majflt -p 1234。这里的 minflt 指的是 minor fault,也就是只需要补上页表映射;而 majflt 则表示 major fault,意味着需要通过磁盘I/O把页面加载进来。

最直接有效的方式是用 ps 查单个进程的累计缺页数:ps -o pid,comm,minflt,majflt -C nginx 或 ps -o pid,comm,minflt,majflt -p 1234。其中:minflt 是 minor fault,表示页面已在内存中(如刚分配的零页、共享库页),只需建立映射;majflt 是 major fault,表示必须从磁盘读取(比如 mmap 文件首次访问、换入页),通常意味着 I/O 开销。
注意:minflt 高不一定有问题——malloc 小内存后首次写入、stack 扩展、shared library 加载都会触发它;但 majflt 持续增长,尤其伴随高 si/so,就说明在频繁换入换出,得查磁盘或内存压力。
用 vmstat 1 看每秒统计:pgpgin 和 pgpgout 表示每秒换入/换出的千字节数;pgmajfault 是每秒 major fault 次数(内核 4.15+ 才有,旧版无此列);更通用的是看 si(swap in)和 so(swap out)——它们非零且持续 >0,基本可判定缺页引发磁盘活动。
如果 si 高但 pgmajfault 低,可能是非缺页类 swap 活动(如 kswapd 主动回收);反之 pgmajfault 高而 si 低,说明缺页页来自文件映射(比如 mmap 大日志文件),没走 swap。
perf record -e page-faults -g -p $(pidof app) sleep 10 可抓指定进程的缺页调用栈,定位具体哪段代码触发cat /proc//status | grep -E "VmRSS|MMU|Min|Major" 能看到该进程当前物理内存占用与缺页计数快照缺页本身不等于慢——minor fault 几乎无开销;真正拖慢的是 major fault 后的磁盘等待。所以不能只看数字,要关联 I/O 延迟:
运行 iostat -x 1,重点看 await(I/O 平均等待毫秒)和 %util(设备忙时占比)。若 await > 10ms 且 %util > 80%,同时 si 或 pgmajfault 上升,才说明缺页正在变成瓶颈。
另一个信号是 /proc/vmstat 中的 pgpgin 和 pgpgout 值突增,配合 dmesg | tail -20 看有没有 “Out of memory: Kill process” 或 “page allocation failure” ——这代表缺页已触发内存回收甚至 OOM killer。
/proc/meminfo 里的 PageTables,指的是页表本身占用的内存大小,单位是 KB。至于 PageCount,其实并没有这个字段,这也是不少人容易踩到的认知误区。换句话说,/proc/meminfo 并不提供缺页次数统计。真正用于记录全局累计缺页相关数据的,是 /proc/vmstat 里的这几项:pgpgin、pgpgout、pgmajfault、pgminfault。
执行 grep -E "pgpgin|pgpgout|pgmajfault|pgminfault" /proc/vmstat 即可拿到自系统启动以来的总次数。注意:这些是累加值,需两次采样相减才能算出区间增量。
容易忽略的一点:容器环境(如 Docker)中,/proc/vmstat 是宿主机全局视图,无法隔离到单个容器;此时必须用 perf 或 cgroup v2 的 memory.events(含 pgmajfault 计数)才准。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9