Linux pidstat

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
CPU Central Processing Unit 中央处理器
IO Input/Output 输入/输出
KB Kilobyte 十进制千字节,1 KB = 1000 字节;某些旧工具用法不同
PID Process Identifier 进程标识符
UID Unique Identifier 唯一标识符;Linux 权限语境中为 User ID(用户标识)

1. Command#

pidstat -u -d -r -w -p ALL 1

一句话:每 1 秒输出所有进程的 CPU、磁盘 IO、内存、context switch 情况,用来定位“哪个进程在消耗资源”。

-u: 输出 per-process CPU 使用情况
-d: 输出 per-process disk IO 情况
-r: 输出 per-process memory / page fault 情况
-w: 输出 per-process context switch 情况
-p ALL: 显示所有进程,不只显示 active process
1: 每 1 秒刷新一次

2. Normal Output Shape#

pidstat 会按不同指标分块输出,同一个 PID 可能在 CPU、IO、memory、context switch 分块里各出现一次。

Linux 5.15.0-xxx (host01)    07/12/2026    _x86_64_    (4 CPU)

10:20:01      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
10:20:02        0       934    1.00    0.00    0.00    0.00    1.00     1  nginx
10:20:02      999      1520   18.00    2.00    0.00    5.00   20.00     2  postgres

10:20:01      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
10:20:02      999      1520      0.00   2048.00      0.00       3  postgres
10:20:02        0      2011   1024.00      0.00      0.00       1  backup

10:20:01      UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
10:20:02      999      1520    120.00      0.00 5230000  820000   5.10  postgres
10:20:02     1000      2600     20.00      1.00  650000  180000   1.10  java

10:20:01      UID       PID   cswch/s nvcswch/s  Command
10:20:02      999      1520    300.00     25.00  postgres
10:20:02     1000      2600     80.00    200.00  java

3. CPU Block#

%usr: 单位是 %,user space CPU,应用代码消耗
%system: 单位是 %,kernel space CPU,系统调用 / kernel 消耗
%guest: 单位是 %,运行 virtual CPU 消耗,普通物理机通常是 0
%wait: 单位是 %,process 等待 CPU 的时间,不是 disk IO wait
%CPU: 单位是 %,这个进程总 CPU 使用率
CPU: 单位是 CPU core 编号,采样时运行在哪个 CPU core
UID: user id,不是资源单位
PID: process id,不是资源单位
Command: 进程名,不是资源单位

怎么看:

%usr high: 应用代码忙,常见于计算、循环、压缩、加密
%system high: syscall / kernel heavy,常见于网络、文件、频繁系统调用
%wait high: 进程想运行但等 CPU,可能 CPU contention
单个 PID %CPU 长期高: 继续用 ps -T / pidstat -t 看线程

4. Disk IO Block#

VSZ 是虚拟地址空间,不等于实际物理内存占用;判断内存压力还要看 RSS、缺页及系统回收/交换。

kB_rd/s: 单位是 KB/s,每秒从磁盘读多少 KB
kB_wr/s: 单位是 KB/s,每秒写入磁盘多少 KB
kB_ccwr/s: 单位是 KB/s,cancelled write,每秒被取消的写入 KB,常见于 dirty page 被覆盖或文件删除
iodelay: 单位是 clock ticks,task 等待 block IO 的时间计数,越高说明越可能卡在磁盘 IO

怎么看:

kB_wr/s high: 这个进程在大量写盘,常见于日志、数据库、批处理
kB_rd/s high: 这个进程在大量读盘,常见于扫描、备份、cache miss
iodelay high: 进程可能被磁盘 IO 拖慢,需要结合 iostat -xz 1 看磁盘 await / %util

5. Memory Block#

minflt/s: 单位是 次数/s,minor page fault,不需要读磁盘,通常是内存映射 / 分配导致
majflt/s: 单位是 次数/s,major page fault,需要从磁盘读 page,通常更影响性能
VSZ: 单位是 KB,virtual memory size,虚拟地址空间,不等于实际占用
RSS: 单位是 KB,resident set size,实际驻留在内存里的大小
%MEM: 单位是 %,RSS 占系统内存比例

怎么看:

RSS high: 进程实际占用内存高
VSZ high 但 RSS 不高: 可能只是虚拟地址空间大,不一定是真内存压力
majflt/s high: 进程频繁从磁盘调页,可能内存压力或 mmap 文件访问

6. Context Switch Block#

cswch/s: 单位是 次数/s,voluntary context switch,进程主动让出 CPU,常见于等待 IO、锁、sleep
nvcswch/s: 单位是 次数/s,non-voluntary context switch,被内核抢占,常见于 CPU contention

怎么看:

cswch/s high: 进程经常主动等待,可能在等 IO、网络、锁、条件变量
nvcswch/s high: 进程经常被抢占,可能 CPU 竞争激烈
CPU high + nvcswch/s high: 可能需要看线程、CPU saturation、调度竞争

7. Practical Read Order#

1. 先看 CPU block: 找 %CPU 高、%usr / %system / %wait 异常的 PID
2. 再看 Disk IO block: 看同一个 PID 是否 kB_rd/s、kB_wr/s、iodelay 高
3. 再看 Memory block: 看 RSS、majflt/s 是否异常
4. 最后看 Context Switch block: 判断是主动等待还是被 CPU 抢占

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭