Linux 上的进程状态
要讨论系统平均负载,首先要了解Linux 上的进程状态。
标志 | 名称 | 内核名称及解释 |
---|---|---|
R | 运行中或可运行 | TASK_RUNNING。进程正在执行或等待执行。可以在用户空间(用户代码)或内核空间(内核代码)中运行。 |
S | 可中断睡眠 | TASK_INTERRUPTIBLE。进程正在等待满足某个条件,例如访问资源或接收到信号(例如,子进程的输出)。 |
D | 不可中断睡眠 | TASK_UNINTERRUPTIBLE。进程处于睡眠状态,与S标志类似,但不会响应信号。通常用于在中断或终止进程可能导致设备或进程处于未定义状态时。通常用于I/O操作。进程也会在其内存页被转储或加载到扩展内存(即“交换”)时进入此状态。 |
T | 停止 | TASK_STOPPED。进程已被适当的信号停止。可以通过另一个信号恢复。 |
t | 跟踪 | TASK_TRACED。进程正在被调试,并且其执行被跟踪。为了测试其状态,它会被暂时暂停。 |
Z | 僵尸 | EXIT_ZOMBIE。子进程已完成操作,并希望向父进程报告其退出代码。不幸的是,有时父进程没有正确处理子进程,在这种情况下,子进程就会变成僵尸。 |
X | 死亡 | EXIT_DEAD。进程已结束,父进程已清理子进程。所有进程资源都被释放。在正常情况下,这种状态不应该是可见的。 |
下图展示了进程的不同状态以及它们之间的相互转换。
现在我们可以开始介绍平均负载了。
平均负载(load average)
根据手册(man 5 proc loadavg),loadavg统计的是状态 为R 和 D 中进程数。
-
R状态:表示进程当前正在运行(Running)或处于可运行状态(Runnable),这个状态的进程要么正在被CPU执行,要么准备好被执行,但正在等待CPU资源的调度。
-
D状态:表示进程处于不可中断睡眠状态(Uninterruptible Sleep),这种状态通常发生在进程正在等待某种系统资源(例如磁盘I/O操作的完成)。D 状态的进程不能被中断,也无法响应常规信号,
需要注意的是R 状态既可以表示正在执行,也可以表示排队等待执行。
可以使用Linux系统提供的uptime命令查看系统的平均负载。
$ uptime
13:40:40 up 38 days, 1:07, 1 user, load average: 0.25, 0.14, 0.14
load average后面的3个数字给出的是3个周期的平均负载:
- 过去 1分钟
- 过去 5 分钟
- 过去 15 分钟
平均负载应结合 CPU 数量的背景下考虑。
单 CPU 系统
假设单 CPU 系统上的1/5/15分钟的平均负载值为 6.00 5.48 3.25。这意味着该系统在过去的一分钟需要处理 600% 的负载,超出其处理能力的 500%。
多处理器与多核
还是上面的数据,但是是在有 12 个 CPU的系统上, 1 分钟的“平均负载”为“6.00”,意味着只有 50% 的计算能力被利用。这个“平均负载”值很正常。
假设是在有 24 个 CPU的系统上,这意味着只有 16.6% 的计算能力被利用。这个值就有点偏低,说明系统的CPU资源未得到充分利用。
1分钟,5分钟,15分钟的“平均负载”有什么用?
“平均负载”这个指标有助于确定系统对计算的需求是随时间增加还是随时间减少。
下图中系统中的“平均负载”一直在增加,该系统15 分钟的“平均负载”为“3.25”。5 分钟的“平均负载”为“5.48”,而最近 1 分钟的“平均负载”为“6.00”。这表明该系统对计算的需求正在增加。
而对于下图,系统中的“平均负载”一直在减少,该系统15 分钟的“平均负载”为“5.05”。5 分钟的“平均负载”为“3.53”,而最近 1 分钟的“平均负载”为“0。42”。这表明该系统的负载一直呈下降趋势。
那么对于一个系统而言,平均负载多少才算正常了?其实没有一个具体细致的标准,不同的应用程序有不同的标准。但是有一个大概的经验值:如果系统的平均负载 除以 CPU核数 大于0.7时,而且15、5、1分钟的平均负载是呈增长趋势,我们可能就需要注意了。
平均负载相关的误解
误解 1 – 平均负载是系统/CPU 上当前运行的进程数
这是最常见的一个误解(由于对进程状态缺乏了解而导致的),正如我们上面多次强调的那样,平均负载包括处于 R 状态(正在运行和准备运行)和 D 状态(不可中断睡眠状态)的进程。如果平均负载仅仅只是指正在运行的进程数,则它的值永远不会大于系统中的逻辑CPU核数。
误解 2 平均负载过高意味着CPU出现了瓶颈
前面介绍过平均负载包括处于 R 状态(正在运行和准备运行)和 D 状态(不可中断睡眠状态)的进程。
这意味着这些进程可以:
- 等待 CPU(R)
- 在 CPU 上运行 ®
- 等待磁盘(D)
- 等待内存页面从磁盘(D)加载。
因此,以下3个组件都会影响平均负载的计算结果,并不一定就是 CPU的问题,例如如果系统的物理内存(RAM)被耗尽,操作系统会频繁地将内存页面从RAM转储到磁盘上的交换空间。这个过程会导致磁盘I/O操作增加,从而增加系统的负载平均值(处于D状态的进程变多了)。
- CPU
- disk
- RAM memory (耗尽,需要使用交换空间).