statistics(Item :: scheduler_wall_time) ->
[{SchedulerId, ActiveTime, TotalTime}] | undefined
OTP R15B01SchedulerId = integer() >= 1
ActiveTime = TotalTime = integer() >= 0
返回说明多少时间的信息普通的和脏CPU系统中的调度程序一直很忙。该值通常可以更好地指示 Erlang 节点承受的负载量,而不是查看诸如以下工具提供的 CPU 利用率top
或者sysstat
.这是因为scheduler_wall_time
还包括调度程序等待某些其他资源(例如内部互斥体)可用但不使用 CPU 的时间。为了更好地了解调度程序正在忙什么,您可以使用微观国家会计.
繁忙调度程序的定义是当它不空闲并且不忙着等待对于新工作,即:
- 执行流程代码
- 执行linked-in驱动程序或NIF代码
- 执行 BIF 或任何其他运行时处理
- 垃圾收集
- 处理任何其他内存管理
请注意,即使操作系统已调度调度程序线程,调度程序也可能很忙。
推荐使用该模块scheduler
而不是直接使用此函数,因为它提供了一种更简单的方法来获取您通常想要的信息。
如果已启用该函数返回一个元组列表{SchedulerId, ActiveTime,
TotalTime}
,其中SchedulerId
是调度程序的整数 ID,ActiveTime
是调度程序忙碌的持续时间,并且TotalTime
是自那时以来的总持续时间
scheduler_wall_time
激活特定调度程序。返回的时间单位未定义,并且可能会在版本、操作系统和系统重新启动之间发生变化。scheduler_wall_time
仅用于计算调度程序利用率的相对值。这ActiveTime
永远不能超过TotalTime
。调度程序信息列表未排序,并且在调用之间可以以不同的顺序显示。
禁用这个函数返回undefined
.
调度程序之间的激活时间可能存在显著差异。当前脏调度程序在系统启动时激活,而正常调度程序在启用 scheduler_wall_time
函数后一段时间激活。
此函数的返回值中仅包含有关预计处理 CPU 密集型工作的调度程序的信息。如果您还想了解有关脏 I/O 调度程序, 采用
statistics(scheduler_wall_time_all)
反而。
正常的调度程序将具有范围内的调度程序标识符1 =< SchedulerId =<
erlang:system_info(schedulers)
。脏 CPU 调度程序的调度程序标识符将在该范围内erlang:system_info(schedulers) <
SchedulerId =< erlang:system_info(schedulers)
+
erlang:system_info(dirty_cpu_schedulers)
.
不同类型的调度程序处理特定类型的作业。每个作业都分配给特定的调度程序类型。作业可以在同一类型的不同调度程序之间迁移,但不能在不同类型的调度程序之间迁移。在评估返回的结果时必须考虑这一事实。
您可以使用scheduler_wall_time
来计算调度程序利用率。首先,对 erlang:statistics(scheduler_wall_time)
返回的值进行采样。
> erlang:system_flag(scheduler_wall_time, true).
false
> Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
ok
一段时间后,用户拍摄另一个快照并计算每个调度程序的调度程序利用率,例如:
> Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
ok
> lists:map(fun({{I, A0, T0}, {I, A1, T1}}) ->
{I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)).
[{1,0.9743474730177548},
{2,0.9744843782751444},
{3,0.9995902361669045},
{4,0.9738012596572161},
{5,0.9717956667018103},
{6,0.9739235846420741},
{7,0.973237033077876},
{8,0.9741297293248656}]
使用相同的快照来计算总调度程序利用率:
> {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) ->
{Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)),
TotalSchedulerUtilization = A/T.
0.9769136803764825
当所有调度程序在两次测量之间一直处于活动状态时,总调度程序利用率将等于1.0
。
另一个(可能更)有用的值是计算根据最大可用 CPU 时间加权的总调度程序利用率:
> WeightedSchedulerUtilization = (TotalSchedulerUtilization
* (erlang:system_info(schedulers)
+ erlang:system_info(dirty_cpu_schedulers)))
/ erlang:system_info(logical_processors_available).
0.9769136803764825
当调度程序的活动时间与最大可用 CPU 时间相同时,加权调度程序利用率将达到 1.0
。如果存在的调度程序多于可用逻辑处理器,则该值可能大于 1.0
。
从 ERTS 9.0 版开始,Erlang 运行时系统默认拥有比逻辑处理器更多的调度程序。这是由于肮脏的调度程序造成的。
scheduler_wall_time
默认情况下禁用。要启用它,请使用
erlang:system_flag(scheduler_wall_time, true)
.
相关用法
- erlang statistics(Item :: garbage_collection)用法及代码示例
- erlang statistics(Item :: microstate_accounting)用法及代码示例
- erlang statistics(Item :: reductions)用法及代码示例
- erlang statistics(Item :: runtime)用法及代码示例
- erlang start(Host)用法及代码示例
- erlang str用法及代码示例
- erlang store(Key, Value, Orddict1)用法及代码示例
- erlang str(String, SubString)用法及代码示例
- erlang strip(String :: string())用法及代码示例
- erlang strict_relation(BinRel1)用法及代码示例
- erlang string_to_handle(QueryString)用法及代码示例
- erlang sin用法及代码示例
- erlang substr用法及代码示例
- erlang sort用法及代码示例
- erlang sublist用法及代码示例
- erlang sum用法及代码示例
- erlang split_binary用法及代码示例
- erlang self用法及代码示例
- erlang spawn用法及代码示例
- erlang spawn on Node用法及代码示例
- erlang spawnlink用法及代码示例
- erlang safe_fixtable(Table, Fix)用法及代码示例
- erlang select(Table, MatchSpec)用法及代码示例
- erlang select_replace(Table, MatchSpec)用法及代码示例
- erlang select_reverse(Continuation)用法及代码示例
注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 statistics(Item :: scheduler_wall_time) -> [{SchedulerId, ActiveTime, TotalTime}] | undefined。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。