当前位置: 首页 > news >正文

每天掌握一个Linux命令 - pidstat

在Linux系统里,进程运行时可能出现各种资源使用问题,比如某个程序突然“吃”爆CPU、内存占用居高不下,或者磁盘读写变得很慢,让人摸不着头脑。这时候,pidstat就像一位专业的“系统医生”闪亮登场啦!它能精准“诊断”单个进程或线程的CPU、内存、I/O等资源使用情况,帮你快速找到那个“捣乱”的进程——是哪个程序在疯狂抢占CPU?哪个进程偷偷占用了大量内存?又是谁在不停地读写磁盘拖慢系统?有了pidstat,这些问题都能一目了然,特别适合系统管理员、开发人员排查性能故障、优化资源分配,让Linux系统运行得更顺畅!

Linux 命令工具 pidstat 使用指南

    • 一、工具概述
    • 二、安装方式
      • 1. 主流 Linux 系统安装
      • 2. 验证安装
    • 三、核心功能
    • 四、基础用法
      • 1. 基本语法
      • 2. 常用选项
        • (1)CPU 相关
        • (2)内存相关
        • (3)I/O 相关
        • (4)上下文切换
    • 五、进阶操作
      • 1. 监控线程(TID)
      • 2. 绑定 CPU 核心监控
      • 3. 合并同一进程的多个线程数据
      • 4. 历史数据查询(需提前配置 `sysstat` 日志)
    • 六、实战案例
      • 案例 1:定位高 CPU 进程
      • 案例 2:排查内存泄漏
      • 案例 3:优化 I/O 密集型进程
    • 七、注意事项

一、工具概述

pidstat 是 Linux 系统中用于监控进程资源使用情况的强大工具,属于 sysstat 工具包的一部分。它可以按指定间隔统计单个进程或线程的 CPU、内存、I/O、上下文切换等详细指标,常用于性能分析、故障排查和资源优化场景。

二、安装方式

1. 主流 Linux 系统安装

  • Ubuntu/Debian
    sudo apt update && sudo apt install sysstat
    
  • CentOS/RHEL/Fedora
    sudo yum install sysstat  # CentOS/RHEL
    sudo dnf install sysstat  # Fedora
    
  • Arch Linux
    sudo pacman -S sysstat
    

2. 验证安装

安装完成后,执行 pidstat -V 查看版本信息,确认工具可用。

三、核心功能

功能分类说明
CPU 监控统计进程的 CPU 使用率、用户态/内核态时间、CPU 迁移情况等。
内存监控显示进程的内存占用(RSS、虚拟内存等)及内存分页活动。
I/O 监控统计进程的磁盘读写速率、I/O 等待时间、块设备操作次数。
上下文切换分析进程的自愿/非自愿上下文切换次数,定位线程竞争或阻塞问题。
线程监控支持按线程(TID)统计资源使用情况,需配合 -t 参数启用。
历史数据查询结合 sysstat 的数据存储功能,查询过去某个时间段的进程状态(需配置 sysstat 定时任务)。

四、基础用法

1. 基本语法

pidstat [选项] [间隔时间] [统计次数]
  • 间隔时间:采样间隔(单位:秒),必填。
  • 统计次数:采样次数,可选;若省略则持续采样直至手动终止(Ctrl+C)。

2. 常用选项

(1)CPU 相关
  • -u(默认):监控 CPU 使用率(含用户态、内核态、等待 I/O 时间等)。

    pidstat -u 2 3  # 每 2 秒采样一次,共采样 3 次
    
    • 输出字段说明:
      列名含义
      UID进程所属用户 ID。
      PID进程 ID。
      %usr用户态 CPU 使用率(%)。
      %system内核态 CPU 使用率(%)。
      %guest虚拟机 CPU 使用率(%)。
      %wait进程等待 I/O 的 CPU 时间百分比(重要性能指标)。
      %CPU总 CPU 使用率(%usr + %system + %guest + %wait)。
      CPU进程当前绑定的 CPU 核心编号(从 0 开始)。
  • -p <PID>:指定监控单个进程(多个 PID 用逗号分隔,如 -p 1234,5678)。

    pidstat -u -p 1234 5  # 监控 PID 为 1234 的进程,每 5 秒采样一次
    
(2)内存相关
  • -r:监控进程内存使用情况(RSS、虚拟内存、页交换等)。
    pidstat -r 2  
    
    • 关键字段:
      • %mem:进程占用物理内存百分比。
      • RSS:常驻内存大小(KB)。
      • VSZ:虚拟内存大小(KB)。
      • Data:数据段内存大小(KB)。
(3)I/O 相关
  • -d:监控进程的磁盘 I/O 活动(读/写速率、操作次数等)。
    pidstat -d 1  
    
    • 关键字段:
      • kB_read/s:每秒读取磁盘数据量(KB)。
      • kB_wrtn/s:每秒写入磁盘数据量(KB)。
      • iodelay:I/O 操作延迟时间(毫秒)。
(4)上下文切换
  • -w:统计进程的上下文切换次数(自愿切换 cswch 和非自愿切换 nvcswch)。
    pidstat -w 2  
    
    • 字段说明:
      • cswch/s:每秒自愿上下文切换次数(如等待 I/O 时)。
      • nvcswch/s:每秒非自愿上下文切换次数(如被内核强制调度)。

五、进阶操作

1. 监控线程(TID)

添加 -t 参数,将 PID 替换为线程 ID(TID):

pidstat -u -t -p 1234 2  # 监控 PID 为 1234 的进程下所有线程
pidstat -u -t -p 1234,1235 2  # 监控特定线程(TID=1234、1235)

2. 绑定 CPU 核心监控

  • -C <CPU列表>:按 CPU 核心编号过滤进程(如 -C 0,1 表示监控绑定到 CPU 0 和 1 的进程)。
    pidstat -u -C 0 2  # 监控所有绑定到 CPU 0 的进程
    

3. 合并同一进程的多个线程数据

  • -T ALL:统计进程及其所有线程的资源总和(需配合 -p 指定进程 PID)。
    pidstat -u -T ALL -p 1234 2  # 合并线程数据,显示进程整体资源占用
    

4. 历史数据查询(需提前配置 sysstat 日志)

修改 /etc/sysstat/sysstat.conf,启用数据保存(默认已启用),然后通过 -f 参数指定日志文件:

pidstat -f /var/log/sysstat/sa20  # 查询 20 号的历史数据(格式:saDD)

六、实战案例

案例 1:定位高 CPU 进程

场景:系统整体 CPU 使用率高,需确定具体进程。
操作

pidstat -u 1 5  # 每秒采样一次,持续 5 秒
  • 分析:观察 %CPU 列,找出持续高于平均值的 PID,结合 %usr%system 判断是用户态还是内核态占用过高。

案例 2:排查内存泄漏

场景:某服务内存占用持续增长,怀疑内存泄漏。
操作

pidstat -r -p 5678 30  # 每 30 秒监控 PID=5678 的进程内存变化
  • 分析:观察 RSS%mem 字段,若持续上升且无回落,可能存在内存泄漏。

案例 3:优化 I/O 密集型进程

场景:数据库进程响应缓慢,怀疑磁盘 I/O 瓶颈。
操作

pidstat -d -p 9876 5  # 每 5 秒监控数据库进程的 I/O 情况
  • 分析:若 kB_read/skB_wrtn/s 持续较高,且 iodelay 较大,可能需要优化磁盘或调整进程 I/O 策略。

七、注意事项

  1. 权限要求:部分指标(如内核态 CPU 时间、线程监控)需以 root 权限执行。
  2. 性能影响:高频采样(如间隔 <1 秒)可能对系统造成轻微性能开销,生产环境建议使用 5-10 秒间隔。
  3. 线程与进程区分:默认监控进程级数据,需显式添加 -t 参数才能查看线程信息。
  4. 日志存储:历史数据查询依赖 sysstat 的日志机制,需确保日志文件存在且权限正确。
  5. 字段含义:注意 %CPU 是多核 CPU 下的总占用率(可能超过 100%),CPU 列显示当前绑定的核心(动态变化时可能为空)。

通过合理组合 pidstat 的参数,可精准定位进程级性能问题,为系统调优提供数据支撑。

http://www.xdnf.cn/news/720937.html

相关文章:

  • 《仿盒马》app开发技术分享-- 订单详情页(端云一体)
  • 【数据集】中国江北气候区100m逐日近地表气温数据(Python实现代码解析)
  • 【计网】静态路由分配
  • c#跨平台桌面地图-mapsui
  • The 2020 ICPC Asia Yinchuan Regional Programming Contest
  • 跨越太赫兹鸿沟:高通量实时成像的曙光?
  • DataAgent产品经理(数据智能方向)
  • Python 之图片添加时间戳水印
  • 【博客系统】博客系统第十一弹:从 0 到 1 搭建 Java 部署环境并部署 web 项目到 linux 系统
  • 【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
  • 2023年12月GESPC++二级真题解析(含视频)
  • 2023年6月第三套第二篇
  • 什么是生成式人工智能?
  • 【决策分析】基于Excel的多变量敏感性分析解决方案
  • 9.5 Q1 | 北京协和医学院GBD发文 | 1990-2021 年全球、区域和国家心力衰竭负担及其根本原因
  • 运筹说 第137期 | 对策论精品案例
  • 重塑企业:迈向人类、智能体与下一代组织模式
  • LeetCode 75. 颜色分类 - 双指针法高效解决(Java实现)
  • unity星空运动
  • ZeroSearch: 无需搜索即可激发LLM的搜索能力
  • Ollama v0.8.0 发布,支持通过工具调用进行流式响应!
  • Powerbuilder 连接达梦数据库(ODBC 和 JDBC)
  • [ Qt ] | Qlabel使用
  • 软考-系统架构设计师-第十章 系统质量属性和架构评估
  • 2025-05-29 学习记录--Python-面向对象
  • Pinia Plungin Persistedstate
  • Shell 脚本基础笔记
  • Java 中的 synchronized 和 Lock:如何保证线程安全
  • 深度解析互联网区(Internet ):架构、风险与防护全攻略
  • iOS 关于上架 4.3a