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