Linux 进程实时监控:pidstat
pidstat 主要用于监控全部或指定进程占用系统资源的情况,如 CPU,内存、设备 IO、任务切换、线程等。
pidstat安装
要使用 pidstat 需要安装 Sysstat,它是一个工具集,包括 sar、pidstat、iostat、mpstat、sadf、sadc。
$ sudo apt-get install sysstat
pidstat 首次运行时显示自系统启动开始的各项统计信息,之后运行 pidstat 将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
基本命令
用户手册:http://sebastien.godard.pagesperso-orange.fr/man_pidstat.html
Usage: pidstat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -d ] [ -h ] [ -I ] [ -l ] [ -R ] [ -r ] [ -s ] [ -t ] [ -U [ <username> ] ]
[ -u ] [ -V ] [ -v ] [ -w ] [ -C <command> ] [ -G <process_name> ]
[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]
指定采样周期和采样次数
pidstat 命令指定采样周期和采样次数,例如以 2 秒为采样周期,输出 10 次 CPU 使用统计信息:
$ pidstat 2 10
-p 参数
-p { pid [,...] | SELF | ALL } #指定进程显示其报告
选择要报告统计信息的任务(进程)。pid 是进程标识号。 SELF 关键字表示要为 pidstat 进程本身报告统计信息,而 ALL 关键字表示要为系统管理的所有任务报告统计信息。SELF 和 ALL 可不指定,如下:
$ pidstat -p 进程号
可使用以下命令获得进程号,以下命令会列出所有进程的进程号:
$ ps -e
也可以通过 top 命令或者直接查看某个服务的状态得到该服务涉及的进程。
-u参数
使用 -u 选项,pidstat 将显示各活动进程的 CPU 使用统计,执行 ”pidstat -u” 与单独执行 ”pidstat” 的效果一样。
$ pidstat
or
$ pidstat -u
- UID # 正在监视的任务的真实用户识别号
- USER # 正在监视的任务的真实用户名
- PID # 被监视任务的识别号
- %usr # 在用户级(应用程序)执行任务时使用的CPU的百分比,有或没有优先级。请注意,此字段不包括运行虚拟处理器的时间
- %system # 在系统级别(内核)执行任务时CPU占用的百分比
- %guest # 虚拟机中任务占用的CPU的百分比(运行虚拟处理器)
- %CPU # 该任务使用的CPU时间的总百分比
- CPU # 处理器号,任务被哪个处理器处理
- Command # 任务的命令名
-r参数
使用 -u 选项,pidstat 将显示各活动进程的页面故障和内存利用率。
$ pidstat -r
- UID # 正在监视的任务的真实用户识别号
- USER # 正在监视的任务的真实用户名
- PID # 被监视任务的识别号
- minflt/s # 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
- majflt/s # 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
- VSZ # 该进程使用的虚拟内存(以kB为单位)
- RSS # 该进程使用的物理内存(以kB为单位)
- %MEM # 当前任务使用的有效内存的百分比
- Command # 任务的命令名
-d参数
使用 -d 选项,pidstat 将将显示各活动进程的 I/O 统计信息(内核 2.6.20 及更高版本)。
$ pidstat -d
- UID # 正在监视的任务的真实用户识别号
- USER # 正在监视的任务的真实用户名
- PID # 被监视任务的识别号
- kB_rd/s # 每秒此进程从磁盘读取的千字节数
- kB_wr/s # 此进程已经或者将要写入磁盘的每秒千字节数
- kB_ccwr/s # 由任务取消的写入磁盘的千字节数
- iodelay # 阻止正在监视的任务的I/O延迟,以时钟滴答测量
- Command # 命令的名字
其他参数
-h # 显示所有的活动的任务
-I # 在SMP环境,指出任务的CPU使用(等同于选项-u)应该被除于cpu的总数
-l # 显示进程的命令名和它的参数
-T { TASK | CHILD | ALL } # 指定必须监测的内容:TASK是默认的,单个任务的报告;CHILD:指定的进程和他们的子进程的全局报告,ALL:相当于TASK和CHILD
-s # 堆栈的使用
-t # 显示与所选任务相关的线程的统计数据
-w # 报告任务切换情况
使用示例
以 2 秒为采样周期,输出 5 次进程号为 1643 的页面故障和内存使用统计信息。
$ pidstat -r -p 1643 2 5
以 2 秒为采样周期,输出 5 次进程号为 1643 的页面故障和内存使用统计信息以及 CPU 使用率。
$ pidstat -u -r -p 1643 2 10
以 2 秒为采样周期,输出 10 次系统中所有任务的子进程的页面错误统计信息。只显示具有非零统计值的子进程。
$ pidstat -T CHILD -r 2 10
保存数据
重定向输出即可,例如,每隔两秒记录 1 次,一共 10 次,并输出到 data.txt 文件。
$ pidstat 2 10 > data.txt