ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

Linux性能监控利器pidstat详解与实战

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 -y

RHEL/CentOS 7+:

sudo yum install sysstat -y # 或使用dnf sudo dnf install sysstat -y

Arch Linux:

sudo pacman -S sysstat

openSUSE:

sudo zypper install sysstat

安装完成后,建议检查下版本:

pidstat -V # 或 sar -V

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

3.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%以上。

排查步骤:

  1. 首先用top确认高CPU进程
  2. 对可疑进程进行详细监控:
    pidstat -p 5678 1 10 -u -t
  3. 分析输出:
    • 如果%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

交叉分析:

  1. 先用iostat确认是否有设备达到瓶颈
  2. 用pidstat找出I/O最高的进程
  3. 结合lsof -p PID查看具体文件

5. 常见问题与解决方案

5.1 命令不存在错误

如果遇到pidstat: command not found:

  1. 确认sysstat是否安装成功:
    rpm -q sysstat || dpkg -l sysstat
  2. 检查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 sysstat

5.3 历史数据分析

查看历史记录(需sadf工具):

# 查看昨天的CPU数据 sadf -d /var/log/sa/sa$(date -d yesterday +%d) -- -u

生成CSV格式报表:

sadf -d /var/log/sa/sa16 -- -urd -h > report.csv

6. 监控数据可视化方案

虽然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

  1. 使用node_exporter的textfile收集器
  2. 编写采集脚本:
    pidstat -urd -h 1 1 | awk '...' > /var/lib/node_exporter/pidstat.prom
  3. 配置Grafana面板

7. 性能监控的最佳实践

根据多年运维经验,我总结出以下pidstat使用原则:

  1. 基线采集:在系统正常时建立性能基线

    pidstat -urd -h 1 60 > baseline.log
  2. 问题复现时:

    • 同时采集多个维度数据
    • 保存原始输出供后续分析
  3. 长期监控建议:

    # 每5分钟采集一次,保留7天 */5 * * * * root /usr/lib/sa/sa1 1 1 0 0 * * 0 root /usr/lib/sa/sa2 -A
  4. 避免的陷阱:

    • 不要只看%CPU,要结合上下文切换(cswch)
    • 内存分析时注意RSS和VSZ的关系
    • 磁盘I/O需区分读写比例

对于容器化环境,pidstat需要特殊处理:

# 监控容器内进程 pidstat -p $(docker inspect --format '{{.State.Pid}}' container_id) 1 5
RELATED READING

延伸阅读

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