# 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
 ...
  1. procs第1列r表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。第2列b表示在等待资源的进程数,等待的资源有I/O或内存交换等。
  2. cpu列显示了用户进程和内核进程所消耗的CPU时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多。us+sy的参考值为80%,如果us+sy长期大于80%说明可能存在CPU资源不足的情况。
  3. memory列表示系统内存资源使用情况。
  4. swap列表示系统交换分区使用情况,一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要增加系统内存。
  5. io列显示磁盘的读写状况,这里设置的bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘IO有问题。
  6. 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 输出扩展信息
Last Updated: 9/24/2021, 11:47:17 AM