1. 为什么我们需要pidstat?
在Linux系统性能监控领域,pidstat绝对算得上是"瑞士军刀"级别的工具。作为一名运维工程师,我经常遇到这样的场景:服务器CPU突然飙高,但top命令只能看到进程列表,无法快速定位到具体是哪个线程在作怪;或者系统I/O异常,但iotop显示的信息又过于笼统。这时候pidstat就能大显身手了。
pidstat是sysstat工具包中的一员猛将,它能提供进程级别的详细监控数据,包括:
- CPU使用率(用户态/内核态)
- 内存占用(RSS、虚拟内存)
- 磁盘I/O(读写次数、数据量)
- 上下文切换情况
- 线程级统计
与常见的top/htop相比,pidstat最大的优势在于它能输出格式化数据,非常适合:
- 长期性能监控(可配合cron定时采集)
- 生成可视化报表
- 自动化分析场景
提示:在排查间歇性性能问题时,我通常会先用pidstat采集基线数据,等问题复现时就能快速对比异常指标。
2. 安装sysstat工具包全攻略
2.1 不同Linux发行版的安装方法
虽然标题只提到pidstat,但实际我们需要安装的是它的母包——sysstat。这个工具包还包含iostat、mpstat、sar等实用工具。以下是各主流发行版的安装命令:
Debian/Ubuntu系列:
sudo apt update sudo apt install sysstat -yRHEL/CentOS 7+:
sudo yum install sysstat -y # 或使用dnf sudo dnf install sysstat -yArch Linux:
sudo pacman -S sysstatopenSUSE:
sudo zypper install sysstat安装完成后,建议检查下版本:
pidstat -V # 或 sar -V2.2 安装后的关键配置
很多人安装完就直接使用,其实sysstat有个重要配置项需要关注——数据收集频率。配置文件通常位于:
/etc/sysconfig/sysstat # RHEL系 /etc/default/sysstat # Debian系找到以下参数并修改(示例配置):
HISTORY=28 # 保留28天的历史数据 SA1_OPTIONS="-S DISK" # 收集磁盘统计 SA2_OPTIONS="-S DISK" # 日报包含磁盘统计然后重启服务:
sudo systemctl restart sysstat注意:在低配机器上,过于频繁的数据收集(如每分钟)可能导致性能开销,建议根据实际情况调整。
3. pidstat的核心用法详解
3.1 基础监控命令
查看所有进程的CPU使用情况(默认行为):
pidstat输出示例:
Linux 5.4.0-91-generic (hostname) 01/01/2023 _x86_64_ (4 CPU) 03:30:01 PM UID PID %usr %system %guest %wait %CPU CPU Command 03:30:01 PM 0 1 0.01 0.02 0.00 0.00 0.03 3 systemd 03:30:01 PM 0 456 2.15 1.78 0.00 0.12 3.93 1 dockerd常用参数组合:
pidstat -urd -h 1 5解释:
-u:CPU统计(默认)-r:内存统计-d:磁盘I/O统计-h:人类可读格式1 5:每1秒采样一次,共5次
3.2 高级用法技巧
监控特定进程:
pidstat -p 1234 1 3 # 监控PID为1234的进程按用户筛选:
pidstat -u -t -p ALL -U www-data # 监控www-data用户的所有进程线程级监控:
pidstat -t -p 1234 1 5 # -t参数显示线程信息综合监控报表:
pidstat -T ALL -l -u -r -d -w -h 1 103.3 输出字段详解
| 字段 | 说明 |
|---|---|
| %usr | 进程在用户态运行的时间百分比 |
| %system | 进程在内核态运行的时间百分比 |
| %guest | 在虚拟机中运行的时间百分比 |
| %wait | 进程等待运行的时间百分比 |
| %CPU | 总CPU使用率(%usr + %system) |
| KB_rd/s | 每秒从磁盘读取的数据量(KB) |
| KB_wr/s | 每秒写入磁盘的数据量(KB) |
| VSZ | 虚拟内存使用量(KB) |
| RSS | 常驻内存集大小(KB) |
| cswch/s | 每秒自愿上下文切换次数 |
| nvcswch/s | 每秒非自愿上下文切换次数 |
4. 实战案例:性能问题排查
4.1 CPU高负载排查
场景:某台服务器CPU使用率持续90%以上。
排查步骤:
- 首先用top确认高CPU进程
- 对可疑进程进行详细监控:
pidstat -p 5678 1 10 -u -t - 分析输出:
- 如果%system过高,可能是系统调用频繁
- 如果%usr过高,检查应用代码
- 配合
-t参数查看具体哪个线程异常
4.2 内存泄漏定位
命令:
pidstat -r -p 1234 30 120 > mem.log &监控要点:
- 观察RSS是否持续增长
- 对比VSZ和RSS的差值(过大可能存在内存碎片)
4.3 磁盘I/O瓶颈分析
命令组合:
pidstat -d 1 10 # 进程级I/O iostat -dx 1 10 # 设备级I/O交叉分析:
- 先用iostat确认是否有设备达到瓶颈
- 用pidstat找出I/O最高的进程
- 结合
lsof -p PID查看具体文件
5. 常见问题与解决方案
5.1 命令不存在错误
如果遇到pidstat: command not found:
- 确认sysstat是否安装成功:
rpm -q sysstat || dpkg -l sysstat - 检查PATH环境变量:
which pidstat || find / -name pidstat 2>/dev/null
5.2 数据收集间隔问题
sysstat默认每10分钟收集一次数据,如果需要更频繁:
sudo sed -i 's/^5-55\/10/*\/1/' /etc/cron.d/sysstat sudo systemctl restart sysstat5.3 历史数据分析
查看历史记录(需sadf工具):
# 查看昨天的CPU数据 sadf -d /var/log/sa/sa$(date -d yesterday +%d) -- -u生成CSV格式报表:
sadf -d /var/log/sa/sa16 -- -urd -h > report.csv6. 监控数据可视化方案
虽然pidstat本身是命令行工具,但结合其他工具可以实现可视化:
方案一:sar2csv + Excel
sadf -d /var/log/sa/sa16 -- -urd > stats.csv然后用Excel制作趋势图。
方案二:使用ksar
java -jar kSar.jar -input /var/log/sa/sa16 -output chart.png方案三:Prometheus + Grafana
- 使用node_exporter的textfile收集器
- 编写采集脚本:
pidstat -urd -h 1 1 | awk '...' > /var/lib/node_exporter/pidstat.prom - 配置Grafana面板
7. 性能监控的最佳实践
根据多年运维经验,我总结出以下pidstat使用原则:
基线采集:在系统正常时建立性能基线
pidstat -urd -h 1 60 > baseline.log问题复现时:
- 同时采集多个维度数据
- 保存原始输出供后续分析
长期监控建议:
# 每5分钟采集一次,保留7天 */5 * * * * root /usr/lib/sa/sa1 1 1 0 0 * * 0 root /usr/lib/sa/sa2 -A避免的陷阱:
- 不要只看%CPU,要结合上下文切换(cswch)
- 内存分析时注意RSS和VSZ的关系
- 磁盘I/O需区分读写比例
对于容器化环境,pidstat需要特殊处理:
# 监控容器内进程 pidstat -p $(docker inspect --format '{{.State.Pid}}' container_id) 1 5