當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。