linux性能检测之pidstat详解
Sysstat是一个工具集,包括sar、pidstat、iostat、mpstat、sadf、sadc。 这里记录一下pidstat这个命令。
一、介绍
1.1 简介
pidstat代表PID统计,它是sysstat工具集中的一个工具。这个工具可以监控内核管理的单独进程并生成报表。他可以监控指定的PID(Porcess ID)也可以监控系统中所有运行中的简称。
这个工具可以提供进程的各类统计信息包括:进程的CPU使用情况、磁盘使用情况,还可以统计特定任务和子进程相关的信息。
1.2 格式
pidstat [ -C comm ] [ -d ] [ -h ] [ -I ] [ -l ] [ -p { pid [,...] | SELF | ALL } ] [ -r ] [ -t ] [ -T { TASK |CHILD | ALL } ] [ -u ] [ -V ] [ -w ] [ interval [ count ] ]
1.3 选项:
-C comm:仅显示其命令名称包含字符串comm的任务。
-d:报告I / O统计信息。将显示以下值:
-h:在单行上水平显示所有活动。
-I:在SMP环境中,指示任务CPU使用情况(由选项-u显示)应除以总处理器数。
-l:显示进程命令名称及其所有参数。
-p { pid [,...] | SELF | ALL }:选择要报告统计信息的任务(进程)。 pid是进程标识数。 SELF关键字表示要为pidstat进程本身报告统计信息,而ALL关键字表示统计信息将被管理的所有任务报告系统。
-r:报告页面故障和内存利用率。
-t : 还显示与所选任务相关联的线程的统计信息。
-T { TASK | CHILD | ALL }: 此选项指定必须由pidstat命令监视的内容。 TASK关键字表示要为个别任务报告统计数据(这是默认选项),而CHILD键 - 字表示统计将被全面报告给所选择的任务,dren。 ALL关键字表示要针对个别任务和全球报告统计信息
所选择的任务和他们的子进程。注意:任务及其所有子项的全局统计信息不适用于pidstat的所有选项。此外,这些统计信息与当前时间间隔不一定相关:子进程的统计信息过程仅在其完成或被杀死时被收集。
-V:打印版本号,然后退出。
-u:报告CPU利用率。
-w : 报告任务切换活动.
博文来自:www.51niux.com
二、示例
2.1 打印活动进程任务
#pidstat #跟pidstat -u和pidstat -h 一样,不过-u会显示UID,pidstat -h 不过-h除了显示UID以外前面的时间是时间戳的形式。跟pidstat -T TASK 是完全一样的。
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2017年03月22日 _x86_64_ (12 CPU)
14时07分52秒 PID %usr %system %guest %CPU CPU Command
14时07分52秒 1 0.00 0.00 0.00 0.00 8 init
14时07分52秒 2 0.00 0.00 0.00 0.00 1 kthreadd
14时07分52秒 3 0.00 0.00 0.00 0.00 0 migration/0
14时07分52秒 4 0.00 0.00 0.00 0.00 0 ksoftirqd/0
14时07分52秒 6 0.00 0.00 0.00 0.00 0 watchdog/0
14时07分52秒 7 0.00 0.00 0.00 0.00 1 migration/1
14时07分52秒 9 0.00 0.00 0.00 0.00 1 ksoftirqd/1
14时07分52秒 10 0.00 0.00 0.00 0.00 1 watchdog/1
#PID:被监控任务的进程号。
#%usr : 在用户级别(应用程序)执行任务时使用的CPU的百分比,和 nice 优先级无关,此字段不包括运行虚拟处理器的时间。
#%system : 在系统级别(内核)执行任务时CPU使用的百分比。
#%guest : 虚拟机中任务占用的CPU的百分比(运行虚拟处理器)。
#%CPU :该任务使用的CPU时间的总百分比。 在SMP环境中,任务的CPU使用率将会达到如果在命令行中输入了选项-I,则除以CPU的总数。
#CPU : 正在运行这个任务的CPU的编号。
#Command: 这个任务的命令名称。
2.2 打印某个命令的任务进程
# pidstat -C qemu-kvm #这是一台kvm的宿主机,可以看到qemu-kvm命令是通过UID是107的用户,PID进程可以看出来,cpu使用率以及所运行的CPU编号都可以看出来。
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
14:26:04 UID PID %usr %system %guest %CPU CPU Command
14:26:04 107 1974 0.08 0.27 0.14 0.50 0 qemu-kvm
14:26:04 107 1993 0.04 0.12 0.14 0.30 1 qemu-kvm
14:26:04 107 2004 0.66 0.55 0.44 1.65 3 qemu-kvm
14:26:04 107 2017 8.25 1.13 0.51 9.89 0 qemu-kvm
14:26:04 107 2041 0.95 0.57 0.29 1.81 4 qemu-kvm
# id qemu #qemu用户的UID是107
uid=107(qemu) gid=107(qemu) groups=107(qemu),36(kvm)
#注:默认pidstat只能将活动的进程所对应的命令打印出来,所以有些非活动的进程用pidstat -C查看不了,得用pidstat -p 进程id号来查看。
博文来自:www.51niux.com
2.3 显示每个进程的I/O情况
#pidstat -d #这是一台nginx-cache服务器
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2017年03月22日 _x86_64_ (12 CPU)
14时31分43秒 PID kB_rd/s kB_wr/s kB_ccwr/s Command
14时31分43秒 1 1681.40 3147.24 71.33 init
14时31分43秒 138 0.00 0.05 0.00 kswapd0
14时31分43秒 140 0.00 0.58 0.00 khugepaged
14时31分43秒 591 0.00 8.76 0.00 jbd2/dm-1-8
14时31分43秒 30848 0.28 0.69 0.01 nginx
#PID:被监控任务的进程号。
#kB_rd/s:任务导致从磁盘每秒读取的千字节数。
# kB_wr/s:任务造成的千字节数,或者每秒要写入磁盘(单位kb/s)。
#kB_ccwr/s:写入磁盘已被任务取消的千字节数。 这可能发生在任务会截断一些脏页面缓冲。 在这种情况下,另一个任务已被考虑的一些IO因为不会发生。
#Command:这个任务的命令名称。
2.4 显示完整的命令路径
# pidstat -l #-l选项可以让其输出完整的命令路径
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
14:43:39 UID PID %usr %system %guest %CPU CPU Command
14:43:39 0 1 0.00 0.02 0.00 0.02 5 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2.5 显示某一个PID的磁盘读写和CPU使用情况
# pidstat -p 2041 -d 1 2 #记住这个格式-p 加PID号,但是后面一定要加上刷新频率和刷新几次。我这里是1秒刷新一次,一共刷新两次。不然输出不了想要的结果。
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
14:47:02 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
14:47:03 107 2041 0.00 0.00 0.00 qemu-kvm
14:47:04 107 2041 0.00 0.00 0.00 qemu-kvm
Average: 107 2041 0.00 0.00 0.00 qemu-kvm
# pidstat -p 2041 1 2
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
14:47:13 UID PID %usr %system %guest %CPU CPU Command
14:47:14 107 2041 2.00 0.00 0.00 2.00 5 qemu-kvm
14:47:15 107 2041 1.00 0.00 0.00 1.00 5 qemu-kvm
Average: 107 2041 1.50 0.00 0.00 1.50 - qemu-kvm
# pidstat -p ALL #就是将活动与不活动的进程都打印出来
博文来自:www.51niux.com
2.6 显示进程的分页错误和内存使用率
# pidstat -r
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
14:51:08 UID PID minflt/s majflt/s VSZ RSS %MEM Command
14:51:08 0 1 1.97 0.01 46840 7380 0.05 systemd
14:51:08 0 585 0.58 0.00 37980 5720 0.03 systemd-journal
14:51:08 0 620 0.13 0.00 195124 6212 0.04 lvmetad
14:51:08 0 627 0.30 0.00 47708 5860 0.04 systemd-udevd
14:51:08 0 843 0.06 0.00 55416 1720 0.01 auditd
14:51:08 0 847 0.03 0.00 84492 876 0.01 audispd
#UID:执行此进程的用户UID号。
#PID: 执行此进程的PID号。
#minflt/s: 从内存中加载数据时每秒出现的小的错误的数目,这些不要求从磁盘载入内存页面。
#majflt/s: 从内存中加载数据时每秒出现的较大错误的数目,这些要求从磁盘载入内存页面。
#VSZ : 虚拟大小:整个任务的虚拟内存使用量,单位为千字节。
#RSS : 驻留设置大小,长期内存使用:任务中使用的非交换物理内存(以千字节为单位)。
#%MEM: 内存使用百分比。
#Command: 进程执行的命令。
2.7 树形结构显示某一个命令的统计信息。
# pidstat -t -C "qemu-kvm" #将命令qemu-kvm的进程以及子线程都显示出来
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
15:02:06 UID TGID TID %usr %system %guest %CPU CPU Command
15:02:06 107 1974 - 0.08 0.26 0.13 0.48 3 qemu-kvm
15:02:06 107 - 1974 0.04 0.12 0.00 0.16 3 |__qemu-kvm
15:02:06 107 - 1978 0.03 0.13 0.10 0.26 9 |__qemu-kvm
15:02:06 107 - 1979 0.01 0.02 0.03 0.05 5 |__qemu-kvm
15:02:06 107 1993 - 0.03 0.11 0.13 0.28 0 qemu-kvm
15:02:06 107 - 1993 0.01 0.02 0.00 0.03 0 |__qemu-kvm
15:02:06 107 - 1997 0.02 0.08 0.10 0.19 7 |__qemu-kvm
15:02:06 107 - 1998 0.01 0.01 0.03 0.06 5 |__qemu-kvm
15:02:06 107 2004 - 0.66 0.54 0.42 1.62 1 qemu-kvm
15:02:06 107 - 2004 0.27 0.41 0.00 0.69 1 |__qemu-kvm
15:02:06 107 - 2008 0.02 0.11 0.18 0.32 6 |__qemu-kvm
15:02:06 107 - 2009 0.00 0.01 0.03 0.05 5 |__qemu-kvm
15:02:06 107 - 2010 0.01 0.06 0.05 0.13 0 |__qemu-kvm
15:02:06 107 - 2011 0.02 0.04 0.16 0.22 10 |__qemu-kvm
15:02:06 107 - 2012 0.07 0.14 0.00 0.22 2 |__qemu-kvm
15:02:06 107 2017 - 8.25 1.10 0.47 9.83 4 qemu-kvm
15:02:06 107 - 2017 7.79 0.12 0.00 7.91 4 |__qemu-kvm
15:02:06 107 - 2021 0.27 0.84 0.31 1.42 2 |__qemu-kvm
15:02:06 107 - 2022 0.07 0.26 0.16 0.49 5 |__qemu-kvm
15:02:06 107 2041 - 0.95 0.57 0.27 1.79 5 qemu-kvm
15:02:06 107 - 2041 0.45 0.69 0.00 1.14 5 |__qemu-kvm
15:02:06 107 - 2052 0.02 0.10 0.14 0.26 5 |__qemu-kvm
15:02:06 107 - 2053 0.01 0.03 0.13 0.17 9 |__qemu-kvm
15:02:06 107 - 2054 0.09 0.12 0.00 0.21 2 |__qemu-kvm
#UID:执行此命令的用户UID。
#TGID:线程组长的识别号。
#TID:正在监视的线程的标识号。
#%usr : 在用户级别(应用程序)执行任务时使用的CPU的百分比,和 nice 优先级无关,此字段不包括运行虚拟处理器的时间。
#%system : 在系统级别(内核)执行任务时CPU使用的百分比。
#%guest : 虚拟机中任务占用的CPU的百分比(运行虚拟处理器)。
#%CPU :该任务使用的CPU时间的总百分比。
#CPU : 正在运行这个任务的CPU的编号。
#Command: 这个任务的命令名称。
2.8 -T { TASK | CHILD | ALL }说明
# pidstat -T TASK -C "qemu-kvm" #就相当于#pidstat -C "qemu-kvm" ,默认就是-T TASK
# pidstat -T CHILD -C "qemu-kvm"
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
15:09:57 UID PID usr-ms system-ms guest-ms Command
15:09:57 107 1974 10930 35170 17320 qemu-kvm
15:09:57 107 1993 4350 15070 17110 qemu-kvm
15:09:57 107 2004 88490 72400 56520 qemu-kvm
15:09:57 107 2017 1107470 146920 62860 qemu-kvm
15:09:57 107 2041 127340 75740 36480 qemu-kvm
#usr-ms:该任务及其所有子项在用户执行时花费的毫秒数级别(应用程序),有或没有优先级,并在时间间隔内收集。 请注意,此字段不包括运行虚拟处理器的时间。
#system-ms:该任务及其所有子系统在系统执行时花费的总毫秒数级(内核),并在时间间隔内收集。
#guest-ms:任务及其所有子项在虚拟机中运行的总计毫秒数(运行一个虚拟处理器)。
2.9 显示某一个命令所涉及到的进程的上下文切换次数
#pidstat -w -C "qemu-kvm" #这是一台宿主机qemu-kvm相关进行的上下文切换信息
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2017年03月22日 _x86_64_ (32 CPU)
15时23分50秒 PID cswch/s nvcswch/s Command
15时23分50秒 8526 2.87 0.02 qemu-kvm
15时23分50秒 31368 1.88 0.01 qemu-kvm
15时23分50秒 39485 0.08 0.00 qemu-kvm
15时23分50秒 43611 1035.37 3.04 qemu-kvm
15时23分50秒 46882 1.62 0.00 qemu-kvm
#cswch/s: 每秒任务主动(自愿的)切换上下文的次数。主动切换是指当某一任务处于阻塞等待时,将主动让出自己的CPU资源。
#nvcswch/s : 每秒任务被动(不自愿的)切换上下文的次数。被动切换是指CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。
2.10 将所有的统计数据结合到一个单一的报告中
pidstat -urd -h -l #现在-h的作用就体现出来了,没有-h这三种数据报表是垂直成三份数据报告显示的。
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
# Time UID PID %usr %system %guest %CPU CPU minflt/s majflt/s VSZ RSS %MEM kB_rd/s kB_wr/s kB_ccwr/s Command
1490167828 0 1 0.00 0.01 0.00 0.02 0 1.67 0.00 46840 7380 0.05 16.78 0.02 0.01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1490167828 0 3 0.00 0.00 0.00 0.00 0 0.00 0.00 0 0 0.00 0.00 0.00 0.00 ksoftirqd/0
1490167828 0 4 0.00 0.00 0.00 0.00 0 0.00 0.00 0 0 0.00 0.00 0.00 0.00 kworker/0:0
1490167828 0 7 0.00 0.00 0.00 0.00 0 0.00 0.00 0 0 0.00 0.00 0.00 0.00 migration/0
2.11 -C正则表达式以及不能与-p混合使用
-p和-C不能混在一起使用,这样输出不了什么结果
# pidstat -C "q.*r" -p 3,13 1 2 #结果是空的,这两种筛选方式是不能混在一起的。
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
15:43:32 UID PID %usr %system %guest %CPU CPU Command
# pidstat -C "q.*m$" #-C支持正则表达式的形式去匹配
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
15:41:42 UID PID %usr %system %guest %CPU CPU Command
15:41:42 107 1974 0.08 0.26 0.12 0.46 9 qemu-kvm
15:41:42 107 1993 0.03 0.11 0.12 0.26 0 qemu-kvm
15:41:42 107 2004 0.65 0.54 0.41 1.60 0 qemu-kvm
15:41:42 107 2017 8.26 1.07 0.45 9.78 3 qemu-kvm
15:41:42 107 2041 0.94 0.56 0.26 1.77 2 qemu-kvm
# pidstat -C "q.*r"
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
15:41:46 UID PID %usr %system %guest %CPU CPU Command
15:41:46 89 1824 0.00 0.00 0.00 0.00 3 qmgr
# pidstat -p 3,13 1 2 #-p可以指定多个pid的形式
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain) 03/22/17 _x86_64_ (12 CPU)
15:42:24 UID PID %usr %system %guest %CPU CPU Command
15:42:25 0 3 0.00 0.00 0.00 0.00 0 ksoftirqd/0
15:42:25 0 13 0.00 0.00 0.00 0.00 1 ksoftirqd/1
15:42:25 UID PID %usr %system %guest %CPU CPU Command
15:42:26 0 3 0.00 0.00 0.00 0.00 0 ksoftirqd/0
15:42:26 0 13 0.00 0.00 0.00 0.00 1 ksoftirqd/1
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 3 0.00 0.00 0.00 0.00 - ksoftirqd/0
Average: 0 13 0.00 0.00 0.00 0.00 - ksoftirqd/1