Load Average(负载平均值)是一个用于衡量系统负载的指标,它表示一段时间内处于活跃状态的进程数目。一般来说,系统的负载值应该维持在一个合理的范围内,以确保系统能够正常运行并提供良好的响应时间。理想情况下,负载值应该小于系统的CPU核心数,但具体的适宜值取决于系统的用途和配置。

概念

什么是负载

Load Average(负载平均值)是一个用于衡量系统负载的指标,它表示一段时间内处于活跃状态的进程数目。Load Average通常用三个值来表示,分别对应于过去1分钟、5分钟和15分钟的平均值。

在Linux系统中,Load Average的值可以通过使用uptime命令或命令top来获取。以下是一个示例输出:

[root@home-201 ~]# uptime
 11:03:04 up 32 days, 15:48,  1 user,  load average: 1.14, 1.41, 1.49

这里的Load Average值为1.14(1分钟平均)、1.14(5分钟平均)和1.49(15分钟平均)。

解释Load Average的含义:

  1. 1分钟、5分钟、15分钟的平均值: 分别对应了过去1分钟、5分钟和15分钟内系统的平均负载。

  2. 理想状态: 在理想状态下,Load Average的值应该小于系统的CPU核心数。例如,如果你有4个CPU核心,那么一个良好运行的系统的Load Average应该维持在4以下。

  3. 负载平均值小于CPU核心数: 表示系统目前相对空闲,进程在几乎没有等待CPU资源。

  4. 负载平均值接近或超过CPU核心数: 表示系统处于较高的负载状态,进程可能需要等待CPU资源。

  5. 负载平均值大幅度增加: 可能表示系统资源不足,需要进一步调查和优化。

需要注意的是,Load Average并不仅仅表示CPU的利用率,它还包括了等待I/O、网络等资源的进程。因此,即使CPU利用率并不高,Load Average仍然可能较高,这可能是因为其他资源的限制导致的。系统管理员可以通过观察Load Average来了解系统的繁忙程度,以便及时调整系统配置或采取其他措施来提高性能。

“高”的概念

我们要分析负载就必然需要有一个标准来判断相关的指标是否属于过高,以下是一些指标对于“高”的评判标准(参考标准)。

1. 负载高

当我们知道负载的概念之后,就知道衡量负载是否高还取决于CPU的核数,以1个CPU核数满负载为1来计算,几核CPU的满负载就是几,而一般情况我们不会以1作为高的衡量标准,而是0.7,所以可以将CPU核数乘以0.7当做高负载的临界值,超过这个值,我们就认为负载过高。

比如一个8核的主机,它的高负载临界值就是 8*0.7=5.6 当负载超过这个值,就说明有点高了,而如果负载直接超过了8*1=8,那就说明已经有进程需要排队。

2. CPU高

top命令中,可以通过查看显示的CPU利用率来判断CPU是否高。top命令的输出包含了有关系统性能的详细信息,其中包括CPU利用率。

打开终端并运行top命令后,你会看到类似以下的输出:

top - 14:07:56 up 31 days, 18:53,  1 user,  load average: 0.53, 1.01, 1.17
Tasks: 409 total,   1 running, 407 sleeping,   0 stopped,   1 zombie
%Cpu(s):  9.3 us,  4.8 sy,  0.0 ni, 85.6 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem : 16265872 total,   304432 free, 11046344 used,  4915096 buff/cache
KiB Swap:  4194300 total,   915820 free,  3278480 used.  4160012 avail Mem 

在这个输出中,关注%Cpu(s)一行,这一行显示了不同的CPU利用率:

  • us 表示用户空间程序的CPU使用率。
  • sy 表示系统空间程序的CPU使用率。
  • ni 表示用于nice操作的CPU使用率。
  • id 表示CPU空闲的百分比。
  • wa 表示CPU等待I/O的百分比。
  • hi 表示硬中断的百分比。
  • si 表示软中断的百分比。
  • st 表示被偷取(被虚拟化宿主抢占)的时间百分比。

CPU总和=100%=us+sy+ni+id+wa+hi+si+st,如果id的数据为0,则表名CPU已经全部被占用,没有多余的空间,此时其他列的数据之和应该是接近100%。

在这个例子中,ussy的和表示用户程序和系统程序的总CPU使用率。在这里,9.3 us表示用户程序占用了9.3%的CPU,4.8 sy表示系统程序占用了4.8%的CPU。总的用户程序和系统程序占用的CPU使用率为14.1%。

如果你观察到%Cpu(s)行中的ussy的值较高,那么系统的CPU使用率就相对较高。在top命令的实时更新中,你还可以看到哪些进程占用了大量的CPU资源。按下q键退出top命令。

top命令下,按键盘的1,就可以显示每个CPU的使用数据,如:

top - 17:19:59 up 31 days, 22:05,  1 user,  load average: 0.80, 1.15, 1.21
Tasks: 395 total,   1 running, 394 sleeping,   0 stopped,   0 zombie
%Cpu0  :  8.6 us,  3.0 sy,  0.0 ni, 87.4 id,  0.0 wa,  0.0 hi,  1.0 si,  0.0 st
%Cpu1  :  8.4 us,  2.7 sy,  0.0 ni, 88.6 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu2  :  9.6 us,  2.0 sy,  0.0 ni, 88.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu3  :  5.7 us,  2.7 sy,  0.0 ni, 91.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  7.0 us,  2.7 sy,  0.0 ni, 90.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  6.0 us,  2.3 sy,  0.0 ni, 91.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  8.1 us,  1.7 sy,  0.0 ni, 90.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  8.4 us,  2.3 sy,  0.0 ni, 88.9 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem : 16265872 total,   373928 free, 11065292 used,  4826652 buff/cache
KiB Swap:  4194300 total,   910124 free,  3284176 used.  4128656 avail Mem 

3. 内存高

使用top命令或free -h命令都可以查看到内存的使用情况,如果是单独只看内存,一般都使用free -h 命令,这将用于以人类可读的格式显示系统内存的使用情况。以下是 free -h 命令输出的主要内存指标以及它们的意义:

              total        used        free      shared  buff/cache   available
Mem:            15G         10G        324M        745M        4.7G        3.9G
Swap:          4.0G        3.1G        886M
  1. total(总内存): 表示系统上总共的内存量,包括物理内存和交换空间。

  2. used(已用内存): 表示当前系统正在使用的内存量,包括正在使用的物理内存和交换空间。

  3. free(空闲内存): 表示当前系统未被使用的内存量,即尚未分配给任何进程的内存。

  4. shared(共享内存): 表示被多个进程共享的内存量。

  5. buff/cache(缓存和缓冲区): 表示被用作文件系统缓存和缓冲区的内存量。这部分内存实际上是空闲的,如果系统需要,可以很容易地被释放。

  6. available(可用内存): 表示系统当前可用的内存量,包括空闲内存和缓存。

对于内存是否使用过高,主要关注以下几个方面:

  • 已用内存(used): 如果已用内存接近或超过总内存的一定比例,可能表示系统正在用尽可用的物理内存。

  • 空闲内存(free): 如果空闲内存非常低,可能表示系统内存资源紧张。在某些情况下,系统可能需要使用交换空间,这可能导致性能下降。

  • 缓存和缓冲区(buff/cache): 缓存和缓冲区是系统使用的文件系统缓存和缓冲,它们可以被释放以满足需要。如果缓存和缓冲区的值很高,而已用内存不是很高,系统仍然有足够的空闲内存。

综合考虑这些指标,可以得出关于系统内存使用情况的综合判断。在正常运行状态下,一些缓存和缓冲区的使用是正常的,但如果系统频繁地使用交换空间,或者已用内存接近或超过总内存,可能需要进一步分析和优化系统配置。

就像上面内存数据,虽然free看似很低,但是实际内存的使用used并不算高,可用内存available还是够的。

4. IO高

要查看系统的IO(输入/输出)是否高,可以使用一些命令和工具来监视磁盘活动。以下是一些常用的方法:

  1. iostat命令: iostat 命令是 sysstat 包的一部分,用于显示CPU、内存和磁盘I/O的统计信息。在终端中运行以下命令:iostat

    iostat 会显示每个磁盘的平均读写速率、响应时间等信息。可以通过 iostat -d 仅显示磁盘相关的信息。

  2. iotop命令: iotop 是一个交互式的工具,可以显示磁盘I/O活动的实时信息,以及各个进程对磁盘的使用情况。运行以下命令:iotop

    iotop 的输出按磁盘I/O使用率排序,可以方便地找到占用I/O资源较多的进程。

  3. vmstat命令: vmstat 命令可以显示虚拟内存的统计信息,包括磁盘I/O情况。运行以下命令:vmstat 1

    vmstat 每秒输出一次系统统计信息,其中 bi 表示块(block)输入,bo 表示块输出,用于表示磁盘I/O活动。

  4. sar命令: sar 命令是 sysstat 包中的另一个工具,可以提供关于系统性能的历史数据。运行以下命令:sar -d 1

    sar -d 会显示磁盘活动的统计数据,包括读写速率、I/O等待时间等。

通过观察这些工具的输出,你可以了解系统磁盘I/O的情况,包括磁盘读写速率、I/O等待时间、磁盘使用情况等。一般来说,如果磁盘I/O活动持续很高,可能会导致系统性能下降。在这种情况下,可能需要考虑优化磁盘使用,例如使用更快的磁盘、优化文件系统,或者通过分析具体进程的I/O使用情况来找出性能瓶颈。

导致负载高的因素

基于上面说到的,系统平均负载是指处于可运行状态和不可中断状态的进程的平均数量,只要是会导致这两种进程数量增加的因素,就会导致负载升高。

每一种可能导致负载升高的情况都可能伴随着特定的现象。以下是一些常见的现象和对应的原因(来自ChatGPT的总结):

  1. CPU密集型任务:

    • 现象: 高用户和系统CPU使用率。
    • 原因: 系统正在执行需要大量计算资源的任务。
  2. 内存不足:

    • 现象: 高交换空间使用率、高磁盘IO。
    • 原因: 系统开始使用交换空间,因为物理内存不足。
  3. IO密集型任务:

    • 现象: 高磁盘IO或网络IO。
    • 原因: 系统中的任务频繁进行文件读写、数据库查询或网络通信。
  4. 进程调度问题:

    • 现象: 多个进程争夺CPU时间,导致CPU使用率波动。
    • 原因: 系统调度算法不合理,导致进程无法有效地共享CPU资源。
  5. 多核心处理器不平衡:

    • 现象: 部分CPU核心负载高,而其他核心相对空闲。
    • 原因: 任务无法充分利用所有可用的CPU核心。
  6. 大量进程或线程:

    • 现象: 高进程数或线程数。
    • 原因: 系统同时运行了大量的进程或线程。
  7. 不合理的系统配置:

    • 现象: 异常的系统日志、性能参数不合理。
    • 原因: 内核参数设置、日志记录、网络配置等不合理。
  8. 恶意软件或攻击:

    • 现象: 异常的网络流量、未知进程或服务。
    • 原因: 恶意软件或攻击占用系统资源。
  9. 系统故障或硬件故障:

    • 现象: 系统错误消息、硬件故障日志。
    • 原因: 可能有硬件故障、磁盘损坏或其他系统故障。

要更详细地了解这些现象,可以使用系统监控工具来查看实时的系统性能指标,例如CPU使用率、内存使用率、磁盘IO等。系统日志也是诊断问题的有用信息源。解决问题通常需要根据具体的现象采取相应的措施,例如优化代码、增加硬件资源、调整系统配置等。

排查思路

常用工具

1. top 命令

使用 top 查看进程纬度的 CPU 负载。

top - 10:28:09 up 32 days, 15:13,  1 user,  load average: 3.35, 2.01, 1.81
Tasks: 399 total,   2 running, 397 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.3 us,  3.1 sy,  0.0 ni, 88.3 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem : 16265872 total,   337164 free, 11029840 used,  4898868 buff/cache
KiB Swap:  4194300 total,   914156 free,  3280144 used.  4125944 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                       
 7954 easyops   20   0 4552408 662720   6836 S  15.2  4.1   3431:04 apm_metric_proc                               
 6432 easyops   20   0 4033324  82084   8228 S  14.2  0.5   3255:02 aggregate_metri                               
10045 easyops   20   0 3526140  84144   6360 S  11.9  0.5   2586:17 alert_metric_pr                               
 5205 easyops   20   0 4083512 239556   9572 S   8.9  1.5   1933:38 raw_metric_proc                               
29580 easyops   20   0 8193436 687188   3608 S   7.3  4.2   3324:52 java                                          
 3317 easyops   20   0 1284192  66020   8012 S   2.6  0.4   1290:26 notify_worker                                 
 1032 root      20   0 1317372  72972   7700 S   2.3  0.4   1018:05 tailscaled                                    
21217 easyops   20   0 1516680  59216   8596 S   2.0  0.4 318:24.03 appconfig                                     
18960 root      20   0  200964  12500   2796 S   1.7  0.1 316:18.75 service_registr                               
19743 easyops   20   0 2967780 453464  16856 S   1.0  2.8 134:04.43 easy_core                                     
21634 root      20   0  193728  12760   4472 R   1.0  0.1   0:00.03 python         

默认界面上第三行%Cpu(s)会显示当前 CPU 资源的总体使用情况,下方会显示各个进程的资源占用情况。

可以直接在界面输入大小字母 P,来使监控结果按 CPU 使用率倒序排列,进而定位系统中占用 CPU 较高的进程。最后,根据系统日志和程序自身相关日志,对相应进程做进一步排查分析,以判断其占用过高 CPU 的原因。

2. vmstat 命令

可以通过 vmstat 从系统维度查看 CPU 资源的使用情况

vmstat -n 1 命令用于以每秒一次的频率输出系统的虚拟内存统计信息。下面是 vmstat -n 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 3279972 336728      0 4898008    0    0    66   136    1    1 11  4 85  0  0
 0  0 3279972 331416      0 4898068    0    0     0    44 14204 24829  8  3 89  0  0
 1  0 3279972 331668      0 4898128    0    0     0     0 14120 24757  9  3 88  0  0
 3  0 3279972 322108      0 4898188    0    0     0     0 13712 24152  8  3 89  0  0
 4  0 3279972 315292      0 4898296    0    0     0     4 15621 24557 11  9 79  0  0
 0  0 3279972 311416      0 4898460   20    0    20   393 27405 49503 16 11 73  0  0

每列的含义如下:

  1. procs:

    • r: 运行队列的平均长度,表示正在等待运行的进程数。
    • b: 处于不可中断状态的进程数,通常是因为等待某些资源,如磁盘I/O。
  2. memory:

    • swpd: 使用的交换空间,单位为 KB。
    • free: 空闲内存,单位为 KB。
    • buff: 用作缓冲区的内存,单位为 KB。
    • cache: 用作缓存的内存,单位为 KB。
  3. swap:

    • si: 每秒从磁盘交换到内存的数据量,单位为 KB。
    • so: 每秒从内存交换到磁盘的数据量,单位为 KB。
  4. io:

    • bi: 每秒从块设备接收的块数,单位为 blocks。
    • bo: 每秒发送到块设备的块数,单位为 blocks。
  5. system:

    • in: 每秒的中断数,包括时钟中断。
    • cs: 每秒上下文切换的次数。
  6. cpu:

    • us: 用户空间程序执行的时间百分比。
    • sy: 系统内核程序执行的时间百分比。
    • id: CPU 空闲时间百分比。
    • wa: CPU 等待I/O操作的时间百分比。
    • st: 被虚拟化宿主抢占的时间百分比。

这些值提供了关于系统性能的实时快照,可用于监测 CPU、内存、磁盘和系统调度等方面的活动。通过观察这些值的变化,你可以快速了解系统是否面临性能问题,并找出潜在的瓶颈。

以下是一些常见的 vmstat 输出指标异常情况及可能的异常事情:

  1. r(运行队列长度)和 b(不可中断进程数):

    • 异常情况: 长时间高于系统核心数的运行队列长度。
    • 可能的异常事情: 系统过载,进程等待资源,可能导致性能下降。
  2. swpd(使用的交换空间):

    • 异常情况: 非零值,或者逐渐增加。
    • 可能的异常事情: 系统内存不足,可能导致频繁的交换,影响性能。
  3. free(空闲内存):

    • 异常情况: 迅速减少到很小的值。
    • 可能的异常事情: 系统可能经历了内存耗尽,可能需要优化或增加内存。
  4. siso(交换的数据量):

    • 异常情况: 非零值或者持续增加。
    • 可能的异常事情: 系统内存不足,导致频繁的数据交换,可能影响性能。
  5. bibo(块设备的数据传输量):

    • 异常情况: 非零值或者持续增加。
    • 可能的异常事情: 高磁盘I/O活动,可能是由于大量的读写操作,可能是磁盘性能问题。
  6. incs(中断和上下文切换):

    • 异常情况: 非零值或者持续增加。
    • 可能的异常事情: 高中断或上下文切换,可能是由于硬件问题、网络问题或者进程频繁切换。
  7. ussyidwast(CPU使用率):

    • 异常情况:
      • ussy 总和高:表示CPU使用过高,可能是由于应用程序或内核进程的问题。
      • wa 高:表示CPU等待I/O操作,可能是磁盘性能问题。
      • st 高:表示虚拟化宿主抢占了CPU资源。
    • 可能的异常事情: 高CPU使用率可能导致性能下降,需要进一步分析具体原因。

总的来说,vmstat 提供了系统性能的快照,异常情况的观察可以帮助你发现潜在的问题并采取相应的措施来解决。

3. iotop 命令

iotop命令是一个非系统工具,需要单独安装yum install -y iotop

iotop 命令用于实时监视系统中的磁盘I/O活动,并显示导致磁盘I/O的进程和相关指标。以下是 iotop 输出的一些主要指标及其含义:

Total DISK READ :       0.00 B/s | Total DISK WRITE :     132.06 K/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:      28.78 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                            
29852 be/4 easyops     0.00 B/s    3.39 K/s  0.00 %  0.02 % java -Xms512M -Xmx512M -XX~/jetty-ut [kafka-scheduler]
29853 be/4 easyops     0.00 B/s    3.39 K/s  0.00 %  0.01 % java -Xms512M -Xmx512M -XX~/jetty-ut [kafka-scheduler]
20586 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/6:2]
29949 be/4 easyops     0.00 B/s   20.32 K/s  0.00 %  0.00 % java -Xms512M -Xmx512M -XX~/jetty-ut [data-plane-kafk]
18122 be/4 easyops     0.00 B/s    6.77 K/s  0.00 %  0.00 % ./bin/easy_tsdb [tokio-runtime-w]
18129 be/4 easyops     0.00 B/s   10.16 K/s  0.00 %  0.00 % ./bin/easy_tsdb
18131 be/4 easyops     0.00 B/s    3.39 K/s  0.00 %  0.00 % ./bin/easy_tsdb
  1. Total DISK READ(总磁盘读取)和 Total DISK WRITE(总磁盘写入):

    • 表示系统上所有进程的总磁盘读写速率。
  2. Actual DISK READ(实际磁盘读取)和 Actual DISK WRITE(实际磁盘写入):

    • 表示当前 iotop 统计的瞬时磁盘读写速率。
  3. TID(线程ID)、PRIO(进程优先级)、USER(用户)、DISK READ(磁盘读取)、DISK WRITE(磁盘写入)、SWAPIN(交换到内存的数据量)、IO>(I/O等待的百分比)、COMMAND(命令):

    • 分别表示与磁盘I/O相关的进程的线程ID、进程优先级、用户、磁盘读取速率、磁盘写入速率、交换到内存的数据量、I/O等待百分比、进程的命令。

异常情况和可能的异常指标:

  1. 高的磁盘读写速率:

    • 可能的异常: 进程正在进行大量的磁盘读写操作,可能是由于应用程序产生了大量的磁盘活动。
  2. 高的I/O等待百分比(IO>):

    • 可能的异常: 进程在等待磁盘I/O完成的时间较长,可能是由于磁盘性能不足、磁盘故障或其他原因导致的。
  3. 高的SWAPIN值:

    • 可能的异常: 进程可能正在频繁地将数据从交换空间交换到内存中,可能是由于内存不足导致的。
  4. 特定进程的高磁盘读写速率:

    • 可能的异常: 某个特定的进程正在产生大量的磁盘活动,可能是由于应用程序问题或者配置问题导致的。

观察这些指标,尤其是I/O等待百分比和特定进程的磁盘读写速率,可以帮助你找到导致磁盘I/O阻塞的原因,并采取相应的措施解决问题。

CPU高、负载高的情况分析

当发现CPU高、负载也高的时候,可以直接使用top命令并且按下键盘大写P,切换成按照CPU排序,找出使用CPU高的进程,然后对进程进行单独的分析,有必要的时候可以kill掉进程重启服务。

CPU低、负载高的情况分析

看一个真实案例,下面是某一次客户现场的一台主机的故障top显示的数据:

top - 14:42:18 up 28 days, 5:03,  4 user,  load average: 439.79, 434.88, 421.38
Tasks: 337 total,   2 running, 332 sleeping,   0 stopped,   3 zombie
%Cpu0  :  19.7 us,  11.6 sy,  0.0 ni, 0.0 id,  68.0 wa,  0.0 hi,  0.5 si,  0.1 st
%Cpu1  :  31.7 us,  13.8 sy,  0.0 ni, 0.0 id,  53.8 wa,  0.0 hi,  0.7 si,  0.1 st
%Cpu2  :  23.3 us,  25.5 sy,  0.0 ni, 0.0 id,  50.0 wa,  0.0 hi,  1.1 si,  0.1 st
%Cpu3  :  24.7 us,  12.6 sy,  0.0 ni, 0.0 id,  61.3 wa,  0.0 hi,  1.4 si,  0.1 st
%Cpu4  :  29.7 us,  14.2 sy,  0.0 ni, 0.0 id,  54.8 wa,  0.0 hi,  1.2 si,  0.1 st
%Cpu5  :  40.0 us,  14.8 sy,  0.0 ni, 0.0 id,  44.2 wa,  0.0 hi,  0.8 si,  0.2 st
%Cpu6  :  38.2 us,  13.4 sy,  0.0 ni, 0.0 id,  47.7 wa,  0.0 hi,  0.7 si,  0.1 st
%Cpu7  :  37.1 us,  18.3 sy,  0.0 ni, 0.0 id,  44.1 wa,  0.0 hi,  0.5 si,  0.1 st
KiB Mem : 15708.4 total,   57.0 free, 13687.7 used,  1963.7 buff/cache
KiB Swap:  0.0 total,   0.0 free,  0.0 used.  0.0 avail Mem 

从这个数据可以看到,ussy的和在50%左右,而wa的占用就占了50%左右,导致id都是0,也就是所有的CPU都没有空闲。

此时可以判断是有大量的IO阻塞,于是进一步使用iotop命令去分析了IO情况,然后找到了大量使用磁盘的进程(异常进程),最终定位的原因是磁盘性能问题。

参考文章