Linux性能监控利器pidstat详解与实战 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 7sudo yum install sysstat -y # 或使用dnf sudo dnf install sysstat -yArch Linuxsudo pacman -S sysstatopenSUSEsudo zypper install sysstat安装完成后建议检查下版本pidstat -V # 或 sar -V2.2 安装后的关键配置很多人安装完就直接使用其实sysstat有个重要配置项需要关注——数据收集频率。配置文件通常位于/etc/sysconfig/sysstat # RHEL系 /etc/default/sysstat # Debian系找到以下参数并修改示例配置HISTORY28 # 保留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解释-uCPU统计默认-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 %systemKB_rd/s每秒从磁盘读取的数据量KBKB_wr/s每秒写入磁盘的数据量KBVSZ虚拟内存使用量KBRSS常驻内存集大小KBcswch/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/null5.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 Excelsadf -d /var/log/sa/sa16 -- -urd stats.csv然后用Excel制作趋势图。方案二使用ksarjava -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