Linux 的 60s USE 性能诊断方法论
Posted 范桂飓
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 的 60s USE 性能诊断方法论相关的知识,希望对你有一定的参考价值。
目录
USE 分析法
该方法的核心是对于所有的资源,查看它的使用率、饱和度和错误。这里的 “资源” 指:服务器所有的物理元器件(e.g. CPU、总线、…),某些软件资源也能算在内。
- Utilization(资源使用率):指在规定的时间间隔内,某个资源(e.g. CPU、内存、磁盘)用于服务工作的时间百分比。
- Satuation(资源饱和度):指某个资源(e.g. CPU、内存、磁盘)的负载超过了它所能够处理的能力,资源不能再服务更多额外工作的程度,通常的,此时可以观察到有等待队列开始堆积,或者请求等待的时间变长。
- Error(错误):指操作系统及应用程序层面的明显错误。
USE 分析法会将分析引导到一定数量的关键指标上,这样可以尽快地核实所有的系统资源。实操步骤如下:
可见,USE 法的第一步是要建一张资源列表,要尽可能完整。例如:
- CPU:Socket、Core、Thread。
- 内存:DRAM。
- 网络接口:以太网端口。
- 存储设备:磁盘。
- 控制器:存储、网络。
- 互联:CPU、内存、IO。
一旦掌握了资源的列表,就可以开始采集资源的 USE 指标了。例如:
- CPU 使用率:vmstat 1
- CPU 饱和度:vmstat 1,运行队列长度 。
- 内存使用率:free -m。
- 内存饱和度:free -m,匿名换页、或者线程换出、再或者 OOM。
- 存储使用率:iostat –d –x 1。
- 存储饱和度:iostat –d –x 1,等待队列长度。
- 存储设备 IO:dmesg smartctl。
- 网络接口使用率:sar –n DEV 1。
60s USE 检查分析法
OS Error
1、dmesg | tail — 检查操作系统的明显错误
显示了最新的几条系统日志,如果系统出现了明显错误,那么输出的日志中应该可以一目了然。
$ dmesg | tail
[690774.079619] docker0: port 2(vethf7f1560) entered disabled state
[690774.080647] veth588fe58: renamed from eth0
[690774.119506] docker0: port 2(vethf7f1560) entered disabled state
[690774.121148] device vethf7f1560 left promiscuous mode
[690774.121151] docker0: port 2(vethf7f1560) entered disabled state
[701940.158358] docker0: port 1(veth95cae04) entered disabled state
[701940.159054] vetha2fb6e0: renamed from eth0
[701940.222239] docker0: port 1(veth95cae04) entered disabled state
[701940.223930] device veth95cae04 left promiscuous mode
[701940.223933] docker0: port 1(veth95cae04) entered disabled state
CPU 负载
2、uptime — 检查 CPU 负载平均值趋势
所谓 Load Average(平均负载),指示的是有多少任务在等待运行,包含了想要或者正在使用 CPU 的任务,以及在 I/O 上被阻塞的任务。这个命令能使我们对系统的全局状态有一个大致的了解。
$ uptime
23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
上述 3 个值分别是 1 分钟、5 分钟、15 分钟时间段内的负载平均值。根据这 3 个值,我们可以了解到 Linux 负载随时间的变化。例如:假设你从中发现 1 分钟的负载平均值比 15 分钟的值要小很多,那么你很有可能已经错过了系统出问题的时间点。
上述例子中,1 分钟的负载平均值为 30,比 15 分钟的 19 增长较多,也就是说系统目前的情况比较糟糕,也许是 CPU 不够用了,需要继续排查定位问题。
3、vmstat 1 — 检查虚拟内存、CPU 的状态情况
$ 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
5 0 0 6208768 201332 5887580 0 0 0 1 2 1 50 0 49 1 0
4 0 0 6208784 201332 5887616 0 0 0 0 1083 122 50 0 50 0 0
4 0 0 6208816 201332 5887616 0 0 0 0 1059 117 50 0 50 0 0
...
需要关注的指标:
-
r:处在 runnable 状态的任务,包括正在运行的任务和等待运行的任务。这个值比 uptime 的 Load Average 更能看出 CPU 是否饱和,但不包含等待 I/O 相关的任务。当 r 的值比当前 CPU 数量还要大的时候,系统就处于饱和状态了。
-
free:以 KB 计算的空闲内存大小。
-
si,so:换入换出的内存页。如果这两个值非零,表示内存不够了,正在使用 Swap 交换空间。
-
us(用户态时间),sy(内核态时间),id(空闲时间),wa(等待 I/O 时间),st(偷取时间,在虚拟化环境下系统在其它租户上的开销):CPU 时间的各项指标(对所有 CPU 取均值),分别表示:
- 可以通过 us + sy 来确认 CPU 是否繁忙。如果 us 高的话,表示应用程序在使用 CPU;如果 sy 高的话,需要进一步分析,也许是系统处理 I/O 的效率低。
- wa 和 id 高的话表示 CPU 空闲了,此时磁盘可能是瓶颈。
4、mpstat -P ALL 1 — 检查系统所有 CPU 的负载情况
这个命令会把每个 CPU 的执行时间都打印出来,可以看看 CPU 负载是否均衡。如果某一单个 CPU 使用率很高的话,说明正运行着一个单线程应用。
$ mpstat -P ALL 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78
07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99
07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00
07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03
[...]
5、pidstat 1 — 检查进程的 CPU 资源占用情况
这个命令用于持续地查看进程的行为模式,可以方便地记录随着时间的变化,各个进程运行状况的变化。
其中,%CPU 表示的是所有 CPU 的总值,例如:1591% 表示某个进程几乎消耗了 16 个 CPU。
$ pidstat 1
Linux 4.15.0-143-generic (vpp-1) 06/08/21 _x86_64_ (4 CPU)
16:28:59 UID PID %usr %system %guest %wait %CPU CPU Command
16:29:00 0 2557 0.99 0.00 0.00 0.00 0.99 0 dockerd
16:29:00 0 22607 0.00 0.99 0.00 0.00 0.99 1 pidstat
16:29:00 UID PID %usr %system %guest %wait %CPU CPU Command
16:29:01 UID PID %usr %system %guest %wait %CPU CPU Command
16:29:02 0 22607 0.00 1.00 0.00 0.00 1.00 1 pidstat
磁盘 I/O 负载
6、iostat -xz 1 — 检查磁盘的 I/O 负载情况
$ iostat -xz 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 x86_64 (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
73.96 0.00 3.73 0.03 0.06 22.21
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04
dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00
dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03
...
iostat 是理解块设备(磁盘)的当前负载和性能的重要工具。几个指标的含义:
- r/s,w/s,rkB/s,wkB/s:磁盘的读速率,写速率,读数据量、写数据量。这几个指标反映了磁盘的工作负载。系统的性能问题很有可能就是磁盘负载太大。
- await:磁盘 I/O 的平均响应时间。包括请求排队的时间,以及请求处理的时间。如果超过了经验值的平均响应时间,则表明磁盘负载处于饱和状态,或者磁盘有问题。
- avgqu-sz:磁盘请求队列的平均长度。队列长度大于 1 时,则表示磁盘处于饱和状态。
- %util:磁盘的利用率,磁盘每秒处理 I/O 的时间占比,表示磁盘繁忙的程度。大于 60% 的利用率通常会导致性能问题(可以通过 await 看到)。
注意,每种磁盘也会有有所不同。如果这个磁盘是一个逻辑块设备,这个逻辑快设备后面有很多物理磁盘的话,100% 利用率只能表明有些 I/O 的处理时间达到了 100%;后端的物理磁盘可能远远没有达到饱和状态,可以处理更多的负载。
还有一点需要注意的是,较差的磁盘 I/O 性能并不一定意味着会导致应用程序出现性能问题。应用程序可以有许多方法执行异步 I/O,而不会阻塞在 I/O 上面;应用程序也可以使用诸如预读取,写缓冲等技术降低 I/O 延迟对自身的影响。
内存负载
7、free -m — 检查磁盘、内存的用量情况
$ free -m
total used free shared buffers cached
Mem: 245998 24545 221453 83 59 541
-/+ buffers/cache: 23944 222053
Swap: 0 0 0
Linux 会把暂时用不上的内存用作缓存,一旦应用需要的时候就立刻重新分配给它。
- buffers:用于磁盘 I/O 的缓冲区缓存。
- cached:用于文件系统的页面缓存。
- -/+ buffers/cache:更准确的内存使用量。
注意,ZFS 有自己的文件系统缓存,在 free -m 里面是看不到的。虽然系统看起来空闲内存不多了,但是有可能 ZFS 有很多的缓存可用。
网络 I/O 负载
8、sar -n DEV 1 — 检查网络接口的吞吐量状态
$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00
12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00
12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- rxkB/s,txkB/s:用于查看网络接口的 I/O 负载,也可以看见是否达到了网络流量的限制。例如:上述 eth0 的吞吐量达到了大约 22 Mbytes/s,差不多 176 Mbits/sec ,比 1 Gbit/sec 还要少很多。
- %ifutil:标识网卡的利用率。
9、sar -n TCP,ETCP 1 — 检查 TCP 协议的流量情况
$ 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
这是对 TCP 重要指标的一些概括,包括:
- active/s:每秒钟本地主动开启的 TCP 连接。通常为出主机的连接,也就是本地程序使用 connect() 系统调用。
- passive/s:每秒钟从源端发起的 TCP 连接。通常为入主机的连接,也就是本地程序使用 accept() 所接受的连接。
- retrans/s:每秒钟的 TCP 重传次数。也许是网络不稳定,也许是服务器网卡负载过重开始丢包了。
以上是关于Linux 的 60s USE 性能诊断方法论的主要内容,如果未能解决你的问题,请参考以下文章
关于Linux中使用USE(使用率/饱和度/错误)方法分析系统性能的一些笔记