如何在osx上计算平均负载?它似乎太高了 - 我该如何分析它?

Modified on: Thu, 06 Dec 2018 06:40:02 +0800

一个高级问题:我认为与Linux系统相比,我的平均负载过高。我有大约0.40 1分钟,基本上没有cpu使用(0-1%),即使这是分布在4个核心,它仍然等于大约0.10 = 10%cpu使用,这是不正确的。我现在已经了解到,平均负载不仅考虑了CPU使用,还考虑了磁盘和网络。我因此试图找到io等值,但由于某些原因,这似乎不适用于Mac?我当然在iostat工具中有美国和SY和ID,但没有io等号的迹象(如果我没记错的话,称为WI)。

一切都很好,我的其他mac上的平均负载相同,我在这里的理解是为什么平均值是以这种方式计算的(这么高)以及我如何进一步分析它?

我在这个主题上搜索了2个小时,但很少或根本没有谈论这个,有什么想法吗?

最佳答案

负载是可运行进程的平均数。 man 3 getloadavg说:

  

getloadavg()函数返回在不同时间段内平均的系统运行队列中的进程数。检索到nelem样本并将其分配给loadavg []的连续元素
  系统最多施加3个样本,分别代表过去1分钟,5分钟和15分钟的平均值。

您还可以通过运行sysctl vm.loadavg获取相同的信息。


假设Mac OS X 10.7.2,getloadavg函数调用此处的代码(搜索第二次出现的sysctl_loadavg),实质上是返回averunnable的当前值

这反过来定义为此处

struct loadavg averunnable =
    { {0, 0, 0}, FSCALE };      /* load average, of runnable procs */

此文件还定义了compute_averunnable,它计算averunnable的新加权值。


调度程序头文件sched.h声明为externxnu-1699.24.8/osfmk/kern/sched_*.c中的所有调度程序实现通过compute_averages定期调用它在sched_average.c

compute_averunnable的参数是sched_nrun中的sched_average.c,从sched_run_count中获取其值< a href =“http://opensource.apple.com/source/xnu/xnu-1699.24.8/osfmk/kern/sched.h”> sched.h

此编号由宏sched_run_incrsched_run_decr修改,仅在文件sched_prim.c,它们是负责解除阻塞的调度原语,调度线程等。


所以,回顾一下:

它只使用可运行线程的数量来计算5秒间隔内的平均负载。


虽然系统完全不同,但我发现很难相信Linux的负载总是低于OS X.事实上,Linux似乎只是显示一个不同的值

引用维基百科

  

在现代UNIX系统上,针对负载平均值的线程处理方式各不相同。有些系统将线程视为进行负载平均计算的进程:每个等待运行的线程将向负载添加1。但是,其他系统,尤其是实现所谓的N:M线程的系统,使用不同的策略,例如为了加载的目的只计算一次进程(无论线程的数量),或只计算用户当前暴露的线程 - 内核的调度程序,可能取决于进程上设置的并发级别。

本文来看,Linux确实使用了进程的数量可运行而不是XNU的线程。

由于每个可运行的进程都有至少一个可运行的线程,因此OS X上的负载平均值将假设等效的负载平均值计算(我没有费心去检查),总是在至少同样大,因为他们基于的项目计数是不同的。

作者:Daniel Beck

相关问答

添加新评论