1. 为什么我们需要pidstat?
在Linux系统性能分析领域,pidstat绝对是个重量级选手。作为一名运维老兵,我见过太多人面对系统性能问题时手足无措的样子——CPU突然飙高,内存莫名泄漏,磁盘IO异常...这时候如果不会用pidstat,就像医生没有听诊器一样尴尬。
pidstat是sysstat工具包中的一员猛将,它能提供进程级的资源使用统计,包括CPU、内存、磁盘IO、线程等维度。与top命令相比,pidstat的优势在于:
- 可以按时间间隔持续输出统计数据
- 支持更丰富的监控维度(如上下文切换、内存页故障等)
- 输出格式更适合二次处理和分析
实际案例:去年我们线上服务器突然出现CPU使用率周期性飙高的问题。用top只能看到CPU占用高的进程,但用
pidstat -urd -p ALL 1 5后,很快定位到是个Java应用的GC线程在特定时间点疯狂消耗CPU资源。
2. 安装pidstat的完整指南
2.1 确认系统环境
在开始安装前,先确认你的Linux发行版:
cat /etc/os-release常见发行版的安装方式略有不同,主要分为:
- RedHat系(CentOS/RHEL/Fedora)
- Debian系(Ubuntu/Debian)
- 其他(如Arch Linux)
2.2 RedHat系安装方法
对于CentOS/RHEL 7+:
sudo yum install sysstat -y对于RHEL 8+/CentOS Stream:
sudo dnf install sysstat -y安装后启动服务:
sudo systemctl enable --now sysstat特别注意:RHEL/CentOS默认的sysstat版本可能较老,如果需要最新功能,建议通过EPEL仓库安装:
sudo yum install epel-release sudo yum update sysstat2.3 Debian系安装方法
Ubuntu/Debian用户:
sudo apt update sudo apt install sysstat -y启用数据收集(默认可能未开启):
sudo sed -i 's/^ENABLED="false"/ENABLED="true"/' /etc/default/sysstat sudo systemctl restart sysstat2.4 验证安装
安装完成后检查版本:
pidstat -V正常应输出类似:
sysstat version 12.5.2 (C) 2020 Sebastien Godard测试基本功能:
pidstat 1 3这将以1秒间隔输出3次所有进程的CPU使用情况。
3. pidstat的进阶配置
3.1 调整数据收集频率
默认配置可能无法捕捉瞬时性能问题。编辑配置文件:
sudo vim /etc/sysconfig/sysstat修改以下参数:
# RedHat系 SA1_OPTIONS="-S DISK 10" # 每10秒收集一次磁盘统计 SA2_OPTIONS="-S DISK" # 每日汇总 # Debian系 INTERVAL="10" # /etc/default/sysstat中修改3.2 启用历史数据记录
sysstat默认会保存历史数据在/var/log/sa/目录,通过sar命令可以查看:
# 查看昨天的CPU使用情况 sar -u -f /var/log/sa/sa$(date +%d -d yesterday)3.3 自定义监控项
创建自定义监控脚本:
#!/bin/bash LOG_DIR=/var/log/pidstat mkdir -p $LOG_DIR while true; do pidstat -urd -h -p ALL 5 12 > $LOG_DIR/$(date +%Y%m%d_%H%M%S).log done这样会每1分钟(5秒间隔×12次)生成一个带时间戳的监控日志。
4. pidstat实战应用技巧
4.1 CPU性能分析
排查CPU高负载问题:
pidstat -u 1 5关键列说明:
- %usr:用户态CPU使用率
- %system:内核态CPU使用率
- %guest:虚拟化开销
- %CPU:总CPU使用率
经验:当%system过高时,通常说明系统调用频繁或内核资源竞争激烈。
4.2 内存问题诊断
监控进程内存使用:
pidstat -r 2 10关注指标:
- RSS:实际物理内存使用(KB)
- %MEM:内存占用百分比
- VSZ:虚拟内存大小
内存泄漏排查技巧:
watch -n 1 'pidstat -r -p <PID> 1 1 | tail -n 1'4.3 磁盘IO分析
识别IO密集型进程:
pidstat -d 2 5重要字段:
- kB_rd/s:每秒读取数据量
- kB_wr/s:每秒写入数据量
- iodelay:IO等待时间(毫秒)
4.4 综合监控命令
我最常用的全能监控命令:
pidstat -urd -h -p ALL 5 12参数说明:
- -u:CPU
- -r:内存
- -d:磁盘
- -h:人类可读格式
- -p ALL:所有进程
- 5 12:每5秒采样,共12次(即1分钟)
5. 常见问题解决方案
5.1 命令找不到错误
如果提示pidstat: command not found:
- 确认sysstat是否安装成功
- 检查PATH环境变量:
which pidstat - 可能需要手动添加路径:
export PATH=$PATH:/usr/lib/sysstat
5.2 数据不更新问题
如果pidstat输出没有变化:
- 检查sysstat服务状态:
systemctl status sysstat - 确认数据收集已启用:
grep ENABLED /etc/default/sysstat - 查看最近的活动记录:
sar -A | head
5.3 权限问题处理
普通用户可能看不到其他用户进程信息:
sudo pidstat -p ALL 1 1或者将用户加入sysstat组:
sudo usermod -aG sysstat $USER5.4 输出解读技巧
当分析pidstat输出时,建议:
- 配合sort快速定位问题进程:
pidstat -u 1 5 | sort -k8 -rn - 使用watch持续监控:
watch -n 1 pidstat -urd -p ALL 1 1 - 结合其他工具交叉验证:
pidstat -d 1 3 && iotop -oP
6. 性能监控方案进阶
6.1 与Prometheus集成
通过node_exporter的textfile收集器:
#!/bin/bash OUTFILE=/var/lib/node_exporter/pidstat.prom pidstat -urd -h -p ALL 5 1 | awk ' /^[0-9]/ { print "pidstat_cpu_usage{pid="$1",comm=\""$2"\"} "$8 print "pidstat_memory_usage{pid="$1",comm=\""$2"\"} "$10 }' > $OUTFILE6.2 日志持久化分析
配置logrotate管理pidstat日志:
sudo tee /etc/logrotate.d/pidstat <<EOF /var/log/pidstat/*.log { daily rotate 7 compress missingok notifempty } EOF6.3 自动化报警设置
使用简单的shell脚本实现阈值报警:
#!/bin/bash THRESHOLD=80 pidstat -u 1 5 | awk -v limit=$THRESHOLD ' $8+0 > limit && $1 != "PID" { system("echo \""$2"("$1") CPU usage "$8"% > threshold \" limit \"%\" | mail -s \"CPU Alert\" admin@example.com") } '7. 替代工具对比
虽然pidstat很强大,但有时也需要其他工具配合:
| 工具 | 优势 | 劣势 |
|---|---|---|
| top | 实时交互式 | 不能记录历史数据 |
| htop | 彩色界面更直观 | 资源消耗较大 |
| atop | 记录历史数据 | 配置复杂 |
| nmon | 全面系统监控 | 输出格式特殊 |
| ps | 进程快照 | 没有持续监控 |
个人经验:在自动化监控场景用pidstat+sar,交互式调试用htop,全面分析用atop。