一、命令介绍
pidstat是sysstat工具中的一个命令,用于监控进程的cpu、内存、线程、IO及上下文切换等系统资源的占用情况。
格式:
pidstat [ options ] [ <interval> [ <count> ] ]
分别是 选项 时间间隔 采集次数
选项 | 含义 |
---|---|
-u | 默认的参数,显示各个进程的cpu使用统计 |
-r | 显示各个进程的内存使用情况 |
-d | 显示各个进程的IO使用情况 |
-w | 显示各个进程的上下文切换情况 |
-t | 显示线程 |
-p | 指定进程号 |
-l | 显示命令名和所有参数 |
-C | 仅显示Command中包含匹配字符串的进程 |
-G | 显示符合匹配进程名字的进程 |
二、输出信息含义
[root@server ~]# pidstat
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/27/2019 _x86_64_ (1 CPU)
04:21:36 PM UID PID %usr %system %guest %wait %CPU CPU Command
04:21:36 PM 0 1 0.00 0.00 0.00 0.00 0.00 0 systemd
04:21:36 PM 0 2 0.00 0.00 0.00 0.00 0.00 0 kthreadd
04:21:36 PM 0 3 0.00 0.01 0.00 0.03 0.01 0 ksoftirqd/0
04:21:36 PM 0 7 0.00 0.00 0.00 0.00 0.00 0 migration/0
04:21:36 PM 0 9 0.00 0.01 0.00 0.37 0.01 0 rcu_sched
04:21:36 PM 0 10 0.00 0.00 0.00 0.00 0.00 0 watchdog/0
04:21:36 PM 0 12 0.00 0.00 0.00 0.00 0.00 0 kdevtmpfs
• UID:用户id
• PID:进程id
• %user:表示用户进程所使用cpu的百分比
• %system:表示内核进程所使用cpu的百分比
• %guest:表示运行vCPU时所消耗的cpu时间百分比
• %wait:表示任务在等待运行时花费的cpu的百分比。
• %CPU:表示进程所使用cpu的百分比
• CPU:处理进程的cpu编号
• Command:进程对应的命令
注:运行pidstat不加任何选项,统计的信息为系统启动开始的各项统计信息
三、实例演示
(1)使用-r选项统计进程内存使用情况
[root@server ~]# pidstat -r 2 1
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/27/2019 _x86_64_ (1 CPU)
05:34:31 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
05:34:33 PM 999 12264 2.97 0.00 342756 55092 2.92 mongod
05:34:33 PM 999 12415 18.32 0.00 1414132 194044 10.30 node
05:34:33 PM 0 27341 0.99 0.00 3264944 534056 28.35 java
05:34:33 PM 0 28616 920.30 0.00 117412 6732 0.36 pidstat
Average: UID PID minflt/s majflt/s VSZ RSS %MEM Command
Average: 999 12264 2.97 0.00 342756 55092 2.92 mongod
Average: 999 12415 18.32 0.00 1414132 194044 10.30 node
Average: 0 27341 0.99 0.00 3264944 534056 28.35 java
Average: 0 28616 920.30 0.00 117412 6732 0.36 pidstat
• minflt/s:从内存中加载数据时每秒出现的次要错误的数目,这些不要求从磁盘载入内存页面
• majflt/s:从内存中加载数据时每秒出现的主要错误的数目,这些要求从磁盘载入内存页面,一般在内存使用紧张时产生。
• VSZ:占用的虚拟内存大小,包括进入交换分区的内存
• RSS:占用的物理内存大小,不包括进入交换分区的内存
• %MEM:进程使用的物理内存百分比
(2)使用-d选项统计进程IO使用情况
[root@server ~]# pidstat -d 2 1
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/27/2019 _x86_64_ (1 CPU)
06:18:11 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:18:13 PM 999 12264 979.80 2.02 0.00 0 mongod
Average: UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
Average: 999 12264 979.80 2.02 0.00 0 mongod
• kB_rd/s:进程每秒从磁盘读取的数据量(以kB为单位)
• kB_wr/s:进程每秒向磁盘写入的数据量(以kB为单位)
• kB_ccwr/s:任务写入磁盘被取消的速率(以kB为单位)
• iodelay:任务的I/O阻塞延迟,以时钟周期为单位,包括等待同步块 I/O 和换入块 I/O 结束的时间
例如,我使用stress命令模拟i/o密集情况。
[root@server ~]# stress -i 1
stress: info: [4536] dispatching hogs: 0 cpu, 1 io, 0 vm, 0 hdd
可以清楚看到jbd2和loop2的 I/O延迟和向磁盘写入的数据量较之前提高了很多 。解释一下jbd2是什么,它是文件系统的一个日志功能,是ext4文件系统的日志功能,如果开启了这个日志功能的话,它占用的资源,会随着系统IO压力的增大而增多。
[root@server ~]# pidstat -d 2 1
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
09:29:31 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
09:29:33 AM 0 259 0.00 4.02 0.00 0 jbd2/vda1-8
09:29:33 AM 999 12264 0.00 2.01 0.00 0 mongod
09:29:33 AM 102 27411 0.00 84.42 0.00 0 mysqld
Average: UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
Average: 0 259 0.00 4.02 0.00 0 jbd2/vda1-8
Average: 999 12264 0.00 2.01 0.00 0 mongod
Average: 102 27411 0.00 84.42 0.00 0 mysqld
[root@server ~]# pidstat -d 2 1
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
09:29:07 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
09:29:09 AM 0 259 0.00 133.33 0.00 14 jbd2/vda1-8
09:29:09 AM 0 4465 0.00 1432.84 0.00 7 loop2
09:29:09 AM 0 4537 0.00 0.00 0.00 18 stress
09:29:09 AM 999 12264 0.00 7.96 0.00 0 mongod
09:29:09 AM 0 18768 0.00 1.99 0.00 0 AliYunDun
09:29:09 AM 0 27341 0.00 159.20 0.00 0 java
09:29:09 AM 102 27411 0.00 1.99 0.00 0 mysqld
Average: UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
Average: 0 259 0.00 133.33 0.00 14 jbd2/vda1-8
Average: 0 4465 0.00 1432.84 0.00 7 loop2
Average: 0 4537 0.00 0.00 0.00 18 stress
Average: 999 12264 0.00 7.96 0.00 0 mongod
Average: 0 18768 0.00 1.99 0.00 0 AliYunDun
Average: 0 27341 0.00 159.20 0.00 0 java
Average: 102 27411 0.00 1.99 0.00 0 mysqld
(3)使用-w选项显示进程的上下文切换情况
[root@server ~]# pidstat -w 2 1
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
10:31:28 AM UID PID cswch/s nvcswch/s Command
10:31:30 AM 0 1 0.51 0.00 systemd
10:31:30 AM 0 3 8.63 0.00 ksoftirqd/0
10:31:30 AM 0 9 36.04 0.00 rcu_sched
10:31:30 AM 0 259 7.61 0.00 jbd2/vda1-8
10:31:30 AM 81 445 0.51 0.00 dbus-daemon
10:31:30 AM 0 450 0.51 0.00 systemd-logind
10:31:30 AM 0 869 1.02 0.00 httpd
• cswch/s :表示每秒自愿上下文切换的次数
• nvcswch/s :表示每秒非自愿上下文切换的次数
注:所谓自愿上下文切换,是指进程无法获得所需的资源导致的上下文切换。
而非自愿上下文切换,则是指进程由于cpu分配的时间片耗尽,被系统强制调度导致的上下文切换
(4)使用-t和-p选项显示指定进程的线程
[root@server ~]# pidstat -t -p 28163
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
11:09:23 AM UID TGID TID %usr %system %guest %wait %CPU CPU Command
11:09:23 AM 0 28163 - 0.01 0.00 0.00 0.00 0.01 0 rancher-catalog
11:09:23 AM 0 - 28163 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 28165 0.00 0.00 0.00 0.02 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 28166 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 28296 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 28519 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 28801 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 28807 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
11:09:23 AM 0 - 29381 0.00 0.00 0.00 0.00 0.00 0 |__rancher-catalog
• TGID:主线程id
• TID: 线程id
(5)使用-C和-G选项显示符合匹配的进程
[root@server ~]# pidstat -C java
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
11:31:31 AM UID PID %usr %system %guest %wait %CPU CPU Command
11:31:31 AM 0 27341 0.17 0.05 0.00 0.00 0.22 0 java
[root@server ~]# pidstat -G java
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
11:31:34 AM UID PID %usr %system %guest %wait %CPU CPU Command
11:31:34 AM 0 27341 0.17 0.05 0.00 0.00 0.22 0 java
[root@server ~]# pidstat -C j
Linux 3.10.0-514.26.2.el7.x86_64 (server) 12/28/2019 _x86_64_ (1 CPU)
11:33:03 AM UID PID %usr %system %guest %wait %CPU CPU Command
11:33:03 AM 0 259 0.00 0.01 0.00 0.04 0.01 0 jbd2/vda1-8
11:33:03 AM 0 327 0.00 0.00 0.00 0.00 0.00 0 systemd-journal
11:33:03 AM 0 27341 0.17 0.05 0.00 0.00 0.22 0 java
两个选项作用效果基本一致。