我想知道基于 Red-Hat 的 linux 的输出是否可以由基于 Debian 的 linux 进行不同的解释。
为了使问题更加具体,我所追求的是了解如何top
解释 Red-Hat 系统上命令第一行的“平均负载”以及如何通过官方文档 ro 代码来验证这一点。
[处理这个主题的方法有很多,所有这些都是问题的可接受的答案]
一种可能的方法是找到这些信息的正式记录位置。
另一种方法是找到top
从我正在开发的特定发行版和版本中构建的代码版本。
我得到的命令输出是:
top - 13:08:34 up 1:19, 2 users, load average: 0.02, 0.00, 0.00
Tasks: 183 total, 1 running, 182 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 96.8%id, 2.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3922520k total, 788956k used, 3133564k free, 120720k buffers
Swap: 2097148k total, 0k used, 2097148k free, 344216k cached
在这种情况下我该如何解释平均负载价值?
我设法发现,平均负载大约是最后一分钟,来自一个文档源,并且应该由另一个文档源乘以 100 后进行解释。
所以,问题是:
是0.02%还是2%负载?
文档来源及版本:
第一个明星是
TOP(1) Linux User’s Manual TOP(1) NAME top - display Linux tasks
来源:
man top
在我的 RedHat 发行版中,
Ubuntu 也有带有“任务”的版本,该版本没有解释平均负载:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html第二个开始于
TOP(1) User Commands TOP(1) NAME top top - display Linux processes
这一个开始于:
TOP(1) NAME top - display and update information about the top cpu processes
这第一的man top
一,可以通过inRHEL
或 in看到online ubuntu documentation
,它没有对输出格式的任何解释(也没有关于平均负载我感兴趣的)。
这第二一,包含一个简短的解释,指出平均负载与最后1分钟有关,但没有解释其值!
我直接引用第二个来源:
2a.正常运行时间和负载平均值
此部分由单行组成,其中包含:
程序或窗口名称,具体取决于显示模式
当前时间和自上次启动以来的时间长度
用户总数
过去 1、5 和 15 分钟的系统负载平均值
所以,如果这个解释确实正确,那么只要理解负载平均值大约是最后 1 分钟就足够了。
但它没有解释数字的格式。
在里面第三解释,它说:
指定负载平均值的数字时,应将其乘以 100。
这个解释表明 0.02 意味着 2%,而不是 0.02%。但这是正确的吗?此外,它对于所有 Linux 发行版和可能不同的实现都是正确的吗top
?
为了找到这个问题的答案,我尝试通过网上搜索来浏览一下代码。但我发现,至少top
有两个与 RHEL 相关的不同版本!和builtin-top.c
重构的top.c
。正如代码开头的通知所述,两者均受 Red-Hat 版权保护,因此 RHEL 使用其中之一似乎是合乎逻辑的。
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c
因此,在深入研究这么多代码之前,我想了解一下应该关注哪里才能准确理解 cpu 负载是如何解释的?
根据以下答案给出的信息,除了一些个人搜索之外,我发现:
- 我
top
正在使用的包含在包 procps-3.2.8 中。可以使用 来验证top -v
。 - 在我从官方网站下载的版本中,
procps-3.2.8
该工具似乎直接从文件uptime
中获取信息(没有利用linux功能)。procfs
/proc/loadavg
getloadavg()
- 现在对于该
top
命令它也没有使用该功能getloadavg()
。我设法验证它确实与显示平均负载的工具top
执行相同的操作。uptime
它实际上调用该工具的函数,该函数从文件uptime
中获取其信息。 所以,一切都指向文件!因此,为了准确理解生成的文件,必须阅读内核代码以了解该文件是如何写入的。procfs
/proc/loadavg
/proc/loadavg
load average
top
loadavg
其中一个答案还指出了一篇出色的文章,它以通俗易懂的方式解释了 的三个值loadavg
。
因此,尽管所有答案都同样有用和有帮助,但我将标记指向该文章的答案
http://www.linuxjournal.com//article/9001作为我问题的“答案”。感谢大家的贡献!
另外从问题中了解顶部和平均负载loadavg
,我找到了一个指向内核源代码的链接,它指向计算的位置。因为似乎有一个巨大的注释解释了它的工作方式,这部分代码也在C
!
代码的链接是http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
再次强调,我并不是试图参与任何形式的抄袭,我只是为了完整性而添加此内容。因此,我重复一遍,内核代码的链接是从以下答案之一找到的:了解顶部和平均负载。
答案1
CPU负载是运行队列的长度,即等待运行的进程队列的长度。
该uptime
命令可用于查看最后一分钟、最后五分钟和最后 15 分钟运行队列的平均长度,就像通常显示的那样top
。
负载值高意味着运行队列很长。值低意味着它很短。因此,如果一分钟平均负载为 0.05,则意味着在那一分钟内平均有 0.05 个进程在运行队列中等待运行。它不是一个百分比。 AFAIK,这在所有 Unices 上都是一样的(尽管有些 Unices 可能不会计算等待 I/O 的进程,我认为 Linux 会这样做;OpenBSD 仅在一段时间内也计算内核线程,因此负载始终为 1 或更多的)。
Linuxtop
实用程序从内核获取负载值,并将其写入/proc/loadavg
。查看procps-3.2.8
,我们看到:
- 要显示负载平均值,
sprint_uptime()
请在 中调用该函数top.c
。 - 该函数存在于
proc/whattime.c
并loadavg()
调用proc/sysinfo.c
. - 该功能只需打开即可
LOADAVG_FILE
读取负载平均值。 LOADAVG_FILE
之前定义为"/proc/loadavg"
.
答案2
平均负载通常由内核计算。诸如top
和 之类的应用程序uptime
可以使用getloadavg(3)
库调用来访问它(它意味着可以跨不同的 Unix 版本移植)。在 Linux 上,这通常会导致读取/proc/loadavg
.在 FreeBSD 上这是一个系统调用。
例如:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
double ld[3];
int i=getloadavg(ld,3);
printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}
uptime
两者top
都进行类似的调用来获取数据。
现在,1/5/15 分钟的平均负载是运行队列上的进程数。不同的操作系统可能以不同的方式计算;最大的区别通常是等待 I/O 的进程(例如在磁盘上阻塞)是否算作可运行。在 Linux 上是这样。
因此,平均负载为 3.4 意味着在示例窗口(1、5、15 分钟)内,运行队列上平均有 3.4 个进程。
不过,高平均负载并不一定意味着服务器过载。如果您有 16 个核心,那么您的平均负载可以是 16,没有压力。您还可能有大量的应用程序fork()
调用,这可能会导致创建/销毁大量进程,从而导致较高的平均负载,但不会严重影响服务器性能。它仅应与其他指标(例如%CPU 繁忙程度)一起用作指导。
答案3
负载平均值不是特定于任何特定工具或发行版的东西,它是由内核或更准确地说是调度程序提供的测量值,因此它是独立于发行版的测量值。测量结果记录在 proc 文件系统内/proc
根据它的解释,负载平均指标是不是指示 CPU 的工作强度以及需要完成的工作量。我认为实际上没有必要将其乘以任何值,因为它是对处于可运行或不可中断状态的进程数量的直接测量。
尝试查看以下两个手册页:getloadavg(3)
和uptime
以获取更多信息。
负载平均指标一开始可能是一个难以理解的概念,我认为很多人认为它表明了 CPU 的工作强度,但事实并非如此。