在 Linux 或 Unix 操作系统中,我收到System load
如下文本。
谁能告诉我这是什么意思以及如何使用 CLI 命令提取系统负载%?
System load: 6.84
答案1
请参考 Unix 风格系统负载值的 Wikipedia 文章: https://en.wikipedia.org/wiki/Load_(计算)
简而言之,如果这是 Unix 风格的负载平均值,您需要划分该值除以系统中可用处理器核心的数量,然后乘以 100获得百分比值。
事实上,Unix 风格的负载值描述了特定时间段内实际运行 + 等待 CPU 进程的平均数量:通常会报告三个负载值,分别使用 1、5 和 15 分钟的时间窗口。在 Linux 上,等待 I/O 的进程也被计算在内;在大多数 Unix 系统上它们不是。
如果负载值小于可用处理器核心的数量,则意味着系统在平均窗口内并未完全繁忙,并且可以处理更多工作;如果负载值大于处理器核心的数量,则意味着工作量超出了处理器的处理能力。
在大多数类 Unix 系统(包括 Linux)中,您可以使用该uptime
命令获取如下输出:
$ uptime
12:11:23 up 5:22, 1 user, load average: 0.04, 0.05, 0.01
在这些词之后load average:
显示 1、5 和 15 分钟时间窗口的负载值。
在 Linux 上,您可以通过读取虚拟/proc/loadavg
文件(例如cat /proc/loadavg
.
在 Linux 上,您可以将负载平均值转换为如下百分比,例如:
#!/bin/sh
# uses the 5-minute load value
LOADVAL5=$(awk '{ print $2; }' < /proc/loadavg)
NUMCPUS=$(getconf _NPROCESSORS_ONLN)
echo "$LOADVAL5 * 100 / $NUMCPUS" | bc
当然,这个脚本没有经过优化,因此不适合重复运行;如果您正在开发监控系统,您应该在程序代码中进行计算,而不是运行外部脚本来计算负载百分比。
答案2
kernel/sched/loadavg.c
全局负载平均值是 nr_running + nr_uninterruptible 的指数衰减平均值
这是完美的答案。特别是,因为它直接引出了下一个问题:什么是 nr_running 和 nr_uninterruptible?
我一直坚持使用百分比——并且仍然在OP的意义上坚持使用——但是(Linux!)“系统负载”的技术答案是这样的:
这数字“R”任务。再加上“D”。
“R”要么正在运行,要么正在等待,即在运行队列中。 “D”是一种(特殊)等待状态——linux包含这些任务,因为它们至少代表非CPU“系统”负载(“主要是IO”),但这在这里并不重要,只是它表明“系统负载” ”并不是直接的“CPU 负载”。
所以它是竞争 CPU 的任务/线程的原始数量。
或者平均运行任务的比例。
平均而言...在 1 分钟、5 分钟和 15 分钟这一明确定义的时间段之一内。这里我插入另一个块,实际上是
#define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ+1) /* 5 sec intervals */
#define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */
/*
* a1 = a0 * e + a * (1 - e)
*/
static inline unsigned long
calc_load(unsigned long load, unsigned long exp, unsigned long active)
{
unsigned long newload;
newload = load * exp + active * (FIXED_1 - exp);
if (active >= load)
newload += FIXED_1-1;
return newload / FIXED_1;
}
现在,对于正常大小的 HZ“333”(介于 100-1000 之间),这给出 1666+1。对于一分钟的平均值,五秒的采样率非常好:每分钟 12 个样本,每分钟平均值。
这条评论a1 = a0 * e + a * (1 - e)
展示了整体的美感:采样的“a”(对于“active”,请参见下面的 calc_load())与 a0 (load) 组合成 a (newload)。
我不能说 FIXED_1 的用途。我拿 ”1.0 作为定点”作为询问的提示:
那么系统负载百分比怎么样?
为了简单起见,我说:一个 CPU 一次只能服务一个线程。
有点复杂:一个“四核”“多/超线程/-ripping”CPU 对于内核来说可以是 8 个或更多 CPU。这就是“SMP”实现。
更重要的是:四核仍然是 4 个而不是 8 个。英特尔声称通过超线程可以带来 120% 的典型效益,正如他们所说的那样。不是200%。
因此,平均负载为 6.8(以上述四核/cpu0-7 系统的百分比表示)意味着:
在相应的时间段内(最后 1.5 或 15 分钟),平均有近 7 个线程在运行。对于 8 个 CPU,这看起来像是 87% 的系统负载。但这 8 个 CPU 中的 4 个是“超”线程,已经以吞吐量为代价进行并行化。
6.8 会略高于 100%,而不是低于 100%。
为了避免所有这些任务到核心的映射问题,平均负载是原始的“R”(加上“D”)状态计数。
在上面的示例中,对于 x86,我将使用 4 作为“100%”的参考,即没有线程必须等待,并且没有核心闲置的点,甚至没有几纳秒。 “平衡良好”就是这样。任何额外的负载都会导致 CPU 轻微过载,超过 100%,或者超过 4 甚至 8。
因为在 2 倍 4 核系统上有 9 个运行线程。那么其中之一肯定不能在任何给定时间运行。因此,您可以在理论上画出一条 100% 的线 - 介于核心数量和每个核心的 nr 倍线程之间。
这就是为什么我对这个问题投了赞成票。我只能因为如此捍卫“百分比”解释而扇自己一巴掌。不是因为它错得太离谱,而是因为我在手册页和内核源代码解释得如此清楚时浪费了太多时间。
我将下面的所有内容保留原样 - 也许有点偏向“看,它也是一个百分比,本质上” - 但是
猜猜看:man uptime
用几行解释。我在这里像一个 10 岁的孩子一样讨论百分比计算。
负载平均值并未针对系统中的 CPU 数量进行标准化,因此负载平均值为 1 意味着单个 CPU 系统始终处于负载状态,而在 4 个 CPU 系统上则意味着该系统处于空闲状态75%的时间。
telcoM
这里是的链接的中心部分,即维基百科文章“Load(计算)”。
例如,一个可以解释平均负载为“1.73 0.60 7.98“在一个 单身的-CPU系统为:
- 在最后一刻,系统超载73%平均(1.73 个可运行进程,因此平均有 0.73 个进程必须等待单个 CPU 系统)。
- 在最后 5 分钟内,CPU40%的时间处于空转状态一般。
- 在最后 15 分钟内,系统过载698%平均(7.98 个可运行进程,因此单个 CPU 系统平均有 6.98 个进程需要等待)。
重新解释也没用。这三个例子选得很好。
我会为 telcoM 投票,因为它的链接和他的精确总结。
顺便说一句,“指数衰减”很容易理解 - 我认为听慢消退音叉(或......)是一个完美的比较。
uptime
很有价值,因为它为您提供了这三个值,告诉您“现在”看起来如何(最后几秒/一分钟),“最近”发生了什么,即最后五分钟,以及“摘要”是什么最后5-20分钟。
维基百科的例子意思是:
目前,系统负载很高。之前有几分钟的时间,该值非常低。但即使在此之前,也存在持续几分钟的高负载阶段。要么非常高 10 分钟,要么非常非常高 5 分钟。
在 3x3 矩阵中:
x_X
:wiki示例,例如100,0,255:紫蓝色:“过载”后“空闲”后“加载”
Xx_
:255,100,0:橙色:空转后负载后过载
_xX
:0,100,255:青色-蓝色:现在空闲、加载后、过载后
x__
:100,0,0:深红色:正在加载,闲置 15 分钟之前。
___
:黑色:完全空闲
xxx
:灰色(或白色):平衡
XXX
:白色(或粗白色):明亮发光
--> 无颜色表示过去 15 分钟内没有负载变化
(不,我还没有 bash 提示功能)
答案3
答案4
您可以使用“top”命令。通过此您将获得 PID、用户、使用的 CPU 等。
$ top
top - 15:12:59 up 4:43, 4 users, load average: 0.15, 0.32, 0.30
Tasks: 252 total, 1 running, 203 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.6 us, 1.3 sy, 0.0 ni, 95.7 id, 0.4 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8084528 total, 257360 free, 5410684 used, 2416484 buff/cache
KiB Swap: 8302588 total, 8198908 free, 103680 used. 1410824 availMem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND