pidstat 是 linux 进程级细粒度监控工具,用于长期跟踪关键服务稳定性,通过 cpu、内存、i/o 和上下文切换等指标预警潜在故障,支持按 pid、命令名匹配及结构化数据导出。

pidstat 是 Linux 中专用于进程级细粒度监控的工具,特别适合长期跟踪关键服务(如 Nginx、MySQL、Java 应用、Redis 等)的稳定性表现——它不只看“是否存活”,更关注资源行为是否持续异常,比如 CPU 波动剧烈、内存缓慢泄漏、I/O 阻塞加剧或上下文切换失控。这类指标变化往往早于服务崩溃或超时,是稳定性预警的核心依据。
锁定目标服务并持续采样
先确认服务 PID(例如通过 pgrep -f "java.*spring" 或 systemctl show --property=MainPID nginx),再用固定间隔+多轮采样获取趋势数据:
-
pidstat -u -r -d -w -p $PID 5 12:每 5 秒采集一次,共 12 次(即覆盖 1 分钟),同时输出 CPU、内存、磁盘 I/O 和上下文切换四项核心指标 - 加
-I选项(如pidstat -I -u -p $PID 2)可让 %CPU 值归一化为单核占比,在多核机器上更易判断真实负载强度 - 若服务由多个进程组成(如 Java + GC 线程 + agent 子进程),用
-T ALL合并统计:pidstat -r -T ALL -p $PID 10
重点关注稳定性敏感指标
不是所有字段都同等重要,以下四类数值波动直接关联服务稳定性风险:
-
CPU 方面:观察
%usr与%system的比例变化。若%system持续高于%usr(如 40% vs 10%),可能因频繁系统调用(如大量 socket 创建/销毁、锁竞争)导致内核开销过大 -
内存方面:紧盯
majflt/s(主缺页次数)。值 > 0.5 表示每秒有半次以上需从磁盘加载页,说明物理内存不足或进程工作集膨胀,易引发卡顿;RSS若随时间单调上升且无回落,提示内存泄漏 -
I/O 方面:对比
kB_rd/s与kB_wr/s的绝对值和波动幅度。稳定服务通常读写量平稳;若出现周期性尖峰(如每分钟一次 50MB 写入),需检查日志刷盘策略或定时任务干扰 -
调度方面:关注
nvcswch/s(非自愿上下文切换)。值 > 100 表明进程频繁被抢占(如 CPU 争抢激烈或等待不可中断睡眠),结合高%system可定位锁或中断瓶颈
结合命令名自动监控,避免 PID 变动失效
服务重启后 PID 改变,硬编码 PID 会中断监控。改用 -C 按命令名匹配,更鲁棒:
-
pidstat -u -r -C "mysqld" 10:自动捕获所有含 “mysqld” 的进程(包括 mysqld_safe 等守护进程) -
pidstat -d -C "redis-server" 30:每 30 秒检查 Redis 的磁盘读写,适合观察 AOF 重写影响 - 配合
--help查看支持的匹配模式,部分版本支持正则(如-C "^java.*prod$")
导出数据供长期趋势分析
稳定性评估需要跨小时/天维度比对,建议将 pidstat 输出转为结构化格式存档:
- 加
-h生成单行 CSV 格式:pidstat -u -r -p $PID 60 1440 | grep -v "^Linux\|^$" > nginx-hourly.csv(保存一小时每分钟快照) - 用
awk提取关键列做轻量聚合:pidstat -u -p $PID 5 60 | awk '/^[0-9]/ {print $1","$4","$5","$6}' > cpu_log.csv - 搭配
systemd-run --on-calendar="*:0/15" --scope可设置每 15 分钟自动执行一次,形成定时基线数据流











