# Linux 性能检测与优化
# CPU 相关
查看监视CPU的命令工具有很多,常见的有uptime、top、vmstat等,以下分别介绍最常用的uptime、vmstat命令。
# uptime
[root@fa6147179]# uptime
10:26:48 up 6 days, 18:13, 1 user, load average: 0.02, 0.15, 0.21
uptime的输出可以作为Linux系统整体性能评估的一个参考。这里主要关注的是load average参数,3个值分别表示最近1分钟、5分钟、15分钟的系统负载值。此部分值可参考CPU的个数或核数,有关CPU的信息可以查看系统中的/proc/cpuinfo文件。
如果5分钟的负载值或15分钟的负载值长期超过CPU个数的两倍,说明系统当前处于高负载,需要关注并优化;如果数值长期低于CPU个数或核数,说明系统运行正常;如果长期处于数值1以下则说明系统CPU资源没有得到有效利用,CPU处于空闲状态。
# vmstat
vmstat是一个比较全面的性能分析工具,通过此工具可以观察进程状态、内存使用情况、swap使用情况、磁盘的IO、CPU的使用等信息。
[root@fa6147179]# 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
1 0 1544 31946920 450152 12761220 0 0 45 97 13 6 3 1 96 0 0
0 0 1544 31953564 450152 12761268 0 0 0 20 1300 1200 2 1 97 0 0
0 0 1544 31955932 450152 12761344 0 0 0 20 2870 3495 2 1 97 0 0
1 0 1544 31955200 450152 12761344 0 0 0 644 1317 1069 6 1 93 0 0
0 0 1544 31957624 450152 12761356 0 0 0 20 1091 976 3 1 96 0 0
0 0 1544 31958876 450152 12761428 0 0 0 20 966 880 3 1 97 0 0
0 0 1544 31958832 450152 12761496 0 0 0 20 1000 928 2 1 98 0 0
0 0 1544 31961560 450152 12761576 0 0 0 20 2028 3779 6 3 92 0 0
0 0 1544 31961844 450152 12761660 0 0 0 128 978 971 2 0 98 0 0
0 0 1544 31961528 450152 12761668 0 0 0 20 963 937 2 0 97 0 0
0 0 1544 31960136 450152 12761672 0 0 0 20 990 877 2 1 97 0 0
...
- procs第1列r表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。第2列b表示在等待资源的进程数,等待的资源有I/O或内存交换等。
- cpu列显示了用户进程和内核进程所消耗的CPU时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多。us+sy的参考值为80%,如果us+sy长期大于80%说明可能存在CPU资源不足的情况。
- memory列表示系统内存资源使用情况。
- swap列表示系统交换分区使用情况,一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要增加系统内存。
- io列显示磁盘的读写状况,这里设置的bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘IO有问题。
- system项显示采集间隔内发生的中断数。in和cs这2个值越大,会看到由内核消耗的CPU时间会越多。
vmstat输出参数说明:
参数 | 说明 |
---|---|
swpd | 表示切换到内存交换区的内存数量,以KB为单位 |
free | 表示当前空闲的物理内存数量,以KB为单位 |
buff | 表示buffer cache的内存数量,一般对块设备的读写才需要缓冲 |
cache | 表示page cached的内存数量 |
si | 内存进入内存交换区的数量 |
so | 内存交换区进入内存的数量 |
bi | 表示从块设备读入数据的总量,以KB为单位 |
bo | 表示写入到块设备的数据总量,以KB为单位 |
in | 表示在某一段时间间隔中观测到每秒设备中断数 |
cs | 表示每秒产生的上下文切换次数。值越大表示由内核消耗的CPU时间越多 |
us | 表示用户进程消耗的CPU时间百分比。如果值比较高需要考虑优化程序或算法 |
sy | 表示内核进程消耗的CPU时间百分比。sy的值较高时,说明内核消耗的CPU资源很多 |
id | 表示CPU处在空闲状态的时间百分比 |
wa | 表示IO等待所占用的CPU时间百分比。wa值越高,说明IO等待越严重,参考值20% |
# 内存相关
内存是考察系统性能的主要指标,比如内存使用情况超过70%,表示系统内存资源紧张,需要及时优化。另外,swap交换分区如果使用率较高,则说明系统频繁地进行硬盘与内存之间的换页,需要特别留意。监视系统内存常用的命令有top、free、vmstat等。
# top
[root@fa6147179]# top
top - 11:00:27 up 6 days, 18:47, 1 user, load average: 0.37, 0.28, 0.19
Tasks: 240 total, 1 running, 239 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.7 us, 0.6 sy, 0.0 ni, 97.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 49444868 total, 31873940 free, 4334256 used, 13236672 buff/cache
KiB Swap: 16777212 total, 16775668 free, 1544 used. 44176912 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1715 git 20 0 2082172 1.0g 8248 S 4.0 2.1 707:31.73 bundle
1539 gitlab-+ 20 0 85288 17512 1744 S 2.0 0.0 204:35.73 redis-server
9 root 20 0 0 0 0 S 0.3 0.0 5:12.55 rcu_sched
798 root 20 0 225096 6072 4752 S 0.3 0.0 7:40.59 vmtoolsd
1514 root 20 0 4232 448 364 S 0.3 0.0 9:46.14 runsv
1587 git 20 0 1186884 45448 7372 S 0.3 0.1 19:42.27 gitaly
1766 git 20 0 2547428 73280 4876 S 0.3 0.1 19:20.81 ruby
124646 root 20 0 162224 2412 1584 R 0.3 0.0 0:00.09 top
1 root 20 0 43548 3400 2092 S 0.0 0.0 1:05.68 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.19 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:03.00 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:09.03 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
上述实例中,Mem行依次表示总内存、空闲的内存、已经使用的内存、用于缓存文件系统的内存。swap行表示交换空间总大小、空闲的交换空间、使用的交换内存空间、可用的内存空间。
默认情况下,top命令每隔5秒钟刷新一次数据。执行完top命令后top进入命令等待模式。top提供了丰富的参数用于查看当前系统的信息,比如按m键进入内存模式,并按内存占用百分比排序
[root@fa6147179]# top
top - 11:02:10 up 6 days, 18:49, 1 user, load average: 0.27, 0.28, 0.21
Tasks: 241 total, 1 running, 240 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.1 us, 1.8 sy, 0.0 ni, 95.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 10.6/49444868 [||||||||||| ]
KiB Swap: 0.0/16777212 [ ]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1544 git 20 0 386652 45876 4376 S 5.3 0.1 122:57.14 gitlab-exporter
1554 gitlab-+ 20 0 2433968 176148 17020 S 4.3 0.4 60:20.36 prometheus
1715 git 20 0 2082172 1.0g 8248 S 3.0 2.1 707:38.62 bundle
1539 gitlab-+ 20 0 85288 17452 1744 S 2.0 0.0 204:37.96 redis-server
1587 git 20 0 1186884 43668 7372 S 1.0 0.1 19:42.49 gitaly
98526 git 20 0 1620184 985068 4232 S 0.7 2.0 0:30.07 bundle
1514 root 20 0 4232 448 364 S 0.3 0.0 9:46.24 runsv
97668 git 20 0 1610456 983312 4228 S 0.3 2.0 0:30.54 bundle
1 root 20 0 43548 3400 2092 S 0.0 0.0 1:05.69 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.19 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:03.00 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:09.03 migration/0
# free
free是查看Linux系统内存使用状况时最常用的指令
[root@fa6147179]# free
total used free shared buff/cache available
Mem: 49444868 4304152 31900688 392788 13240028 44206824
Swap: 16777212 1544 16775668
计算应用程序占用内存,可以使用以下公式计算
total – free – buff/cache
# vmstat
swpd列表示切换到内存交换区的内存数量,以KB为单位。此处swpd的值为0,若不为0且磁盘调入内存的值si和由内存调入磁盘so的值均为0,都表示系统暂时没有进行内存页交换,内存资源充足,系统性能暂时没有问题。
# 磁盘I/O相关
在涉及硬盘操作时,一般根据业务的具体情况选择合适的方案。比如读写频繁的应用尽可能用内存的读写代替直接硬盘操作,内存读写操作速度比硬盘直接读写的效率要高千倍。另外,对于数据量非常大的应用可以考虑数据的冷热分离,常使用、常访问的文件可以放入性能比较好的硬盘中,如SSD;冷数据则可以考虑放入存储空间较大的普通硬盘上。使用裸设备代替文件系统也可节省系统资源开销。磁盘的性能评估可以使用iostat命令。
[root@fa6147179]# iostat -d 2 4
Linux 3.10.0-862.9.1.el7.x86_64 (fa6147179) 09/24/2021 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
fd0 0.00 0.00 0.00 336 0
sda 7.76 2.71 170.48 9803801 616309376
sdb 3.09 3.50 183.57 12656112 663642412
dm-0 29.25 6.03 353.21 21799881 1276907424
dm-1 0.26 0.18 0.84 649080 3042316
上述示例中tps表示每秒钟发送到的I/O请求数,kB_read/s表示每秒读取的数据块数,kB_wrtn/s表示每秒写入的数据块数,kB_read表示读取的所有块数,kB_wrtn表示写入的所有块数。
参数 | 说明 |
---|---|
-c | 仅显示CPU统计信息,与-d选项互斥 |
-d | 仅显示磁盘统计信息,与-c选项互斥 |
-k | 以KB为单位显示每秒的磁盘请求数,默认单位为块 |
-p | 跟具体设备或参数ALL,用于显示某块设备及系统分区的统计信息 |
-t | 在输出数据时,打印搜集数据的时间 |
-V | 打印版本号和帮助信息 |
-x | 输出扩展信息 |