pidstat 命令介绍

发布时间: 更新时间: 总字数:2407 阅读时间:5m 作者:IP:上海 网址

pidstat 是 sysstat 套件中的进程级性能监控工具,能够按固定间隔输出进程/线程的 CPU、磁盘 I/O、内存与缺页、上下文切换等指标。本文系统梳理其安装部署、核心选项与输出字段详解,并结合磁盘高 I/O、CPU 瓶颈、内存泄漏、锁竞争等典型排查场景给出可复制的命令示例与后台采样脚本化技巧。

简介

pidstat 隶属于 sysstat 软件包,是 Linux 性能分析的核心工具之一。与 top、htop 相比,pidstat 开销极小,且能够按固定间隔输出指标,非常适合趋势观察、数据采样和脚本化分析。它可以监控进程/线程的以下维度:

  • CPU 使用率(-u)
  • 磁盘 I/O(-d)
  • 内存与缺页中断(-r)
  • 上下文切换(-w)

sysstat 套件中的其他成员还包括 iostat、mpstat、sar 等,pidstat 的特点是聚焦于单个进程/线程粒度。

安装与部署

pidstat 无需复杂部署,安装其所在的 sysstat 包即可直接使用。

各发行版安装命令

  • Ubuntu / Debian:

    bash
    sudo apt update
    sudo apt install -y sysstat
  • CentOS / RHEL / Rocky / AlmaLinux:

    bash
    sudo yum install -y sysstat
    # 或者较新版本使用 dnf
    sudo dnf install -y sysstat
  • Arch Linux:

    bash
    sudo pacman -S sysstat

(可选)启用系统后台采样服务

仅在终端单独执行 pidstat 命令时,不需要启动后台服务。若希望系统自动记录历史性能数据(配合 sar 工具回溯分析),需要启用 sysstat 的数据采集:

  • Ubuntu / Debian:编辑配置文件 /etc/default/sysstat,将 ENABLED="false" 改为 "true":

    bash
    sudo sed -i 's/^ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
    sudo systemctl restart sysstat
    sudo systemctl enable sysstat
  • CentOS / RHEL:采集默认已启用,确保服务开机自启即可:

    bash
    sudo systemctl enable --now sysstat

验证安装

bash
pidstat -V
# 正常会输出:sysstat version xx.x.x

基本语法与常用选项

bash
pidstat [ -u ] [ -d ] [ -r ] [ -w ] [ <interval> [ <count> ] ]

interval 为采样间隔(秒),count 为采样次数;省略 count 表示持续采样,两者均省略时输出自系统启动以来的平均值。

参数监控维度 / 功能
-u监控 CPU 使用率(默认选项)
-d监控磁盘 I/O 读写带宽及延迟
-r监控内存及缺页中断(Page Faults)
-w监控上下文切换(自愿/非自愿切换)
-p <PID>指定监控某个特定进程(-p ALL 监控所有进程)
-t精细到线程(TID)级别输出
-l显示完整的命令行参数(Command line arguments)
-C <name>按命令名包含匹配过滤进程
-h所有字段水平单行输出,便于 awk/grep 二次处理

实战使用场景与字段详解

排查磁盘高 I/O

每 1 秒采样 1 次,共采样 3 次,查看是哪些进程在大量读写磁盘:

bash
pidstat -d 1 3

输出示例:

text
09:20:01      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
09:20:02        0      1234      0.00  25400.00      0.00     320  mysqld

核心字段解释:

字段含义
kB_rd/s每秒从磁盘读取的数据量(KB)
kB_wr/s每秒写入磁盘的数据量(KB)
kB_ccwr/s每秒被取消的写入量(如脏页在刷盘前被截断或重写)
iodelayI/O 延迟,即任务等待 I/O 完成所耗费的时钟周期数;该值高说明进程在等待 I/O 响应

排查 CPU 瓶颈与高负载

每 2 秒采样 1 次,查看 CPU 占用最高的服务:

bash
pidstat -u 2 3

输出示例:

text
09:20:01      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
09:20:03     1000      4567   85.50   10.20    0.00    1.50   95.70     5  python3

核心字段解释:

字段含义
%usr用户态 CPU 利用率
%system内核态(系统调用)占用的 CPU
%guest运行虚拟机 vCPU 消耗的 CPU
%wait任务等待 CPU 调度运行的时间占比;该值高说明 CPU 调度排队严重、算力不足
%CPU进程的总 CPU 占用率(含用户态与内核态)
CPU任务当前正在哪个 CPU 核心上执行

注意:%wait 表示的是等待 CPU 调度的时间占比,并不是 I/O 等待(iowait);I/O 等待应结合 -d 的 iodelay 字段判断。

监控内存泄漏与缺页异常

bash
pidstat -r 1 3

输出示例:

text
09:20:01      UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
09:20:02        0      2345    120.00      0.00 1205600  450200   2.80  java

核心字段解释:

字段含义
minflt/s次要缺页异常率(Minor Page Faults):页已在物理内存中但未建立映射,开销较小
majflt/s主要缺页异常率(Major Page Faults):需要直接从磁盘(Swap 或 mmap 文件)加载数据到内存;该值高说明内存吃紧、正频繁发生磁盘换入换出
VSZ虚拟内存大小(KB)
RSS实际占用的物理内存大小(KB)
%MEM进程 RSS 占物理内存的比例

观察长时间采样下 RSS 的单调增长趋势,是判断内存泄漏最直接的证据。

排查上下文切换(判断锁竞争或并发压力)

bash
pidstat -w 1 3

核心字段解释:

  • cswch/s(自愿上下文切换):进程因等待资源(如 I/O、锁、sleep)而主动放弃 CPU。
  • nvcswch/s(非自愿上下文切换):进程的时间片用完,被内核强制剥夺 CPU 调度权。

分析技巧:

  • cswch/s 很高:通常说明存在大量 I/O 等待或内部线程锁竞争。
  • nvcswch/s 很高:说明 CPU 极度饱和,大量线程在互相争抢时间片。

深入特定进程及其内部线程(如 Java / 数据库排查)

当通过 top 发现某个服务的 PID 为 1234 且 CPU 或 I/O 异常时,可用 -t 深入到每个线程:

bash
# 监控 PID 为 1234 的所有子线程 CPU 消耗
pidstat -u -t -p 1234 1

# 按命令名过滤(包含匹配),监控 nginx 相关进程的 I/O
pidstat -d -C nginx 1

使用 -t 时会多输出 TID 列(线程 ID),可结合 jstack(针对 Java)、gdb、strace 进一步定位是代码中的哪一线程死循环或阻塞。加上 -l 可以输出完整命令行,便于区分同一可执行文件的多个实例。

运维脚本与自动化技巧

需要在后台抓取一段时间的进程数据供后续分析时,结合 -h(水平单行输出)与日志重定向:

bash
# 后台记录 60 秒的进程 I/O 消耗,每秒一次,输出到文件
nohup pidstat -d -h 1 60 > /tmp/pidstat_io.log 2>&1 &

-h 会将每个采样点压缩为单行(时间戳只出现一次),更方便后续使用 awk、grep 处理或导入 Excel/Python 分析。采集前建议先手动执行一次确认输出格式,避免把无关进程的噪声采进样本;若只需观察特定进程,加上 -p <PID> 可显著减小日志体积。

踩坑与注意事项

  • 首个采样是开机以来的平均值:与 sar、iostat 一致,pidstat 第一次报告包含的是自系统启动(boot)以来的统计平均值,评估瞬时行为应从第二个采样点开始读。
  • 默认只显示活跃任务:不带 -p ALL 时,pidstat 只输出在采样间隔内有活动(CPU、I/O 等指标非零)的进程,“进程没出现"不代表它不存在。
  • -C 与 -p 同时使用时 -p 优先生效:过滤条件冲突时注意参数的组合语义,避免误判样本范围。
  • 容器环境的可见性:在容器内执行 pidstat 只能看到该容器 PID namespace 内的进程;排查容器化服务建议进入容器执行,或在宿主机上结合 crictl/docker top 对应容器进程。
  • 权限限制:查看其他用户进程的完整信息需要 root 权限(配合 sudo),普通用户可能拿不到其他用户任务的线程级数据。

参考

  1. https://github.com/sysstat/sysstat
  2. https://man7.org/linux/man-pages/man1/pidstat.1.html