查看源代码 cpu_sup (os_mon v2.10.1)

一个 CPU 负载和 CPU 利用率的监管进程

cpu_sup 是一个监管 CPU 负载和 CPU 利用率的进程。它是 OS_Mon 应用程序的一部分,请参阅 os_mon(6)。适用于 Unix,但 CPU 利用率值 (util/0,1) 仅适用于 Solaris、Linux、FreeBSD 和 OpenBSD。

负载值与可运行的 Unix 进程在被调度之前必须在运行队列中花费的时间成正比。因此,值越高表示系统负载越大。返回的值除以 256 会产生 ruptop 显示的数字。rup 中显示为 2.00 的值,在 xload 中显示为第二个标记之前的负载。

例如,rup 将 128 的负载显示为 0.50,将 512 的负载显示为 2.00。

如果用户希望将负载值视为机器容量的百分比,那么这种测量方法会存在问题,因为负载值不限于固定间隔。在这种情况下,以下简单的数学转换可以将负载值转换为百分比

PercentLoad = 100 * (1 - D/(D + Load))

D 确定哪个负载值应与哪个百分比相关联。选择 D = 50 意味着 128 是 60% 的负载,256 是 80%,512 是 90%,依此类推。

另一种衡量系统负载的方法是将繁忙 CPU 周期的数量除以 CPU 周期的总数。这会立即产生 0-100 范围内的值。但是,此方法隐藏了一个事实,即机器可能或多或少地处于饱和状态。因此,CPU 利用率比此度量方法中的系统负载更合适。

一个接收足够请求而永远不会空闲的服务器,其 CPU 利用率将为 100%。如果服务器接收到多 50% 的请求,它仍然会达到 100%。当使用先前显示的百分比公式计算系统负载时,负载将从 80% 增加到 87%。

avg1/0avg5/0avg15/0 函数可用于检索系统负载值,util/0util/1 函数可用于检索 CPU 利用率值。

在 Linux 上运行时,cpu_sup 假定 /proc 文件系统存在且可以被 cpu_sup 访问。如果不是,cpu_sup 将终止。

另请参阅

os_mon(3)

摘要

函数

返回最近一分钟内的平均系统负载,如上所述。0 表示无负载,256 表示 rup 报告的 1.00 的负载。

返回最近五分钟内的平均系统负载,如上所述。0 表示无负载,256 表示 rup 报告的 1.00 的负载。

返回最近 15 分钟内的平均系统负载,如上所述。0 表示无负载,256 表示 rup 报告的 1.00 的负载。

返回此计算机上运行的 UNIX 进程数。这是一种粗略的测量系统负载的方法,但在某些情况下可能会引起关注。

返回自调用进程上次调用 util/0util/1 以来 CPU 的利用率。

返回自调用进程上次调用 util/0util/1 以来 CPU 的利用率,比 util/0 更详细。

类型

链接到此类型

util_cpus()

查看源代码 (未导出)
-type util_cpus() :: all | integer() | [integer()].
链接到此类型

util_desc()

查看源代码 (未导出)
-type util_desc() :: {util_cpus(), util_value(), util_value(), []}.
链接到此类型

util_state()

查看源代码 (未导出)
-type util_state() :: user | nice_user | kernel | wait | idle.
链接到此类型

util_value()

查看源代码 (未导出)
-type util_value() :: [{util_state(), number()}] | number().

函数

-spec avg1() -> SystemLoad :: integer() | {error, any()}.

返回最近一分钟内的平均系统负载,如上所述。0 表示无负载,256 表示 rup 报告的 1.00 的负载。

如果 cpu_sup 不可用,则返回 0。

-spec avg5() -> SystemLoad :: integer() | {error, any()}.

返回最近五分钟内的平均系统负载,如上所述。0 表示无负载,256 表示 rup 报告的 1.00 的负载。

如果 cpu_sup 不可用,则返回 0。

-spec avg15() -> SystemLoad :: integer() | {error, any()}.

返回最近 15 分钟内的平均系统负载,如上所述。0 表示无负载,256 表示 rup 报告的 1.00 的负载。

如果 cpu_sup 不可用,则返回 0。

-spec nprocs() -> UnixProcesses :: integer() | {error, any()}.

返回此计算机上运行的 UNIX 进程数。这是一种粗略的测量系统负载的方法,但在某些情况下可能会引起关注。

如果 cpu_sup 不可用,则返回 0。

-spec util() -> CpuUtil :: number() | {error, any()}.

返回自调用进程上次调用 util/0util/1 以来 CPU 的利用率。

注意

进程首次调用 util/0util/1 的返回值在大多数系统上将是自系统启动以来的 CPU 利用率,但这不能保证,因此该值应被视为垃圾值。这也适用于 cpu_sup 重新启动后的首次调用。

CPU 利用率定义为在所有繁忙处理器状态(请参阅 util/1)中花费的 CPU 周期的平均百分比份额的总和,在所有 CPU 上取平均值。

如果 cpu_sup 不可用,则返回 0。

-spec util([detailed | per_cpu]) -> util_desc() | [util_desc()] | {error, any()}.

返回自调用进程上次调用 util/0util/1 以来 CPU 的利用率,比 util/0 更详细。

注意

进程首次调用 util/0util/1 的返回值在大多数系统上将是自系统启动以来的 CPU 利用率,但这不能保证,因此该值应被视为垃圾值。这也适用于 cpu_sup 重新启动后的首次调用。

当前可识别的选项

  • detailed - 返回的 UtilDesc(s) 将更加详细。

  • per_cpu - 每个 CPU 将单独指定(假设可以从操作系统检索此信息),也就是说,将返回每个 CPU 一个 UtilDesc 的列表。

UtilDesc = {Cpus, Busy, NonBusy, Misc} 的描述

  • Cpus - 如果给定了 detailed 和/或 per_cpu 选项,则这是 CPU 编号,或 CPU 编号列表。

    如果不是,则是原子 all,这意味着 UtilDesc 包含有关所有 CPU 的信息。

  • Busy - 如果给定了 detailed 选项,则这是一个 {State, Share} 元组列表,其中每个元组包含有关已被识别为繁忙处理器状态的处理器状态的信息(见下文)。原子 State 是状态的名称,浮点数 Share 表示自上次调用 util/0util/1 以来,在此状态下花费的 CPU 周期的百分比份额。

    如果不是,则是在所有识别为繁忙状态的状态中花费的 CPU 周期的百分比份额的总和。

    如果未给出 per_cpu,则呈现的值是所有 CPU 的平均值。

  • NonBusy - 与 Busy 类似,但适用于已识别为非繁忙的处理器状态(见下文)。

  • Misc - 当前未使用;保留供将来使用。

当前,以下处理器状态被识别为繁忙状态

  • user - 在用户模式下执行代码。

  • nice_user - 在低优先级(nice)用户模式下执行代码。此状态当前仅在 Linux 上识别。

  • kernel - 在内核模式下执行代码。

当前,以下处理器状态被识别为非繁忙状态

  • wait - 等待。此状态目前仅在 Solaris 上识别。

  • idle - 空闲。

注意

在不同的操作系统上,已识别的处理器状态可能不同,并且在同一操作系统上的不同版本的 cpu_sup 之间可能会发生变化。但是,在所有繁忙和所有非繁忙处理器状态中花费的 CPU 周期的百分比份额的总和始终为 100%。

如果 cpu_sup 不可用,则返回 {all,0,0,[]}