Linux的性能分析一直是个挺讨厌的问题,一般半年遇不到,遇到一次就很够折腾的,Linux的性能分析工具又层出不穷,这边简单汇总下我日常常用的一些工具。

常用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 太强大了,同时也有点复杂, 大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别都可以用它,所以暂时不细说了,回头单独记录一下。