当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang statistics(Item :: scheduler_wall_time)用法及代码示例


statistics(Item :: scheduler_wall_time) ->
              [{SchedulerId, ActiveTime, TotalTime}] | undefined
OTP R15B01
类型:
SchedulerId = 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.org大神的英文原创作品 statistics(Item :: scheduler_wall_time) -> [{SchedulerId, ActiveTime, TotalTime}] | undefined。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。