一个高级问题:我认为我的平均负载与 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_averages
sched_average.c。
的参数compute_averunnable
是,sched_nrun
从中sched_average.c
获取其值sched_run_count
sched.h
。
此数字由宏修改,sched_run_incr
并sched_run_decr
专门用于文件sched_prim.c
,分别是调度原语负责线程的解除阻塞,调度等。
总结一下:
它只是使用可运行线程的数量来计算 5 秒间隔内的平均负载。
虽然系统完全不同,但我很难相信 Linux 的负载总是低于 OS X。事实上,Linux 似乎只是显示不同的值。
引用维基百科:
在现代 UNIX 系统中,线程处理与平均负载相关的方法各不相同。有些系统将线程视为进程以计算平均负载:每个等待运行的线程都会将负载加 1。但是,其他系统(尤其是实现所谓的 N:M 线程的系统)使用不同的策略,例如为了负载而只对进程进行一次计数(无论线程数是多少),或者仅对用户线程调度程序当前向内核公开的线程进行计数,这可能取决于进程上设置的并发级别。
判断从本文,Linux 真正使用的进程与 XNU 的线程不同,它们是可运行的。
由于每个可运行进程都有至少一个可运行线程,OS X 上的平均负载值将始终至少一样大,假设等效的平均负载计算(我没有费心去检查),因为它们所基于的项目计数是不同的。