ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux性能分析利器pidstat详解与实战

Linux性能分析利器pidstat详解与实战

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 sysstat

2.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 sysstat

2.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:

  1. 确认sysstat是否安装成功
  2. 检查PATH环境变量:
    which pidstat
  3. 可能需要手动添加路径:
    export PATH=$PATH:/usr/lib/sysstat

5.2 数据不更新问题

如果pidstat输出没有变化:

  1. 检查sysstat服务状态:
    systemctl status sysstat
  2. 确认数据收集已启用:
    grep ENABLED /etc/default/sysstat
  3. 查看最近的活动记录:
    sar -A | head

5.3 权限问题处理

普通用户可能看不到其他用户进程信息:

sudo pidstat -p ALL 1 1

或者将用户加入sysstat组:

sudo usermod -aG sysstat $USER

5.4 输出解读技巧

当分析pidstat输出时,建议:

  1. 配合sort快速定位问题进程:
    pidstat -u 1 5 | sort -k8 -rn
  2. 使用watch持续监控:
    watch -n 1 pidstat -urd -p ALL 1 1
  3. 结合其他工具交叉验证:
    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 }' > $OUTFILE

6.2 日志持久化分析

配置logrotate管理pidstat日志:

sudo tee /etc/logrotate.d/pidstat <<EOF /var/log/pidstat/*.log { daily rotate 7 compress missingok notifempty } EOF

6.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。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进