描述

    pidstat 用于监控正在运行的进程的详细信息,包括进程的 CPU 使用量、内存使用量、I/O 情况和上下文切换次数等。这个命令一般用于配合其他命令一起使用,比如使用 iostat 发现了磁盘瓶颈,那么就需要使用 pidstat 来找到这个进程。

注意

  1. 首次运行时显示自系统启动开始的各项统计信息。
  2. 普通用户无法监控其他用户进程,需要使用root用户监控。

        

文章目录如下

1. 语法

1.1. 常用参数

2. 实时监控

2.1. 正在使用CPU的进程

2.2. 正在使用内存的进程

2.3. 正在使用磁盘的进程

2.4. 指定监控pid

3. 自动化监控

4. 总结


        

1. 语法

pidstat [ 选项 ] [ <时间间隔> [ <监控次数> ] ]

        

1.1. 常用参数

-u:监控CPU
-w:监控上下文切换
-r:监控内存
-h:以人类可读的格式显示输出的单位(例如,K、M、G)
-d:监控I/O统计信息
-t:显示详细信息,也可以指定pidstat必须监视的内容 {task | child | all}
-p:指定PID {pid[,…]| self | all}
-C:指定命令名称包含字符串comm的任务

        

2. 实时监控

2.1. 正在使用CPU的进程

pidstat -u 1    #只显示占用CPU的进程

当使用其他命令发现空闲 cpu 已经用完了(idle 为0)

这时可以通过 pidstat 来查询正在使用 cpu 的进程

pidstat -u 1

PID    :某个进程的PID
%usr   :用户空间使用的cpu%
%system:内核空间使用的cpu%
%guest :管理程序(hypervisor)为另一个虚拟进程提供服务而等待的虚拟CPU占比
%CPU   :整体CPU的使用率
CPU    :CPU的编号    #例如总cpu只有4核,那么对应每个CPU的编号为 0,1,2,3
Command:进程的命令名称

         

还能查看进程的上下文切换情况

pidstat -w 1

UID      :进程所有者的用户 ID(User ID)。
PID      :进程的 ID 号。
cswch/s  :平均每秒钟发生的上下文切换次数。
nvcswch/s:平均每秒钟发生的进程放弃 CPU 控制权的次数(进程主动放弃 CPU 控制权所引起的上下文切换)
Command  :进程的命令名称。

上下文切换(Context Switches)是操作系统内核在切换进程或线程之前需要执行的一些操作,例如保存进程当前的上下文(如进程状态、寄存器等),从进程 A 切换到进程 B 时就需要进行两个上下文的切换。因此,上下文切换的次数可以反映出当前系统中进程的切换频繁度,同时也可以作为查找性能问题的关键指标之一。

        

2.2. 正在使用内存的进程

pidstat -r 1    #只显示占用内存的进程

如果使用其他命令发现内存不足

这时也可以使用 pidstat 查看占用内存的进程

pidstat -r 1

PID     :进程的PID
minflt/s:每秒发生的小故障总数      #即不需要从磁盘加载内存页的故障
majflt/s:每秒发生的主要故障总数    #即需要从磁盘加载内存页的故障
VSZ     :虚拟内存使用情况(以千字节为单位)
RSS     :物理内存使用情况(以千字节为单位)
%MEM    :使用总内存占比情况
Command :进程的命令名称

        

2.3. 正在使用磁盘的进程

pidstat -d 1    # 只显示操作磁盘的进程

 在使用其他命令发现磁盘达到了瓶颈

我们可以通过 pidstat 找到使用磁盘的进程

pidstat -d 1

PID      :进程的PID
kB_rd/s  :磁盘每秒读数据(单位:KB)
kB_wr/s  :磁盘每秒写数据(单位:KB)
kB_ccwr/s:已被任务取消写入磁盘的数据(单位:KB)
Command  :进程的命令名称

        

2.4. 指定监控pid

# 同时监控CPU、内存、磁盘读写。指定某个PID使用-p,指定多个PID使用逗号分隔
pidstat -urd -p 6548,6551,6555 1 3   #1表示每隔1秒输出一次,3表示共输出3次

        

3. 自动化监控

#!/bin/bash

Help(){
        echo -e "Usage: $0 [ options ] [ <interval> [ <count> ] ]"
        echo -e "\t -a: Monitoring all processes"
        echo -e "\t -p{pid}: Specify the pid"
        echo -e "\t -k: Kill pidstat"
        }

Main(){
        local log="`pwd`/logs"

        [ ! -d ${log} ] && mkdir -p ${log}
        [ "$1" == "p" ] && options="-p $2 $3 $4" || options="$1 $2"

        # 输出CPU信息到logs/cpu.log
        pidstat -u ${options}   > ${log}/cpu.log        &
        # 输出内存信息到memory.log
        pidstat -r ${options}   > ${log}/memory.log     &
        # 输出磁盘读写到disk.log
        pidstat -d ${options}   > ${log}/disk.log       &
        # 上下文切换到context.log
        pidstat -w ${options}   > ${log}/context.log    &
        }


case $1 in
-a)
        Main $2 $3
        ;;
-p)
        Main p "$2" $3 $4
        ;;
-k)
        ps -ef |grep "pidstat" |grep `whoami` |grep -v grep |awk '{print $2}' |xargs kill -9
        ;;
*)
        Help
esac
意义:
同时监控CPU、内存、磁盘、上下文切换信息,输出到不同文件中

作用:
当某个时间段性能出现损耗,可以通过此脚本查看进程的使用情况

使用:
sh xxx.sh -a 1 86400          # xxx.sh表示脚本名,每1秒输出一次,共监控一天
sh xxx.sh -p 123,321 1 86400  # xxx.sh表示脚本名,-p指定单个或多个pid(多个使用逗号分隔),只监控指定的pid。每1秒输出一次,共监控一天
sh xxx.sh -k                  # 停止pidstat命令

        

4. 总结

    pidstat 无法直接监控整体的硬件资源,比如 cpu 的整体利用率、内存的使用情况等,该命令的主要作用是监控进程,比如查看正在使用cpu、正在使用内存、正在使用I/O的进程,并且可以详细的查看这些进程的使用情况。所以 pidstat 的作用主要是协助其他命令来分析硬件瓶颈,导致瓶颈的进程是哪些。

  • 查看cpu信息的命令:top、sar、iostat、nmon
  • 查看内存信息的命令:top、sar、nmon
  • 查看磁盘信息的命令:iostat、sar、nmon
  • 查看网络信息的命令:sar、nmon
  • 查看历史记录的命令:sar

iostat 链接文章:https://blog.csdn.net/m0_61066945/article/details/126473126
sar 链接文章:https://blog.csdn.net/m0_61066945/article/details/126213941
nmon 链接文章:https://blog.csdn.net/m0_61066945/article/details/126799593
top 链接文章:https://blog.csdn.net/m0_61066945/article/details/126452494

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐