Linux性能分析60秒

在本文中,我们来看在调查某个主机的性能问题时,前60S内应该首先查看哪些信息,从而快速了解整个主机的运行状况。

在前60S内,通过运行以下10个命令,我们可以对系统的资源使用情况、进程运行状况有个整体了解

1
2
3
4
5
6
7
8
9
10
uptime
dmesg
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

uptime

1
2
$ uptime 
21:43:21 up 78 days, 3:07, 2 users, load average: 3.71, 3.08, 3.13

uptime可以使我们快速了解系统的整体负载信息,以上输出中显示的信息依次为:系统当前时间、已运行时间、 登陆用户数、平均负载,其中平均负载这里的三个数字分别表示过去1分钟、5分钟、15分钟内CPU的负载情况。对于CPU的单个核心来说,负载为1.0则说明CPU负载已经较高,没有剩余的资源了,如果长期保持在这个负载的话,则容易造成请求的积压,对于多核CPU,则该值是表示所有核的累加值。在实际定位过程中,主要是以15分钟内CPU的负载数为准,如果15分钟内CPU的负载仍然较高,那就需要注意了

dmesg

dmesg是用来显示内核环缓冲区的内容,内核将各种消息都存放在这里,内核环缓冲区的消息对于诊断系统问题很有用。例如我们可以通过dmesg查看是否有进程因为OOM被杀死、是否有TCP请求被丢弃等

vmstat

vmstat可对操作系统的虚拟内存、进程、CPU活动进行监控,如下所示:

1
2
3
4
5
6
7
8
9
10
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
11 1 2039544 15472068 5000 2144664 0 0 757 262 0 0 5 2 90 4 0
13 1 2039328 15674144 5020 2139396 1248 0 10448 44 89482 181158 13 38 44 5 0
7 1 2039004 16007556 5020 2122564 1760 0 7672 12 104794 213528 14 40 41 4 0
3 2 2038660 16180976 5040 2110112 1884 0 3468 20 100660 200327 19 39 37 5 0
6 2 2038464 16486160 5040 2094924 928 0 7688 12 90962 182643 15 38 43 5 0
2 2 2038200 16674132 5040 2090216 1060 0 10856 12 56284 108656 14 29 51 5 0
2 1 2037976 16817976 5052 2091832 1152 0 12184 10828 47027 85099 11 24 59 6 0

以上输出中,主要关注如下列:

  • r: 运行队列中的进程数量,即占用CPU的进程数。如果CPU单核上超过3个进程,那么CPU的负载就较高了
  • swap: 使用的虚拟内存大小,如果此值较高,说明内存可能不足
  • free: 可用内存大小
  • si,so: 每秒从交换区写入内存的大小,每秒从内存写入交换区的大小
  • us,sy,id,wa,st: 用户空间时间、系统空间时间、空闲时间、等待IO时间、被强制等待CPU的时间。如果us+sy所占的比例较高的话,则说明CPU负载较高,如果wa的比例较高,则说明磁盘可能存在瓶颈

mpstat

mpstat是CPU的实时监控工具,可以检测CPU中每个核的运行状况,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ mpstat -P ALL 1
Linux 3.10.107-1-tlinux2-0046 (100.98.49.234) 12/18/2018 _x86_64_ (12 CPU)

07:52:07 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:52:08 PM all 3.17 0.00 0.92 9.19 0.00 0.17 0.00 0.00 0.00 86.55
07:52:08 PM 0 3.03 0.00 2.02 49.49 0.00 0.00 0.00 0.00 0.00 45.45
07:52:08 PM 1 6.00 0.00 2.00 45.00 0.00 1.00 0.00 0.00 0.00 46.00
07:52:08 PM 2 2.00 0.00 1.00 13.00 0.00 0.00 0.00 0.00 0.00 84.00
07:52:08 PM 3 3.00 0.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 95.00
07:52:08 PM 4 1.98 0.00 0.99 0.99 0.00 0.00 0.00 0.00 0.00 96.04
07:52:08 PM 5 18.00 0.00 3.00 0.00 0.00 0.00 0.00 0.00 0.00 79.00
07:52:08 PM 6 3.06 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 96.94
07:52:08 PM 7 1.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.99
07:52:08 PM 8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:52:08 PM 9 1.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.99
07:52:08 PM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:52:08 PM 11 1.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00

通过vmstat可以获取CPU的综合使用情况,而通过mpstat可以获取每个CPU核心的使用情况,某些糟糕的程序可能会一直只使用一个CPU核心,而不是运行在所有处理器上,从而导致某个CPU核心负载很高,其他CPU资源却是空闲的。通过mpstat便可诊断这类问题

pidstat

pidstat同top命令类似,用以监控全部或者指定进程的CPU、内存等资源的占用情况,它会将这些信息滚动打印,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ pidstat 1
Linux 3.10.107-1-tlinux2-0046 (100.98.49.234) 12/18/2018 _x86_64_ (12 CPU)

07:59:50 PM UID PID %usr %system %guest %CPU CPU Command
07:59:51 PM 0 1008095 0.00 0.99 0.00 0.99 9 kworker/9:2
07:59:51 PM 0 1359487 0.00 0.99 0.00 0.99 10 ceph-osd
07:59:51 PM 0 1360110 2.97 1.98 0.00 4.95 4 ceph-osd
07:59:51 PM 0 1361355 1.98 1.98 0.00 3.96 10 ceph-osd
07:59:51 PM 0 1362096 0.00 0.99 0.00 0.99 2 ceph-osd
07:59:51 PM 0 1362981 0.99 0.00 0.00 0.99 5 ceph-osd
07:59:51 PM 0 1365565 1.98 1.98 0.00 3.96 4 ceph-osd
07:59:51 PM 0 1368403 2.97 1.98 0.00 4.95 5 ceph-osd
07:59:51 PM 0 2070599 1.98 2.97 0.00 4.95 5 sap1002
07:59:51 PM 0 2070612 0.00 0.99 0.00 0.99 5 sap1008
07:59:51 PM 0 2430524 0.00 0.99 0.00 0.99 1 pidstat

07:59:51 PM UID PID %usr %system %guest %CPU CPU Command
07:59:52 PM 0 21 0.00 1.00 0.00 1.00 3 rcu_sched
07:59:52 PM 0 195 0.00 1.00 0.00 1.00 0 kworker/0:1H
07:59:52 PM 0 14132 1.00 1.00 0.00 2.00 8 safe_TsysAgent.
07:59:52 PM 0 1358777 1.00 0.00 0.00 1.00 4 ceph-osd
07:59:52 PM 0 1359487 1.00 0.00 0.00 1.00 10 ceph-osd
07:59:52 PM 0 1360110 5.00 0.00 0.00 5.00 4 ceph-osd
07:59:52 PM 0 1361355 2.00 2.00 0.00 4.00 10 ceph-osd
07:59:52 PM 0 1362981 0.00 1.00 0.00 1.00 5 ceph-osd
07:59:52 PM 0 1363880 1.00 0.00 0.00 1.00 5 ceph-osd
07:59:52 PM 0 1364665 1.00 1.00 0.00 2.00 10 ceph-osd
07:59:52 PM 0 1365565 3.00 0.00 0.00 3.00 4 ceph-osd
07:59:52 PM 0 1366476 1.00 0.00 0.00 1.00 4 ceph-osd
07:59:52 PM 0 1367460 1.00 1.00 0.00 2.00 4 ceph-osd
07:59:52 PM 0 1368403 3.00 2.00 0.00 5.00 5 ceph-osd
07:59:52 PM 0 1646795 0.00 1.00 0.00 1.00 10 kworker/10:1
07:59:52 PM 0 2417476 1.00 0.00 0.00 1.00 7 fdbcli
07:59:52 PM 0 2430524 0.00 1.00 0.00 1.00 1 pidstat

iostat

iostat用以监控系统中的IO状态,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ iostat -xz 1
Linux 3.10.107-1-tlinux2-0046 (100.98.49.234) 12/18/2018 _x86_64_ (12 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
4.84 0.00 1.81 3.57 0.00 89.78

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.06 3.95 0.31 9.31 6.25 190.85 40.97 0.31 31.39 0.36 32.44 3.41 3.28
sdh 0.00 0.23 6.22 1.94 700.92 228.59 227.96 0.11 13.19 11.24 19.44 9.74 7.94
sdm 0.00 0.28 7.77 2.40 875.65 284.36 228.15 0.14 13.44 11.11 20.99 9.64 9.80
sdi 0.00 0.28 6.63 2.20 750.45 242.41 224.79 0.12 13.20 11.34 18.81 9.75 8.61
sdk 0.00 0.30 7.66 2.27 871.22 276.49 231.28 0.13 13.44 11.06 21.49 9.64 9.57
sdd 0.00 0.29 5.83 2.65 646.21 216.63 203.62 0.10 12.33 11.12 15.00 9.14 7.75
sdl 0.00 0.24 5.96 1.92 676.90 220.14 227.71 0.10 12.91 10.96 18.95 9.54 7.52
sdj 0.00 0.27 7.15 2.17 805.51 261.04 228.82 0.12 13.14 11.06 20.01 9.63 8.98
sde 0.00 0.27 7.17 2.12 799.00 264.21 228.99 0.12 13.31 11.10 20.78 9.67 8.98
sdc 0.00 0.29 6.81 2.25 772.16 249.00 225.44 0.12 13.38 11.16 20.10 9.63 8.73
sdb 0.00 0.27 6.98 2.08 788.66 256.29 230.90 0.12 13.52 11.27 21.10 9.78 8.86
sdf 0.00 0.21 5.35 1.76 607.02 197.17 226.41 0.09 12.69 11.06 17.65 9.61 6.82
sdg 0.00 0.24 6.69 2.03 768.27 243.12 232.07 0.12 13.36 11.24 20.37 9.75 8.50

各列的含义如下:

  • r/s, w/s,rKB/s,wKB/s: 一秒内读次数、写次数、读数据大小、写数据大小
  • await: IO的平均响应时间,包括IO’的等待时间、服务时间,如果这个时间较长,则说明磁盘可能存在瓶颈。一般来说,这个时间应该小于5ms
  • svctm: IO的平均服务时间,如果该值比较接近await,则说明IO几乎没有等待时间
  • avgqu-sz: IO的平均队列长度,如果该值超过1,则说明排队请求较多,磁盘可能存在瓶颈
  • %util: 磁盘用以IO操作的时间百分比,如果该值接近100%,则说明产生的IO请求太多,磁盘负载已经很高

free

free可以用以显示系统的内存使用状况,如下所示:

1
2
3
4
5
$ free -m
total used free shared buffers cached
Mem: 245998 24545 221453 83 59 541
-/+ buffers/cache: 23944 222053
Swap: 0 0 0

其中最后一行表示swap分区的使用信息,第二行是操作系统层面的内存使用情况,其中buffers是buffer缓存内存数(写缓存),cached是page cache使用的内存缓存数(读缓存),第三行是减去buffer、cache的已使用量和加上buffer、cache的空闲量,这是用户层面的统计信息,因为对于用户程序来说,buffers、cached占用的内存是可以立即重新分配,供用户程序使用的。

sar

sar是目前Linux上最为全部的系统性能分析工具之一,我们可以通过sar来查看网络吞吐状况,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sar -n DEV 1
Linux 3.10.107-1-tlinux2-0046 (100.98.49.234) 12/18/2018 _x86_64_ (12 CPU)

08:37:57 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
08:37:58 PM bond1 2215.00 2259.00 1621.38 1712.75 0.00 0.00 2.00
08:37:58 PM eth0 1305.00 1068.00 992.93 724.90 0.00 0.00 1.00
08:37:58 PM eth1 910.00 1191.00 628.45 987.85 0.00 0.00 1.00
08:37:58 PM lo 3.00 3.00 0.99 0.99 0.00 0.00 0.00

08:37:58 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
08:37:59 PM bond1 3327.00 3264.00 2411.48 2390.17 0.00 0.00 2.00
08:37:59 PM eth0 1889.00 1508.00 1377.83 1035.24 0.00 0.00 1.00
08:37:59 PM eth1 1438.00 1756.00 1033.66 1354.92 0.00 0.00 1.00
08:37:59 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

08:37:59 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
08:38:00 PM bond1 3025.00 3221.00 2189.47 2477.83 0.00 0.00 3.00
08:38:00 PM eth0 1914.00 1621.00 1412.42 1133.86 0.00 0.00 1.00
08:38:00 PM eth1 1111.00 1600.00 777.05 1343.97 0.00 0.00 2.00
08:38:00 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

每列的含义如下:

  • rxpck/s, txpck/s: 每秒接收、发送的包数目
  • rxkB/s, txkB/s: 每秒接收、发送的数据大小

我们也可以通过sar来查看主机上TCP连接的状况,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)

12:17:19 AM active/s passive/s iseg/s oseg/s
12:17:20 AM 1.00 0.00 10233.00 18846.00

12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:20 AM 0.00 0.00 0.00 0.00 0.00

12:17:20 AM active/s passive/s iseg/s oseg/s
12:17:21 AM 1.00 0.00 8359.00 6039.00

12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:21 AM 0.00 0.00 0.00 0.00 0.00

每列的含义如下:

  • active/s: 本地每秒初始化的TCP连接数(通过connect()连接远程服务器)
  • passive/s: 每秒远程连接的TCP数(通过accept()接收远程连接)
  • retrans/s: 每秒TCP包重发次数,它通常是网络服务出现问题的标志(如出现丢包、网络负载太高等)

top

top命令可以简单快捷地统计系统中的资源使用情况、进程运行状况等,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ top
top - 20:47:16 up 79 days, 2:11, 10 users, load average: 1.46, 2.02, 2.47
Tasks: 325 total, 1 running, 324 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.5 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32281840 total, 393664 free, 19142128 used, 12746048 buff/cache
KiB Swap: 2088956 total, 651716 free, 1437240 used. 8835108 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1362981 root 20 0 1764960 693536 3476 S 6.7 2.1 1174:25 ceph-osd
2070599 root 20 0 20920 19808 680 S 6.7 0.1 814:04.35 sap1002
1 root 20 0 193084 3432 1264 S 0.0 0.0 12:52.37 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:03.77 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 8:08.06 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:53.07 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/2
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/3
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/4
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/5
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/6
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/7
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/8
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/9
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/10
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/11
21 root 20 0 0 0 0 S 0.0 0.0 94:17.16 rcu_sched

通过此命令可一目了然得看出系统资源的负载是否较高,哪些进程占用了较多资源等,以便进一步分析

References