“顶部”输出中的“平均负载”如何解释?所有发行版都一样吗?

“顶部”输出中的“平均负载”如何解释?所有发行版都一样吗?

我想知道基于 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%负载?

文档来源及版本:

  1. 第一个明星是

     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

  2. 第二个开始于

     TOP(1)                          User Commands                         TOP(1)
    
    NAME         top
    
    top - display Linux processes
    

    来源:
    http://man7.org/linux/man-pages/man1/top.1.htm

  3. 这一个开始于:

    TOP(1)
    
    NAME
    
    top - display and update information about the top cpu processes
    

    来源:http://www.unixtop.org/man.shtml

第一的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 负载是如何解释的?

根据以下答案给出的信息,除了一些个人搜索之外,我发现:

  1. top正在使用的包含在包 procps-3.2.8 中。可以使用 来验证top -v
  2. 在我从官方网站下载的版本中,procps-3.2.8该工具似乎直接从文件uptime中获取信息(没有利用linux功能)。procfs/proc/loadavggetloadavg()
  3. 现在对于该top命令它也没有使用该功能getloadavg()。我设法验证它确实与显示平均负载的工具top执行相同的操作。uptime它实际上调用该工具的函数,该函数从文件uptime中获取其信息。 所以,一切都指向文件!因此,为了准确理解生成的文件,必须阅读内核代码以了解该文件是如何写入的。procfs/proc/loadavg

    /proc/loadavgload averagetoploadavg

其中一个答案还指出了一篇出色的文章,它以通俗易懂的方式解释了 的三个值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,我们看到:

  1. 要显示负载平均值,sprint_uptime()请在 中调用该函数top.c
  2. 该函数存在于proc/whattime.cloadavg()调用proc/sysinfo.c.
  3. 该功能只需打开即可LOADAVG_FILE读取负载平均值。
  4. 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 的工作强度,但事实并非如此。

相关内容