檢視原始碼 scheduler (runtime_tools v2.1.1)

測量排程器使用率

此模組包含用於輕鬆測量和計算排程器使用率的實用函數。它作為更原始 API erlang:statistics(scheduler_wall_time) 的包裝器。

最簡單的用法是呼叫阻塞式 scheduler:utilization(Seconds)

對於非阻塞式和/或連續計算排程器使用率,建議的用法是

為了從 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/0get_sample_all/0 取得的兩個樣本之間的時間間隔的排程器使用率。

類型

連結到此類型

sched_id()

檢視原始碼 (未匯出) (自 OTP 21.0 起)
-type sched_id() :: integer().
連結到此不透明類型

sched_sample()

檢視原始碼 (自 OTP 21.0 起)
-opaque sched_sample()
連結到此類型

sched_type()

檢視原始碼 (未匯出) (自 OTP 21.0 起)
-type sched_type() :: normal | cpu | io.
連結到此類型

sched_util_result()

檢視原始碼 (未匯出) (自 OTP 21.0 起)
-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 時間加權。

函數

連結到此函數

get_sample()

檢視原始碼 (自 OTP 24.3 起)
-spec get_sample() -> sched_sample() | undefined.

傳回一般和 dirty-cpu 排程器的排程器使用率樣本。如果系統旗標 scheduler_wall_time 尚未啟用,則傳回 undefined

連結到此函數

get_sample_all()

檢視原始碼 (自 OTP 24.3 起)
-spec get_sample_all() -> sched_sample() | undefined.

傳回所有排程器的排程器使用率樣本,包括 dirty-io 排程器。如果系統旗標 scheduler_wall_time 尚未啟用,則傳回 undefined

連結到此函數

sample()

檢視原始碼 (自 OTP 21.0 起)
-spec sample() -> sched_sample().

傳回一般和 dirty-cpu 排程器的排程器使用率樣本。如果尚未啟用,將會先呼叫 erlang:system_flag(scheduler_wall_time, true)

注意

不建議使用此函數,因為無法偵測 scheduler_wall_time 是否已啟用。如果在兩個樣本之間停用了 scheduler_wall_time,將它們傳遞給 utilization/2 將會產生無效的結果。

請改用 get_sample/0erlang:system_flag(scheduler_wall_time, _)

連結到此函數

sample_all()

檢視原始碼 (自 OTP 21.0 起)
-spec sample_all() -> sched_sample().

傳回所有排程器的排程器使用率樣本,包括 dirty-io 排程器。如果尚未啟用,將會先呼叫 erlang:system_flag(scheduler_wall_time, true)

注意

基於與 sample/0 相同的原因,不建議使用此函數。請改用 get_sample_all/0erlang:system_flag(scheduler_wall_time,_)

連結到此函數

utilization/1

檢視原始碼 (自 OTP 21.0 起)
-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 以取得樣本,樣本之間間隔一段時間。

連結到此函數

utilization(Sample1, Sample2)

檢視原始碼 (自 OTP 21.0 起)
-spec utilization(Sample1, Sample2) -> sched_util_result()
                     when Sample1 :: sched_sample(), Sample2 :: sched_sample().

計算從呼叫 get_sample/0get_sample_all/0 取得的兩個樣本之間的時間間隔的排程器使用率。

此函數本身不需要啟用 scheduler_wall_time。但是,為了獲得正確的結果,在兩個樣本之間的整個間隔期間,必須啟用 scheduler_wall_time