pidstat -d 必须指定采样间隔(如 pidstat -d 1),否则立即退出无输出;可用 pgrep 动态获取 pid,真实 io 速率看 rkb/s 和 wkb/s 两列。

pidstat -d 必须带采样间隔,否则命令秒退
只输 pidstat -d 会立即执行并退出,看不到任何动态 IO 数据。必须指定采样间隔(单位:秒),比如 pidstat -d 1 表示每秒刷新一次。不写间隔参数,pidstat 就当你要查“历史快照”,而非实时监控。
常见错误操作:
-
pidstat -d→ 空输出后直接返回 shell -
pidstat -d 0→ 内核级高频采样,终端卡死、系统负载飙升,甚至触发 OOM -
pidstat -d -p 1234(没写间隔)→ 同样秒退,什么也看不到
怎么精准锁定目标进程的 PID 而不靠手动 grep
用 ps aux | grep xxx 抄 PID 容易抄错、漏多实例、被干扰项污染。更可靠的是用 pgrep 动态提取:
- 匹配完整命令行(推荐):
pidstat -d 2 -p "$(pgrep -f 'java.*-Dspring')" - 只匹配进程名(简单场景):
pidstat -d 1 -p "$(pgrep nginx)" - 多个 PID 一起查没问题:
pidstat -d 1 -p "$(pgrep -f 'redis|mysql')"
注意:pgrep -f 匹配的是整个启动命令,大小写敏感;若返回空,先确认进程是否真在运行、名字有无空格或特殊字符。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
看哪两列才代表真实 IO 速率
输出中真正反映“当前每秒读写多少 KB”的只有 rkB/s 和 wkB/s。其他字段容易误导:
-
rd_sec/s/wr_sec/s是扇区数(512 字节/扇区),需手动 ÷2 才是 KB,新版 sysstat 默认已弃用,优先认rkB/s -
%MEM、RSS是内存字段,和磁盘 IO 完全无关 -
kB_ccwr/s是取消写入量,一般为 0,异常升高说明进程在频繁截断脏页缓存,不是常规 IO 流量
加 -l 参数能显示完整命令路径,避免只看到 java 却分不清是哪个服务在刷盘。
为什么看到高 rkB/s 却没业务读操作?可能不是你写的代码
持续高 rkB/s 不一定来自业务逻辑,常见干扰源:
- 日志轮转脚本(如 logrotate)正在压缩/归档旧日志文件
- 数据库备份任务(mysqldump、pg_dump)在读取数据文件
- JVM 或应用自身触发的 GC 日志、堆 dump 写入前的元数据扫描
- 容器环境里,上层存储驱动(如 overlay2)在做 copy-on-write 或 layer diff 计算
这时候要结合 pidstat -d -r 1 看内存缺页(Majflt/s)、pidstat -d -u 1 看 CPU 占用,交叉验证是不是 IO 密集型行为——如果 %CPU 很低但 rkB/s 很高,基本可以排除是你的代码在主动读,而是后台机制在拉数据。










