檢視原始碼 scheduler (runtime_tools v2.1.1)
測量排程器使用率
此模組包含用於輕鬆測量和計算排程器使用率的實用函數。它作為更原始 API erlang:statistics(scheduler_wall_time)
的包裝器。
最簡單的用法是呼叫阻塞式 scheduler:utilization(Seconds)
。
對於非阻塞式和/或連續計算排程器使用率,建議的用法是
- 首先呼叫
erlang:system_flag(scheduler_wall_time, true)
以啟用排程器實際時間測量。 - 呼叫
get_sample/0
以收集樣本,樣本之間間隔一段時間。 - 呼叫
utilization/2
以計算兩個樣本之間的時間間隔內的排程器使用率。 - 完成後,呼叫
erlang:system_flag(scheduler_wall_time, false)
以停用排程器實際時間測量並避免不必要的 CPU 負擔。
為了從 utilization/2
取得正確的值,重要的是在兩個樣本之間的整個間隔期間,scheduler_wall_time
保持啟用狀態。為了確保這一點,呼叫 erlang:system_flag(scheduler_wall_time, true)
的程序必須保持存活,因為如果它終止,scheduler_wall_time
將會自動停用。
摘要
類型
一個包含各個排程器結果以及彙總平均值的元組列表。Util
是排程器使用率,以 0.0 到 1.0 之間浮點數值表示。Percent
是相同的使用率,以更易於閱讀的百分比字串表示。
函數
傳回一般和 dirty-cpu 排程器的排程器使用率樣本。如果系統旗標 scheduler_wall_time
尚未啟用,則傳回 undefined
。
傳回所有排程器的排程器使用率樣本,包括 dirty-io 排程器。如果系統旗標 scheduler_wall_time
尚未啟用,則傳回 undefined
。
傳回一般和 dirty-cpu 排程器的排程器使用率樣本。如果尚未啟用,將會先呼叫 erlang:system_flag(scheduler_wall_time, true)
。
傳回所有排程器的排程器使用率樣本,包括 dirty-io 排程器。如果尚未啟用,將會先呼叫 erlang:system_flag(scheduler_wall_time, true)
。
測量在 Seconds
秒期間一般和 dirty-cpu 排程器的使用率,然後傳回結果。
計算從呼叫 get_sample/0
或 get_sample_all/0
取得的兩個樣本之間的時間間隔的排程器使用率。
類型
-type sched_id() :: integer().
-opaque sched_sample()
-type sched_type() :: normal | cpu | io.
-type sched_util_result() :: [{sched_type(), sched_id(), float(), string()} | {total, float(), string()} | {weighted, float(), string()}].
一個包含各個排程器結果以及彙總平均值的元組列表。Util
是排程器使用率,以 0.0 到 1.0 之間浮點數值表示。Percent
是相同的使用率,以更易於閱讀的百分比字串表示。
{normal, SchedulerId, Util, Percent}
- 具有編號SchedulerId
的一般排程器的排程器使用率。未上線的排程器也會包含在內。線上排程器具有最低的SchedulerId
。{cpu, SchedulerId, Util, Percent}
- 具有編號SchedulerId
的 dirty-cpu 排程器的排程器使用率。{io, SchedulerId, Util, Percent}
- 具有編號SchedulerId
的 dirty-io 排程器的排程器使用率。僅當兩個樣本都是使用sample_all/0
取得時,才會存在此元組。{total, Util, Percent}
- 所有一般和 dirty-cpu 排程器的總使用率。{weighted, Util, Percent}
- 所有一般和 dirty-cpu 排程器的總使用率,根據可用的最大 CPU 時間加權。
函數
-spec get_sample() -> sched_sample() | undefined.
傳回一般和 dirty-cpu 排程器的排程器使用率樣本。如果系統旗標 scheduler_wall_time
尚未啟用,則傳回 undefined
。
-spec get_sample_all() -> sched_sample() | undefined.
傳回所有排程器的排程器使用率樣本,包括 dirty-io 排程器。如果系統旗標 scheduler_wall_time
尚未啟用,則傳回 undefined
。
-spec sample() -> sched_sample().
傳回一般和 dirty-cpu 排程器的排程器使用率樣本。如果尚未啟用,將會先呼叫 erlang:system_flag(scheduler_wall_time, true)
。
注意
不建議使用此函數,因為無法偵測
scheduler_wall_time
是否已啟用。如果在兩個樣本之間停用了scheduler_wall_time
,將它們傳遞給utilization/2
將會產生無效的結果。請改用
get_sample/0
和erlang:system_flag(scheduler_wall_time, _)
。
-spec sample_all() -> sched_sample().
傳回所有排程器的排程器使用率樣本,包括 dirty-io 排程器。如果尚未啟用,將會先呼叫 erlang:system_flag(scheduler_wall_time, true)
。
注意
基於與
sample/0
相同的原因,不建議使用此函數。請改用get_sample_all/0
和erlang:system_flag(scheduler_wall_time,_)
。
-spec utilization(Seconds) -> sched_util_result() when Seconds :: pos_integer(); (Sample) -> sched_util_result() when Sample :: sched_sample().
測量在 Seconds
秒期間一般和 dirty-cpu 排程器的使用率,然後傳回結果。
將會自動先啟用然後停用 scheduler_wall_time
。
計算從取得 Sample
的時間到「現在」的時間間隔的排程器使用率。與呼叫 scheduler:utilization(Sample, scheduler:sample_all())
相同。
注意
不建議使用此函數,因為很容易在沒有注意到的情況下取得無效的結果。特別是不要執行以下操作
scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!
以上範例快速連續取得兩個樣本,並計算它們之間的排程器使用率。產生的值可能比資訊更具誤導性。
請改用
scheduler:utilization/2
並呼叫get_sample/0
以取得樣本,樣本之間間隔一段時間。
-spec utilization(Sample1, Sample2) -> sched_util_result() when Sample1 :: sched_sample(), Sample2 :: sched_sample().
計算從呼叫 get_sample/0
或 get_sample_all/0
取得的兩個樣本之間的時間間隔的排程器使用率。
此函數本身不需要啟用 scheduler_wall_time
。但是,為了獲得正確的結果,在兩個樣本之間的整個間隔期間,必須啟用 scheduler_wall_time
。