在理解linux的平均负载之前需要先看下linux的进程状态
Linux process status
使用man ps 可以看到
代码语言:javascript复制PROCESS STATE CODES
Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the
state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped by job control signal
t stopped by debugger during the tracing
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
信号相关的不同进程状态
对于任何Linux进程,它们的起点是创建它们的时刻。例如,父进程可以使用fork()系统调用启动子进程。一旦启动,进程将进入运行或可运行状态。在进程运行时,它可能会进入代码路径,要求它在继续之前等待特定的资源或信号。在等待资源的同时,这个过程将自愿放弃CPU周期,进入两种睡眠状态之一。
此外,我们可以暂停运行过程并将其置于停止状态。通常,这是通过向流程发送SIGSTOP信号来实现的。这种状态下的一个过程将继续存在,直到它被杀死或与SIGCONT一起恢复。最后,当进程终止并置于僵尸状态时,该进程将完成其生命周期,直到其父进程将其从进程表中清除。
运行或可运行状态(R)
当新进程启动时,它将处于运行或可运行状态。在运行状态下,进程占用CPU内核来执行其代码和逻辑。然而,线程调度算法可能会迫使运行过程放弃其执行权。这是为了确保每个进程都能公平分享CPU资源。在这种情况下,进程将被放置在运行队列中,其状态现在是可运行状态,等待轮到它执行。
虽然运行状态和可运行状态是不同的,但它们被组合成一个由R字符表示的单一状态。
睡眠状态:可中断(S)和不间断(D)
在进程执行期间,它可能会遇到需要请求外部资源的代码部分。主要是,对这些资源的请求是基于IO的,例如从磁盘读取文件或提出网络请求。由于没有资源,这个过程无法进行,它将停滞不前,什么都不做。在此类事件中,他们应该放弃CPU周期,放弃其他准备运行的任务,从而进入睡眠状态。
有两种不同的睡眠状态:不间断睡眠状态(D)和可中断睡眠状态(S)。不间断的睡眠状态只会等待资源可用,然后才能进入可运行状态,并且不会对任何信号做出反应。另一方面,可中断的睡眠状态将对信号和资源可用性做出反应。
停止状态(T)
从运行或可运行状态,我们可以使用SIGSTOP或SIGTSTP信号将进程置于停止状态(T)。这两个信号的区别在于,我们发送的SIGSTOP是编程的,例如运行kill-STOP {pid}。此外,进程不能忽略此信号,并将进入停止状态。另一方面,我们使用键盘CTRL Z发送SIGTSTP信号。与SIGSTOP不同,该进程可以选择忽略此信号,并在收到*SIGTSTP*后继续执行。
在这种状态下,我们可以通过发送SIGCONT信号将进程恢复到运行或可运行状态。
僵尸状态(Z)
当进程完成执行或终止时,它将向父进程发送SIGCHLD信号并进入僵尸状态。僵尸进程,也称为已停用进程,将保持此状态,直到父进程将其从进程表中清除。要从进程表中清除终止的子进程,父进程必须使用wait()或waitpid()系统调用读取子进程的退出值。
Linux load averages
查看方法
代码语言:javascript复制# 方法一:uptime
$ uptime
18:05:12 up 518 days, 5:22, 1 user, load average: 0.00, 0.01, 0.05
# 方法二:top
top - 18:05:24 up 518 days, 5:22, 1 user, load average: 0.00, 0.01, 0.05
# 方法三:cat /proc/loadavg
$ cat /proc/loadavg
0.00 0.01 0.05 3/192 30524
代码语言:javascript复制 平均负载的 3 个数值分别代表 1 分钟、5 分钟、15 分钟系统的平均负载情况。通过这三个数值的变化,我们可以知道系统最近一段时间的压力变化趋势
unix中负载的名称解释:
- 系统负载/CPU负载-是衡量Linux系统中CPU利用率过高或不足的指标;CPU正在执行或处于等待状态的进程数量。
- 平均负载——是在给定的1、5和15分钟时间内计算的平均系统负载。
Linux 源码解释:
单位时间内,系统中处于可运行状态和不可中断状态的平均进程数
在Linux中,从技术上讲,负载平均值是其(内核)执行队列中标记为运行或不间断的进程的运行平均值。
CPU 平均负载与 CPU 使用率的区别
平均负载:指单位时间内,处于可运行状态和不可中断的进程数
CPU 使用率 :正在使用 CPU 的进程
可以从定义看到两者的不同,CPU 平均负载不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。而 CPU 使用率指的是正在使用 CPU 的进程。
可以用常见两种场景来解释:
CPU 密集型的进程:因为进程大量的使用cpu,所以平均负债会比较高,cpu使用率也会跟着很高。
I/O 密集型进程:这个会出现很多进程在等待I/O的操作,会存在很多进程处于处于不可中断状态,所以负载会变高,但是cpu使用率不一定会很高。
load averages简单理解
一个具有多个CPU或多核CPU的系统。在这样的系统上,负载平均数的工作方式略有不同。例如,如果您在单个CPU系统上的平均负载为2,这意味着您的系统被100%超载——在整个期间,一个进程正在使用CPU,而另一个进程正在等待。在一个有两个CPU的系统上,这将是完全的使用——两个不同的进程一直在使用两个不同的CPU。在一个有四个CPU的系统上,这将是一半的使用——两个进程使用两个CPU,而两个CPU闲置。
要了解负载平均数,需要知道系统有多少个CPU。平均负载6.03表示单个CPU的系统被严重超载,但在一台有8个CPU的计算机上可以。
这里引用下一篇简单理解的博文信息:
交通类比
这基本上就是 CPU 负载。“汽车”是使用一段 CPU 时间(“过桥”)或排队使用 CPU 的进程。Unix 将此称为运行队列长度:当前正在运行的进程数加上等待(排队)运行的进程数之和。
load averages的排查
系统平均负载指是处于可运行状态和不可中断状态的进程的平均数量。
即单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
- 可运行状态的进程,包括正在使用CPU的进程,和正在等待CPU的进程。
- 对应于ps命令输出的STAT列中状态为R的进程。
- 状态R:running or runnable (on run queue)
- 不可中断状态的进程,表示正在等待其它系统资源的进程,例如等待磁盘I/O。
- 对应于ps命令输出的STAT列中状态为D的进程。
- 状态D:uninterruptible sleep (usually IO)。
- 不可中断状态实际上是系统对进程和硬件设备的一种保护机制。比如,当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的。
由于在 Linux 操作系统里,Load 是一个定义及其含混的指标,排查 loadavg 高就是一个很复杂的过程。其基本思路就是,根据引起 Load 变化的根源是R状态任务增多,还是D状态任务增多。
推荐大家可以阅读下面文章: Solving the Mystery https://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html 理解Linux系统负荷 https://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html
可以查看原文:
https://mp.weixin.qq.com/s?__biz=MzA5NTgwNzY1NA==&mid=2247484074&idx=2&sn=25062e448d1b78f155164bfa9f134e63&chksm=90b8f363a7cf7a75b0ef3c3cd89b8cfeb5343ad2ee02ca3b673d53adb251730b895a9f2ec43a&token=211557010&lang=zh_CN#rd