Linux的性能分析一直是个挺讨厌的问题,一般半年遇不到,遇到一次就很够折腾的,Linux的性能分析工具又层出不穷,这边简单汇总下我日常常用的一些工具。
vmstat
[root@dev001 ~]# vmstat 2 2procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 3386348 2076 343968 0 0 148 9 130 210 1 1 96 3 0 0 0 0 3385868 2076 343964 0 0 0 0 1030 1588 1 1 98 0 0
根据字段进行分别归类:
procs
- r: 运行队列中进程数量,不建议比cpu core数高
- b: 等待IO的进程数量
memory
- free: 空闲物理内存大小
- buff: 用作缓冲的内存大小
- cache: 用作缓存的内存大小
swap
- si: 每秒从swap写到内存的大小,单位:kb/s
- so: 每秒从内存写到swap的大小,单位:kb/s
IO
- bi: 每秒读取的块数。
- bo: 每秒写入的块数。
可以使用stat / | grep “IO BLOCK” 查看block的大小,centos一般都是4096
system
- in: 每秒中断数,包括时钟中断, 理论越小越好。
- cs: 每秒上下文切切换,理论越小越好。
中断和上下文切换的影响可以参阅之前的文章
cpu
- us: 用户进程空间usertime CPU占用百分比。
- sy: 内核systime CPU占用百分比。
- wa: IO等待时间CPU占用百分比。
- id: 空闲时间百分比。
pidstat
主要用于实时监控基于进程的cpu使用,内存使用,磁盘使用,上下文切换,查看指定进程-p ,查看线程就是-t
pidstat -u 1 # 1秒一次进行cpu使用的监控 pidstat -r 1 # 1秒一次进行内存使用的监控 pidstat -d 1 # 1秒一次进行磁盘使用的监控 pidstat -w 1 # 1秒一次进行上下文切换的监控
cpu情况
[root@dev001 ~]# pidstat -u 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)03:19:21 PM UID PID %usr %system %guest %CPU CPU Command 03:19:22 PM 0 9244 0.00 0.99 0.00 0.99 3 docker-containe 03:19:22 PM 0 19488 0.00 0.99 0.00 0.99 2 pidstat 03:19:22 PM UID PID %usr %system %guest %CPU CPU Command 03:19:23 PM 0 18427 0.00 1.00 0.00 1.00 3 kworker/3:1-events_freezable 03:19:23 PM UID PID %usr %system %guest %CPU CPU Command 03:19:24 PM 0 8797 1.00 0.00 0.00 1.00 1 irqbalance 03:19:24 PM 0 19488 0.00 1.00 0.00 1.00 2 pidstat
cpu 字段比较简单,主要关注下guest,一般不会有,它代表代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的CPU时间,一般openstack计算节点之类的才会有。
内存情况
[root@dev001 ~]# pidstat -r 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)03:25:04 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 03:25:05 PM 0 20500 166.34 0.00 108364 2472 0.06 pidstat 03:25:05 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 03:25:06 PM 0 20500 164.00 0.00 108364 2516 0.06 pidstat
- minflt/s 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
- majflt/s 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
- VSZ 虚拟地址大小,虚拟内存的使用情况,单位KB
- RSS 物理地址大小,物理内存的使用情况,单位KB
- MEM 内存的百分比
磁盘情况
[root@dev001 ~]# pidstat -d 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)03:31:56 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 03:31:57 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 03:31:58 PM 0 8774 0.00 4.00 0.00 auditd 03:31:58 PM 0 9111 0.00 8.00 4.00 rsyslogd 03:31:58 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 03:31:59 PM 0 9111 0.00 8.00 4.00 rsyslogd
- kB_rd/s 每秒进程从磁盘读取的数据量, 单位KB
- kb_wr/s 每秒进程向磁盘写的数据量, 单位KB
切换情况
[root@dev001 ~]# pidstat -w 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)03:33:41 PM UID PID cswch/s nvcswch/s Command 03:33:42 PM 0 10 17.82 0.00 rcu_sched 03:33:42 PM 0 26 0.99 0.00 ksoftirqd/3 03:33:42 PM 0 2941 4.95 0.00 irq/16-vmwgfx 03:33:42 PM 0 4402 18.81 0.00 xfsaild/sda2 03:33:42 PM 0 9113 0.99 0.00 dockerd-current 03:33:42 PM 0 18427 1.98 0.00 kworker/3:1-mm_percpu_wq 03:33:42 PM 0 20093 0.99 0.00 kworker/2:0-events_power_efficient 03:33:42 PM 0 20322 15.84 0.00 kworker/0:1-mm_percpu_wq 03:33:42 PM 0 21129 0.99 0.00 kworker/1:2-cgroup_pidlist_destroy 03:33:42 PM 0 22030 0.99 0.00 pidstat 03:33:42 PM UID PID cswch/s nvcswch/s Command 03:33:43 PM 0 10 23.00 0.00 rcu_sched 03:33:43 PM 0 16 1.00 0.00 ksoftirqd/1 03:33:43 PM 0 2941 5.00 0.00 irq/16-vmwgfx 03:33:43 PM 0 4402 20.00 0.00 xfsaild/sda2 03:33:43 PM 0 9113 1.00 0.00 dockerd-current 03:33:43 PM 0 9428 2.00 0.00 sshd 03:33:43 PM 0 18427 3.00 0.00 kworker/3:1-mm_percpu_wq 03:33:43 PM 0 19188 1.00 0.00 kworker/1:0-ata_sff 03:33:43 PM 0 19833 6.00 0.00 kworker/u256:1-events_unbound 03:33:43 PM 0 20093 1.00 0.00 kworker/2:0-mm_percpu_wq 03:33:43 PM 0 20322 17.00 0.00 kworker/0:1-events 03:33:43 PM 0 21129 4.00 0.00 kworker/1:2-mm_percpu_wq 03:33:43 PM 0 21731 2.00 0.00 kworker/u256:2-events_unbound 03:33:43 PM 0 22030 1.00 0.00 pidstat
- cswch/s 自愿中断
- nvcswch/s 非自愿中断
iostat
[root@dev001 ~]# iostat -x -k -d 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.11 1.33 1.18 83.57 10.46 74.87 0.03 13.24 24.54 0.56 0.76 0.19 scd0 0.00 0.00 0.00 0.00 0.20 0.00 114.22 0.00 26.89 26.89 0.00 0.94 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- rrqm/s 每秒对该设备的读请求被合并次数
- wrqm/s 每秒对该设备的写请求被合并次数
- r/s 每秒完成的读次数
- w/s 每秒完成的写次数
- rkb/s 每秒读数据量(kB为单位)
- wkb/s 每秒写数据量(kB为单位)
- avgrq-sz 平均每次IO操作的数据量(扇区数为单位)
- avgqu-sz 平均等待处理的IO请求队列长度
- await 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
- svctm 平均每次IO请求的处理时间(毫秒为单位)
- %util 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
iotop
类似top命令,可以显示IO负载具体是由哪个进程产生的, 返回字段一目了然,就不详细记录了
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 23062 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/1:0-mm_percpu_wq] 9216 be/4 influxdb 0.00 B/s 0.00 B/s 0.00 % 0.00 % influxd -config /etc/influxdb/influxdb.conf 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 22 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_gp] 4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_par_gp] 6 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H-kblockd] 9217 be/4 influxdb 0.00 B/s 0.00 B/s 0.00 % 0.00 % influxd -config /etc/influxdb/influxdb.conf 8 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [mm_percpu_wq] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched] 11 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuhp/0] 14 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuhp/1] 15 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1] 16 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1] 18 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/1:0H-kblockd]
mpstat
也是systat 下面的工具之一,日常操作中大多数用来看中断
[root@dev001 ~]# mpstat -P ALL 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:11:35 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 04:11:36 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 04:11:36 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 04:11:36 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 04:11:36 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 04:11:36 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
- %irq 硬件中断的时间百分比
- %soft 软件中断的时间百分比
获取直接拉取中断的总和
[root@dev001 ~]# mpstat -I SUM -P ALL 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:12:58 PM CPU intr/s 04:12:59 PM all 1857.00 04:12:59 PM 0 563.00 04:12:59 PM 1 527.00 04:12:59 PM 2 504.00 04:12:59 PM 3 388.00 04:12:59 PM CPU intr/s 04:13:00 PM all 171.00 04:13:00 PM 0 76.00 04:13:00 PM 1 31.00 04:13:00 PM 2 38.00 04:13:00 PM 3 26.00
sar
CPU情况
# sar -u 1[root@dev001 ~]# sar -q 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:40:09 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 04:40:10 PM 0 215 0.10 0.04 0.01 0 04:40:11 PM 0 215 0.10 0.04 0.01 0 04:40:12 PM 0 215 0.10 0.04 0.01 0 04:40:13 PM 0 215 0.10 0.04 0.01 0# sar -q 1[root@dev001 ~]# sar -q 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:40:54 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 04:40:55 PM 0 215 0.04 0.03 0.00 0 04:40:56 PM 0 215 0.04 0.03 0.00 0
重复的不再赘述,主要可以看到队列长度
- runq-sz:运行队列的长度(等待运行的进程数)
- plist-sz:进程列表中进程(processes)和线程(threads)的数量
内存情况
[root@dev001 ~]# sar -B 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:42:19 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 04:42:20 PM 0.00 19.00 21.00 0.00 23.00 0.00 0.00 0.00 0.00 04:42:21 PM 0.00 0.00 18.00 0.00 23.00 0.00 0.00 0.00 0.00 04:42:22 PM 0.00 0.00 17.82 0.00 22.77 0.00 0.00 0.00 0.00 04:42:23 PM 0.00 0.00 1832.00 0.00 456.00 0.00 0.00 0.00 0.00
- pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
- pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
- fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
- majflt/s:每秒钟产生的主缺页数.
- pgfree/s:每秒被放入空闲队列中的页个数
- pgscank/s:每秒被kswapd扫描的页个数
- pgscand/s:每秒直接被扫描的页个数
- pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
- %vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
[root@dev001 ~]# sar -r 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:44:38 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 04:44:39 PM 3254300 751148 18.75 2076 420968 843776 7.14 434112 164516 16 04:44:40 PM 3254300 751148 18.75 2076 420968 843776 7.14 434124 164516 16
- kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
- kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
- %memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
- kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
- kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
- %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
磁盘情况
[root@dev001 ~]# sar -b 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:47:59 PM tps rtps wtps bread/s bwrtn/s 04:48:00 PM 2.00 0.00 2.00 0.00 34.00 04:48:01 PM 0.00 0.00 0.00 0.00 0.00 04:48:02 PM 0.00 0.00 0.00 0.00 0.00
- tps:每秒钟物理设备的 I/O 传输总量
- rtps:每秒钟从物理设备读入的数据总量
- wtps:每秒钟向物理设备写入的数据总量
- bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
- bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s
[root@dev001 ~]# sar -d 1Linux 5.3.8-1.el7.elrepo.x86_64 (dev001) 11/02/2020 _x86_64_ (4 CPU)04:49:55 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 04:49:56 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 04:49:56 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 04:49:56 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 04:49:57 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 04:49:57 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
- rd_sec/s:每秒读扇区的次数.
- wr_sec/s:每秒写扇区的次数.
- avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
- avgqu-sz:磁盘请求队列的平均长度.
- await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
- svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
- %util:I/O请求占CPU的百分比,比率越大,说明越饱和。
dstat
dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具,当然有个很大的好处在于用python 写的,可以像saltstack 一样自己写监控模块进行二次开发。
perf
perf 太强大了,同时也有点复杂, 大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别都可以用它,所以暂时不细说了,回头单独记录一下。