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

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

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

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

我已经在 Google 上搜索了整整 2 个小时有关该主题的内容,但几乎没有人讨论这个问题,有什么想法吗?

答案1

负载是可运行进程的平均数。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


调度程序头文件调度程序将其声明为extern,并且所有调度程序实现都通过定期xnu-1699.24.8/osfmk/kern/sched_*.c调用它compute_averagessched_average.c

的参数compute_averunnable是,sched_nrun从中sched_average.c获取其值sched_run_countsched.h

此数字由宏修改,sched_run_incrsched_run_decr专门用于文件sched_prim.c,分别是调度原语负责线程的解除阻塞,调度等。


总结一下:

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


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

引用维基百科

在现代 UNIX 系统中,线程处理与平均负载相关的方法各不相同。有些系统将线程视为进程以计算平均负载:每个等待运行的线程都会将负载加 1。但是,其他系统(尤其是实现所谓的 N:M 线程的系统)使用不同的策略,例如为了负载而只对进程进行一次计数(无论线程数是多少),或者仅对用户线程调度程序当前向内核公开的线程进行计数,这可能取决于进程上设置的并发级别。

判断从本文,Linux 真正使用的进程与 XNU 的线程不同,它们是可运行的。

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

相关内容