编辑
2023-12-28
Linux
00
请注意,本文编写于 141 天前,最后修改于 126 天前,其中某些信息可能已经过时。

目录

load
load 值
单核
多核
load 合理取值
load 过高排查思路
引起load高的因素
load 高的场景
CPU高、Load高
vmstat 查看系统 CPU 负载
top 查看进程 CPU 负载
CPU低、Load高
load average和CPU利用率的区别
参考

load

关于load,Wikipedia 的解释是这样的:

In UNIX computing, the system load is a measure of the amount of computational work that a computer system performs. The load average represents the average system load over a period of time.

系统的Load是对于计算机系统执行计算任务数量的一种度量(注意关键词:amount,数量)。load average代表了一段时间内的系统平均load。

load 值

示例,如下:

单核

image.png

  • load = 0 时,代表桥上没有车辆通行,桥完全处于空闲状态。
  • load = 0.5时,代表桥上有50%的车辆,但还剩下50%的容量。事实上,只要Load还未达到1,桥就还有空余容量,所以此时如果有新的车辆到来,是可以直接上桥不用排队的。
  • load = 1时,代表桥上有100%的车辆,已经没有空余,但也没有车在排队。
  • load = 1.7时,代表桥上有100%的车辆,已经没有空余,而且有70%的车在排队等待上桥。事实上,只要Load大于等于1,就代表桥已经满载,所以此时如果有新的车辆到来,就需要在外面排队等待。

一个空闲CPU的 load number = 0,每一个正在使用或者等待使用CPU的任务会使 load number + 1,每一个结束的任务会使 load number - 1。系统会计算一段时间内的 exponentially damped/weighted moving average 作为load average。数学公式先抛开,只看结论的话就是,load average代表着正在使用和等待使用CPU的任务数之和。

对应上面大桥的例子,就是:

  • load = 0 时,代表CPU完全空闲,没有任务执行,没有任务等待。
  • load = 0.5时,代表CPU正在执行的任务量达到50%,但还剩下50%的空闲。
  • load = 1时,代表CPU已经达到100%,已经没有空余,但也没有任务在排队。
  • load = 1.7时,代表CPU已经达到100%,已经没有空余,而且有70%的任务在排队等待。

多核

因为多核CPU同时能执行多个任务,所以在多核的场景下,load值只要不高于核心数即可。

特别说明:load的上下文里,我们只关心核心数,并不关心核心的分布,也即是:1个4核CPU = 2个双核CPU = 4个单核CPU。

load 合理取值

如果load很逼近 1*核心数 ,就代表CPU几乎没有余量,无法应对意外情况。

按照经验值来说,load维持在 0.7*核心数 以下是比较好的。

另外,1分钟,5分钟,15分钟的 load average 应该更加关注第三个,也即是15分钟平均。因为如果单单只有一个1分钟平均指标高,那很可能只是这一分钟的突发情况,而如果15分钟平均都高,那就需要引起重视了。

load 过高排查思路

引起load高的因素

  • CPU
  • 内存
  • 磁盘I/O
  • 网络I/O
  • 等...

load 高的场景

CPU高、Load高

  • 使用vmstat 查看系统的 CPU 负载;
  • 使用 top 查看进程的 CPU 负载;

vmstat 查看系统 CPU 负载

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

格式:vmstat -n 1 -n 1 表示结果一秒刷新一次

bash
root@ubuntu:~# 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 0 0 0 93916 110240 652284 0 0 3 22 2 5 1 0 99 0 0 0 0 0 93900 110240 652284 0 0 0 16 276 423 0 0 99 0 0 0 0 0 93908 110240 652288 0 0 0 16 268 413 1 1 98 0 0 # 返回结果中的主要数据列说明: r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢。 b: 表示阻塞的进程 us: 用户CPU时间 sy: 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。 wa:IO 等待消耗的 CPU 时间百分比。该值较高时,说明 IO 等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。 id:处于空闲状态的 CPU 时间百分比。如果该值持续为 0,同时 sy 是 us 的两倍,则通常说明系统则面临着 CPU 资源的短缺。

top 查看进程 CPU 负载

top -c 查看具体进程占用cpu、mem情况

输入大写字母 P,按 CPU 使用排列,定位系统中占用 CPU 较高的进程。

输入大写字母 M,按 Memory 使用率排列,定位系统中占用 Memory 较高的进程。

bash
root@ubuntu:~# top -c top - 16:48:21 up 51 days, 6:47, 1 user, load average: 0.09, 0.06, 0.02 Tasks: 186 total, 1 running, 185 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 1.9 sy, 0.0 ni, 98.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 1867.9 total, 195.9 free, 1004.5 used, 667.6 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 677.4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2290804 root 20 0 10.4g 106864 14976 S 0.0 5.6 197:52.70 node main.js 2290884 root 20 0 20.4g 104724 10580 S 0.0 5.5 198:01.97 node ./packages/website/server.js 2290907 root 20 0 424980 100248 11052 S 0.0 5.2 8:44.41 /usr/local/bin/node /app/waline/node_modules/@waline/vercel/vanilla.js 2291545 admin 20 0 881784 95244 7080 S 0.0 5.0 114:42.95 /usr/local/bin/gitea web 2290660 systemd+ 20 0 1608744 83064 2108 S 3.8 4.3 283:07.75 mongod --bind_ip_all

CPU低、Load高

load average 是对 CPU 负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多。出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf 查看是否存在 D 状态进程。

D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。

bash
# 等待I/O的进程通过处于uninterruptible sleep或D状态;通过给出这些信息我们就可以简单的查找出处在wait状态的进程 ps -eo state,pid,cmd | grep "^D"; echo "----" # 查找占用IO的程序, 筛选并打印出状态为"R"(运行)或"D"(不可中断的睡眠)的进程信息 ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

通过 iostat -d -x -m 1 10 查看磁盘IO情况;(安装命令 yum install -y sysstat )

bash
# 该命令的输出结果包括以下列: Device:磁盘设备的名称。 rrqm/s:每秒钟合并的读请求。 wrqm/s:每秒钟合并的写请求。 r/s:每秒钟的读取操作数。 w/s:每秒钟的写入操作数。 rMB/s:每秒钟的读取数据量(以MB为单位)。 wMB/s:每秒钟的写入数据量(以MB为单位)。 avgrq-sz:平均每个请求的数据大小。 avgqu-sz:平均请求队列长度。 await:平均I/O请求等待时间。 svctm:平均I/O请求服务时间。 %util:设备的利用率。

通过 sar -n DEV 1 10 查看网络IO情况;

bash
root@kind-control-plane:~# sar -n DEV 1 10 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil Average: lo 183.32 183.32 29.66 29.66 0.00 0.00 0.00 0.00 Average: tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: calif9a038558cf 1.10 1.10 0.10 0.11 0.00 0.00 0.00 0.00 Average: calic12e1d39540 1.10 1.10 0.10 0.10 0.00 0.00 0.00 0.00 Average: calid90df26541f 0.60 0.50 0.05 0.18 0.00 0.00 0.00 0.00 Average: eth0 1.50 1.50 0.17 0.70 0.00 0.00 0.00 0.00 Average: cali90d94d6e3cc 0.30 0.30 0.01 0.01 0.00 0.00 0.00 0.00 # 该命令的输出结果包括以下列: IFACE:网络接口名称。 rxpck/s:每秒钟接收的数据包数量。 txpck/s:每秒钟发送的数据包数量。 rxkB/s:每秒钟接收的数据量(以KB为单位)。 txkB/s:每秒钟发送的数据量(以KB为单位)。 rxcmp/s:每秒钟接收的压缩数据包数量。 txcmp/s:每秒钟发送的压缩数据包数量。 rxmcst/s:每秒钟接收的多播数据包数量。

通过如下命令查看TCP连接状态:

bash
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' netstat -n | grep CLOSE_WAIT

load average和CPU利用率的区别

还有另一个CPU指标:CPU利用率,以百分比形式表示,也能表示CPU的繁忙程度。那么这两个指标有什么区别呢?

正如前面基本概念里加粗强调的那样,CPU load是对于任务数量的度量。而CPU利用率则是: CPU使用时间 / (CPU使用时间 + 空闲时间)。

二者一般呈现正相关关系,但是也有特例:

  1. load average低,利用率高:如果CPU执行的任务数很少,则load average会低,但是这些任务都是CPU密集型,那么利用率就会高。

  2. load average高,利用率低:如果CPU执行的任务数很多,则load average会高,但是在任务执行过程中CPU经常空闲(比如等待IO),那么利用率就会低。

参考

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:liulei

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!