2.1 理解性能优化
1. 性能优化基本意识
2. 优化的方向、思路
做优化首先要知道从哪里入手,也就是要知道系统的瓶颈在哪里。一个请求会消耗很多资源: CPU、内存、网络、磁盘等,这些资源中总会有一个先到达瓶颈,只有优化最先到达瓶颈的资源才会产生实际效果。
如何发现瓶颈 ? 从代码执行部分来看,就是看哪里消耗了最多的 CPU 时间,从消耗 CPU 最多的地方做优化效果更明显。所以首先要掌握一些工具, 例如压测工具、发现代码热点的工具。
2.2 基本监控系统方法
在 Linux操作系统中,我们可以使用一些分析系统性能的命令去分析服务器的性能。现在介绍这些命令的使用方法。
2.2.1 ps 命令 ps 命令主要用来获取对于某个进程的一些信息。ps命令的常用参数如下所示
- A: 显示所有进程。
- a: 显示一个终端的所有进程, 除了会话引线。
- N: 忽略选择。
- d: 显示所有进程,但省略所有的会话引线。
- e: 列出程序时, 显示每个程序所使用的环境变量。
- X: 显示没有控制终端的进程,同时显示各个命令的具体路径。dx 不可合用。
- p pid: 进程使用 cpu 的时间。
- u uid or username: 选择有效的用户id或者是用户名。
- g gid or groupname: 显示组的所有进程。
- f: 全部列出,通常和其他选项联用。
- l: 长格式 (有F, wchan,C等字段)。
- j: 作业格式。
- e: 命令之后显示环境。
例:
# 查看所有进程的信息
ps -aux
# 查询所有进程及其环境变量信息
ps -ef
# 通常查看了进程信息后,如果需要终止某个进程,可以使用 kill命令,如下。
kill -KILL [pid]
# 如果需要强行终止某个进程的话,可以使用kill -9 [pid]命令,如下。
kill -9 [pid]
2.2.3 top 命令
top 命令是 Linux 操作系统下最常用的性能分析工具,能够实时地显示操作系统中各个进程消耗资源的情况。该命令可以显示 CUP 使用、内存使用和执行时间,下面执行 top 命令看下执行的情况,如下所示。
[root@VM-0-13-centos ~]# top
top - 15:13:50 up 25 days, 1:58, 1 user, load average: 0.11, 0.05, 0.08
Tasks: 116 total, 2 running, 113 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 98.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1881996 total, 80140 free, 502064 used, 1299792 buff/cache
KiB Swap: 1049596 total, 957928 free, 91668 used. 1172928 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30946 root 20 0 988160 35816 9708 S 0.7 1.9 108:27.91 YDService
1909 redis 20 0 195612 7004 716 S 0.3 0.4 124:09.23 redis-server
13957 mysql 20 0 1054568 166436 4264 S 0.3 8.8 1:21.40 mysqld
20361 root 20 0 162112 2256 1560 R 0.3 0.1 0:00.47 top
1 root 20 0 51912 3768 2388 S 0.0 0.2 6:52.50 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.82 kthreadd ...
我们来分析一下 top 命令的统计信息的含义。
top - 15:13:50 up 25 days, 1:58, 1 user, load average: 0.11, 0.05, 0.08
先来分析 top 命令第 1 行信息,该行信息的具体含义如下。
- 15:13:50 表示系统运行的当前时间。
- up 25 days 表示系统运行时间。
- 1 user 表示登录用户的数量。
- load average: 0.11, 0.05, 0.08 表示系统负载。即任务队列的平均长度三个数值分别为 1 分钟、5 分钟、15 分钟到现在的平均值。(它们的数字是越小越好。数字越高,说明服务器的负载越大)
接着分析 top 命令的第 2 行和第 3 行的具体含义,这两行分别表示进程和 CPU 的性能的一些信息。
Tasks: 116 total, 2 running, 113 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 98.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
下面我们具体分析一下各个统计信息的含义,如下所示。
- 116 total 表示进程的总数。
- 2 running 表示正在运行的进程数量。
- 113 sleeping 表示睡眠的进程数量。
- 0 stopped 表示停止的进程数量。
- 1 zombie 表示僵尸进程数。
- 0.7 us 表示用户空间占用 CPU 的百分比。
- 0.7 sy 表示内核空间占用 CPU 的百分比。
- 0.0 ni 表示用户进程空间内改变过优先级的进程占用 CPU 的百分比。
- 98.3 id 表示空闲 CPU 的百分比。
- 0.3 wa 表示等待输入输出的 CPU 的百分比。
接着分析 top 命令的第 4 行和第 5 行的具体含义,这两行分别表示内存的性能分析信息, 如下。
KiB Mem : 1881996 total, 80140 free, 502064 used, 1299792 buff/cache
- 1881996 total 表示物理内存的总的大小。
- 502064 used 表示使用的物理内存的大小。
- 80140 free 表示空闲的物理内存的大小。
- 1299792 buff/cache 表示内核缓存内存空间的大小。
KiB Swap: 1049596 total, 957928 free, 91668 used. 1172928 avail Mem
下面具体分析一下 Swap 各个统计信息的含义,如下所示。
- 524280k total 表示交换区的总量。
- 91668 used 表示使用的交换区总量。
- 957928 free 表示空闲交换区总量。
- 1172928 avail Mem 表示可用内存空间 。
2.2.4 vmstat 命令
vmstat 命令可以用来显示 Linux 性能指标,该命令分别输出进程、内存、交互区、IO、系统和 CPU 的情况。下面直接输出该命令, 如下所示。
[root@VM-0-13-centos ~]# vmstat
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 91668 85520 148944 1130440 0 0 27 62 15 19 4 2 94 0 0
首先,分析下进程 (procs) 的两列信息,如下所示。
- r 列表示可运行进程的数量。
- b 列表示阻塞进程的数量。
内存性能有 4 个报告虚拟内存如何使用的字段,具体意义如下。
- swpd 表示已经使用的交换空间的数量。
- free 表示自由 RAM 数量。
- buff 表示缓存使用的 RAM 的数量。
- cache 表示文件系统缓存使用的 RAM 数量。
swap 交换字段进行详细说明,如下所示。
- si 表示从磁盘分页到内存的数量。
- so 表示从内存分页到磁盘的数量。
io字段进行详细说明,如下所示。
- bi 表示从磁盘读入的块。
- bo 表示写入磁盘的块。
下面,对系统字段和 CPU 字段进行说明,CPU 状态使用总 CPU 时间的百分比来表示,具体含义如下。
- in 表示系统中断。
- cs 表示进程上下文开关。
- us 表示用户模式。
- sy 表示内核模式。
- wa 表示等待 I/O。
- id 表示空闲状态。
例 :
[root@VM-0-13-centos ~]# vmstat 3 10
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 91668 87496 149688 1134760 0 0 27 62 15 19 4 2 94 0 0
0 0 91668 87232 149696 1134760 0 0 0 35 450 973 1 1 98 0 0
0 0 91668 87072 149696 1134764 0 0 0 0 449 973 1 1 98 0 0
0 0 91668 87304 149700 1134584 0 0 0 19 446 987 1 1 98 0 0
0 0 91668 87304 149700 1134584 0 0 0 0 440 953 1 0 99 0 0
0 0 91668 87252 149700 1134584 0 0 0 17 464 1007 1 1 98 0 0
0 0 91668 87256 149700 1134592 0 0 0 24 461 1009 1 1 98 0 0
0 0 91668 87304 149700 1134592 0 0 0 7 432 934 1 0 99 0 0
0 0 91668 85256 149700 1134600 0 0 0 0 471 1011 1 1 97 0 0
0 0 91668 85424 149708 1134612 0 0 0 356 986 2108 2 2 96 0 0
3 表示每个两秒采集一次服务器状态,10 表示采集 10 次。
显示从系统启动至今的 fork 数量
vmstat -f (linux 下创建进程的系统调用是 fork)
[root@VM-0-13-centos ~]# vmstat -f
9337640 forks
查看内存使用的详细信息
vmstat -s (显示内存相关统计信息及多种系统活动数量)
[root@VM-0-13-centos ~]# vmstat -s
1881996 K total memory
495924 K used memory
731944 K active memory
788832 K inactive memory
119936 K free memory
148936 K buffer memory
1117200 K swap cache
1049596 K total swap
91668 K used swap
957928 K free swap
8981030 non-nice user cpu ticks
1641 nice user cpu ticks
3630611 system cpu ticks
203464511 idle cpu ticks
317867 IO-wait cpu ticks
0 IRQ cpu ticks
23647 softirq cpu ticks
0 stolen cpu ticks
57989204 pages paged in
133580669 pages paged out
33755 pages swapped in
113806 pages swapped out
1149638321 interrupts
2319032091 CPU context switches
1623993315 boot time
9338328 forks
查看磁盘的读/写
vmstat -d (查看磁盘的读写)
[root@VM-0-13-centos ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
vda 879001 32113 115977781 4230083 19061718 9521458 267278066 149614744 0 8955
sr0 88 0 628 57 0 0 0 0 0 0
2.3 定时监控系统状况
2.3.1 sysstat工具
sysstat 工具包含检测系统性能及效率的一组工具。例如 CPU 的使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于判断系统是否正常运行。源码包 github 地址为github.com/sysstat/sys…。
Sysstat 软件包集成如下工具 :
- iostat 工具: 提供 CPU 使用率及硬盘吞吐效率的数据。
- mpstat 工具: 提供单个处理器或多个处理器相关数据。
- sar 工具: 负责收集、报告并存储系统活跃的信息。
- sal 工具: 负责收集并存储每天系统动态信息到一个二进制的文件中。
- sa2 工具: 负责把每天的系统活跃信息写入总结性的报告中。
- sadc 工具: 系统动态数据收集工具,收集的数据被写进一个二进制的文件中。
- sadf 工具: 显示被 sar 工具通过多种格式收集的数据。
下面开始安装 sysstat 工具包, 如下所示。
# 一.源码编译安装
[root@localhost ~]# tar zxvf sysstat-12.5.4.tar.gz
[root@localhost sysstat-10.0.0]# ./configure
[root@localhost sysstat-10.0.0]# make
[root(localhost sysstat-10.0.0]# make install
# 二.使用yum安装
yum install sysstat -y
1. Iostat 工具 Iostat 工具用于输出 CPU 和磁盘 IO 相关的统计信息,具体的语法格式如下:
iostat [-c|-d] [-k] [-t] [-V] [-x] [-p device|ALL] [间隔描述] [检测次数]
上述参数的含义如下 :
- -c: 表示仅显示CPU 的状态。
- -d: 仅显示存储设备的状态, 不可以和 -c 一起使用。
- -k: 默认显示的是读入读出的块信息。
- -t: 显示搜集数据的时间。
- -V: 显示版本号和帮助信息。
- -x: 显示扩展信息。
- -p dev-p device|ALL: device 为某个设备或者某个分区,如果使用 ALL,就表示要显示所有分区和设备的信息。
直接运行 Iostat 命令,结果如下所示。
[root@VM-0-13-centos ~]# iostat
Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos) 07/19/2021 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.23 0.00 1.73 0.15 0.00 93.89
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 9.14 23.74 61.46 63565898 164589173
scd0 0.00 0.00 0.00 314 0
结果中关于 CPU 性能参数的含义如下 :
- %user: 在用户级别运行所使用的 CPU 的百分比。
- %nice: nice 操作所使用的 CPU 的百分比。
- %system: 在系统级别 ( kernel) 运行所使用 CPU 的百分比。
- %iowait: CPU 等待硬件 IO时,所占用 CPU 的百分比。
- %idle: 表示 CPU 空闲时间所占比例。
结果中关于磁盘 IO 性能参数的含义如下 :
- Device: 表示设备块的名字。
- tps: 表示每秒钟发送到的 IO 请求数。
- kB_read/s: 表示从该设备每秒读取的数据块数量。
- kB_wrtn/s: 表示从该设备每秒写入的数据块数量。
- kB_read: 表示从该设备读取的数据块总数。
- kB_wrtn: 表示从该设备写入的数据块总数。
使用 -x 参数可以获得更多的统计信息, 如下所示。
[root@VM-0-13-centos ~]# iostat -d -x -k 1 10
Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos) 07/19/2021 _x86_64_ (1 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
vda 0.01 4.40 0.38 8.76 23.75 61.47 18.64 0.07 7.77 4.54 7.91 0.45 0.41
scd0 0.00 0.00 0.00 0.00 0.00 0.00 7.14 0.00 0.65 0.65 0.00 0.65 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
vda 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
vda 0.00 3.96 0.00 24.75 0.00 142.57 11.52 0.11 4.36 0.00 4.36 0.52 1.29
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
vda 0.00 25.25 0.00 3.03 0.00 113.13 74.67 0.01 2.33 0.00 2.33 2.00 0.61
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
vda 0.00 0.00 0.00 1.01 0.00 4.04 8.00 0.00 2.00 0.00 2.00 3.00 0.30
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
vda 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
vda 0.00 0.00 0.00 1.01 0.00 4.04 8.00 0.00 1.00 0.00 1.00 2.00 0.20
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
vda 0.00 1.00 0.00 176.00 0.00 828.00 9.41 1.21 6.85 0.00 6.85 0.07 1.30
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
vda 0.00 18.00 0.00 3.00 0.00 84.00 56.00 0.01 3.00 0.00 3.00 3.67 1.10
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
vda 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请求的处理的平均时间(单位:毫秒)。这里可以理解为 IO 的响应时间,一般地系统IO响应时间, 应该低于 5ms,如果大于 10ms 就比较大了。
- r_await读取请求的平均时间(单位:毫秒)。
- w_await:写入请求的平均时间(单位:毫秒)。
- svctm:平均每次IO请求的处理时间 (单位:毫秒)。
- %util:在统计时间内所有处理 IO 时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有 0.8 秒在处理 IO ,而 0.2 秒闲置,那么该设备的 %util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 %util 是 100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
此外可以通过如下命令查询 CPU 的部分信息,如下所示。
[root@VM-0-13-centos ~]# iostat -c 1 10
Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos) 07/19/2021 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.23 0.00 1.73 0.15 0.00 93.89
avg-cpu: %user %nice %system %iowait %steal %idle
2.00 0.00 1.00 1.00 0.00 96.00
avg-cpu: %user %nice %system %iowait %steal %idle
11.22 0.00 3.06 0.00 0.00 85.71
avg-cpu: %user %nice %system %iowait %steal %idle
2.02 0.00 1.01 0.00 0.00 96.97
avg-cpu: %user %nice %system %iowait %steal %idle
8.00 0.00 2.00 0.00 0.00 90.00
avg-cpu: %user %nice %system %iowait %steal %idle
2.02 0.00 1.01 0.00 0.00 96.97
avg-cpu: %user %nice %system %iowait %steal %idle
1.00 0.00 1.00 1.00 0.00 97.00
avg-cpu: %user %nice %system %iowait %steal %idle
7.07 0.00 2.02 0.00 0.00 90.91
avg-cpu: %user %nice %system %iowait %steal %idle
1.01 0.00 0.00 0.00 0.00 98.99
avg-cpu: %user %nice %system %iowait %steal %idle
6.06 0.00 2.02 0.00 0.00 91.92
也可以通过以下命令查询某个具体的设备块的信息,如下所示。
[root@VM-0-13-centos ~]# iostat -d -k 1 | grep vda
vda 9.14 23.75 61.47 63565798 164537921
vda 28.00 100.00 240.00 100 240
vda 52.53 0.00 315.15 0 312
vda 1.00 0.00 4.00 0 4
vda 0.00 0.00 0.00 0 0
vda 1.01 0.00 4.04 0 4
vda 0.00 0.00 0.00 0 0
vda 219.00 0.00 1064.00 0 1064
2. Mpstat工具
Mpstat是系统实时监控工具,主要报告 CPU 的一些信息,先了解下该命令的语法 :
mpstat [-P {|ALL}] [internal {cpunt}]
下面分析具体参数的含义 :
- -P {ALL}: 表示需要监控哪个 CPU
- Internal: 表示相邻的两次采样的时间间隔。
- Count: 表示采样的次数。
下面通过案例来理解一下该命令的具体用法。
(1)显示所有 CPU 的信息,每秒钟执行一次。
[root@VM-0-13-centos ~]# mpstat -P ALL 1
Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos) 07/19/2021 _x86_64_ (1 CPU)
06:46:21 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:46:22 PM all 7.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 91.00
06:46:22 PM 0 7.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 91.00
06:46:22 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:46:23 PM all 2.04 0.00 1.02 0.00 0.00 0.00 0.00 0.00 0.00 96.94
06:46:23 PM 0 2.04 0.00 1.02 0.00 0.00 0.00 0.00 0.00 0.00 96.94
06:46:23 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:46:24 PM all 10.00 0.00 3.00 0.00 0.00 0.00 0.00 0.00 0.00 87.00
06:46:24 PM 0 10.00 0.00 3.00 0.00 0.00 0.00 0.00 0.00 0.00 87.00
...
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 4.50 0.00 1.61 0.07 0.00 0.00 0.00 0.00 0.00 93.82
Average: 0 4.50 0.00 1.61 0.07 0.00 0.00 0.00 0.00 0.00 93.82
(2)显示 ID 为 0 的 CPU 的信息, 每秒钟执行一次。
[root@VM-0-13-centos ~]# mpstat -P 0 1
Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos) 07/19/2021 _x86_64_ (1 CPU)
05:19:29 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
05:19:30 PM 0 1.01 0.00 1.01 1.01 0.00 0.00 0.00 0.00 0.00 96.97
05:19:31 PM 0 8.00 0.00 3.00 0.00 0.00 0.00 0.00 0.00 0.00 89.00
05:19:32 PM 0 1.01 0.00 1.01 0.00 0.00 0.00 0.00 0.00 0.00 97.98
05:19:33 PM 0 8.16 0.00 3.06 0.00 0.00 0.00 0.00 0.00 0.00 88.78
05:19:34 PM 0 1.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00
05:19:35 PM 0 7.07 0.00 2.02 0.00 0.00 0.00 0.00 0.00 0.00 90.91
...
Average: 0 5.05 0.00 2.02 0.14 0.00 0.00 0.00 0.00 0.00 92.79
该结果的具体参数项的含义如下所示。
- %usr: 表示处理用户进程所使用 CPU 的百分比。
- %nice: 表示使用nice命令对进程进行降级时 CPU 的百分比。
- %sys: 表示内核进程使用的 CPU 百分比。
- %iowait: 表示等待进行IO所使用的 CPU 时间百分比。
- %irq: 表示用于处理系统中断的 CPU 百分比。
- %soft: 表示用于软件中断的 CPU 百分比。
- %idle: 显示 CPU 的空闲时间。
- %gues: 显示运行虚拟处理器时CPU花费时间的百分比。
- %steal: 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比。
3. sar 工具 sar 是目前 Linux 最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括: 文件的读写情况、系统调用的使用情况、磁盘 I/O、CPU 效率、内存使用状况、进程活动及IPC有关的活动等。 sar 的语法格式如下:
sar [options] [-A] [-o file] t [n]
其中: t 为采样间隔,n 为采样次数,默认值是 1; -o file 表示将命令结果以二进制格式存放在文件中, file 是文件名。options 为命令行选项,选项的含义如下 :
- -A: 所有报告的总和。
- -u: 输出 CPU 使用情况的统计信息。
- -v: 输出 inode、文件和其他内核表的统计信息。
- -d: 输出每一个块设备的活动信息。
- -r: 输出内存和交换空间的统计信息。
- -b: 显示 I/O 和传送速率的统计信息。
- -a: 文件读写情况。
- -c: 输出进程统计信息,每秒创建的进程数。
- -R: 输出内存页面的统计信息。
- -y: 终端设备活动情况。
- -w: 输出系统交换活动信息。
下面通过一个案例来理解 sar 工具的使用方法,如下所示。
[root@VM-0-13-centos ~]# sar -u 1 5
Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos) 07/19/2021 _x86_64_ (1 CPU)
05:14:57 PM CPU %user %nice %system %iowait %steal %idle
05:14:58 PM all 8.08 0.00 2.02 2.02 0.00 87.88
05:14:59 PM all 0.00 0.00 1.01 0.00 0.00 98.99
05:15:00 PM all 8.00 0.00 3.00 0.00 0.00 89.00
05:15:01 PM all 4.04 0.00 4.04 0.00 0.00 91.92
05:15:02 PM all 10.00 0.00 3.00 0.00 0.00 87.00
Average: all 6.04 0.00 2.62 0.40 0.00 90.95
结果中具体参数的含义如下所示。
- CPU: all 表示统计信息为所有CPU的平均值。
- %user : 显示在用户级别 ( application) 运行使用 CPU 总时间的百分比。
- %nice: 显示在用户级别,用于 nice 操作所占用 CPU 总时间的百分比。
- %system: 在核心级别 ( kernel) 运行所使用 CPU 总时间的百分比。
- %iowait: 显示用于等待 IO 操作占用 CPU 总时间的百分比。
- %steal: 管理程序( hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
- %idle: 显示 CPU 空闲时间占用 CPU 总时间的百分比。
注意 : 如果 %iowait 的值过高,表示硬盘存在 I/O 瓶颈;如果 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量; 若 %idle 的值持续低于 10,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是CPU。