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 java3. 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 / %util5. 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 抢占