檢視原始碼 msacc (runtime_tools v2.1.1)
用於微狀態計帳的便利函式
此模組實作了一些用於分析微狀態計帳資料的便利函式。關於如何使用基本 API 以及不同狀態代表的詳細資訊,請參閱 erlang:statistics(microstate_accounting)
。
基本情境
1> msacc:start(1000).
ok
2> msacc:print().
Average thread real-time : 1000513 us
Accumulated system run-time : 2213 us
Average scheduler run-time : 1076 us
Thread aux check_io emulator gc other port sleep
Stats per thread:
async( 0) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00%
async( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00%
aux( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 99.99%
scheduler( 1) 0.00% 0.03% 0.13% 0.00% 0.01% 0.00% 99.82%
scheduler( 2) 0.00% 0.00% 0.00% 0.00% 0.03% 0.00% 99.97%
Stats per type:
async 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00%
aux 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 99.99%
scheduler 0.00% 0.02% 0.06% 0.00% 0.02% 0.00% 99.89%
ok
第一個指令啟用微狀態計帳 1000 毫秒。詳情請參閱 start/0
、stop/0
、reset/0
和 start/1
。第二個指令會印出該期間收集的統計資料。首先會印出三個一般統計資料。
平均即時時間 - 執行緒中用於收集資料的平均時間。這應該與收集資料的時間接近。
系統執行時間 - 系統中所有執行緒的總執行時間。如果您呼叫
msacc:stats(total_runtime,Stats).
,則會得到此值。平均排程器執行時間 - 排程器的平均執行時間。這是排程器沒有進入休眠的平均時間。
然後,每個狀態會印出一欄,其中包含此執行緒在自己的即時時間中花費在此狀態的時間百分比。在執行緒特定時間之後,會以類似的格式印出每種執行緒類型的累積時間。
由於我們有平均即時時間和每個狀態花費的百分比,我們可以輕鬆地透過將 平均執行緒即時時間
與 執行緒狀態 %
相乘來計算在每個狀態中花費的時間,也就是說,若要取得排程器 1 在模擬器狀態中花費的時間,我們需計算 1000513us * 0.13% = 1300us
。
摘要
類型
一個包含不同微狀態計帳狀態以及在該狀態中花費的微秒數的地圖。
可以提供給 print/2
的不同選項。
執行緒可以處於的不同狀態。詳細資訊請參閱 erlang:statistics(microstate_accounting)。
一個包含不同微狀態計帳狀態的地圖。地圖中的每個值都包含另一個地圖,其中包含此執行緒在特定狀態中花費的時間百分比。 system
時間的百分比和特定 thread
的時間都是地圖的一部分。
一個包含關於特定執行緒資訊的地圖。地圖中的百分比可以是執行時間或即時時間,取決於從 stats/2
請求的是 runtime
還是 realtime
。 system
是此特定執行緒的系統總時間百分比。
函式
此函式檢查微狀態計帳是否可用。
讀取 to_file(Filename) 產生的檔案傾印。
將目前的微狀態計帳列印到標準輸出。等同於 msacc:print(msacc:stats(), #{}).
將給定的微狀態統計值列印到標準輸出。當狀態很多時,這可能會很冗長。有關欄位含義的簡要說明,請參閱本參考手冊的頂部。
將給定的微狀態統計值列印到給定的檔案或裝置。其他引數的行為與 print/2
的行為相同。
重置微狀態計帳計數器。傳回是否啟用或停用。
開始微狀態計帳。傳回先前是否已啟用或停用。
重置所有計數器,然後開始微狀態計帳給定的毫秒數。
傳回 erlang:statistics(microstate_accounting)
所呈現的微狀態統計資料的獨立於執行時間系統的版本。所有計數器都已正規化為微秒解析度。
傳回給定微狀態統計值的系統時間。系統時間是所有執行緒的累積時間。
停止微狀態計帳。傳回先前是否已啟用或停用。
將目前的微狀態統計計數器傾印到可使用 file:consult/1
剖析的檔案。
類型
-type msacc_data() :: [msacc_data_thread()].
-type msacc_data_counters() :: #{msacc_state() => non_neg_integer()}.
一個包含不同微狀態計帳狀態以及在該狀態中花費的微秒數的地圖。
-type msacc_data_thread() :: #{'$type' := msacc_data, type := msacc_type(), id := msacc_id(), counters := msacc_data_counters()}.
-type msacc_id() :: non_neg_integer().
-type msacc_print_options() :: #{system => boolean()}.
可以提供給 print/2
的不同選項。
-type msacc_state() ::
alloc | aux | bif | busy_wait | check_io | emulator | ets | gc | gc_fullsweep | nif | other |
port | send | sleep | timers.
執行緒可以處於的不同狀態。詳細資訊請參閱 erlang:statistics(microstate_accounting)。
-type msacc_stats() :: [msacc_stats_thread()].
-type msacc_stats_counters() :: #{msacc_state() => #{thread := float(), system := float()}}.
一個包含不同微狀態計帳狀態的地圖。地圖中的每個值都包含另一個地圖,其中包含此執行緒在特定狀態中花費的時間百分比。 system
時間的百分比和特定 thread
的時間都是地圖的一部分。
-type msacc_stats_thread() :: #{'$type' := msacc_stats, type := msacc_type(), id := msacc_id(), system := float(), counters := msacc_stats_counters()}.
一個包含關於特定執行緒資訊的地圖。地圖中的百分比可以是執行時間或即時時間,取決於從 stats/2
請求的是 runtime
還是 realtime
。 system
是此特定執行緒的系統總時間百分比。
-type msacc_type() :: aux | async | dirty_cpu_scheduler | dirty_io_scheduler | poll | scheduler.
函式
-spec available() -> boolean().
此函式檢查微狀態計帳是否可用。
-spec from_file(Filename) -> msacc_data() when Filename :: file:name_all().
讀取 to_file(Filename) 產生的檔案傾印。
-spec print() -> ok.
將目前的微狀態計帳列印到標準輸出。等同於 msacc:print(msacc:stats(), #{}).
-spec print(DataOrStats) -> ok when DataOrStats :: msacc_data() | msacc_stats().
-spec print(DataOrStats, Options) -> ok when DataOrStats :: msacc_data() | msacc_stats(), Options :: msacc_print_options().
將給定的微狀態統計值列印到標準輸出。當狀態很多時,這可能會很冗長。有關欄位含義的簡要說明,請參閱本參考手冊的頂部。
可以先使用 stats/2
操作 DataOrStats
來列印更具體的統計類型。例如,如果您想列印每個執行緒的執行時間百分比,您可以執行
msacc:print(msacc:stats(runtime, msacc:stats())).
如果您只想列印每個執行緒類型的執行時間,您可以執行
msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).
選項
system
- 印出每個狀態在系統時間以及執行緒時間中所花費的時間百分比。預設值:false。
-spec print(FileOrDevice, DataOrStats, Options) -> ok when FileOrDevice :: file:filename() | io:device(), DataOrStats :: msacc_data() | msacc_stats(), Options :: msacc_print_options().
將給定的微狀態統計值列印到給定的檔案或裝置。其他引數的行為與 print/2
的行為相同。
-spec reset() -> boolean().
重置微狀態計帳計數器。傳回是否啟用或停用。
-spec start() -> boolean().
開始微狀態計帳。傳回先前是否已啟用或停用。
-spec start(Time) -> true when Time :: timeout().
重置所有計數器,然後開始微狀態計帳給定的毫秒數。
-spec stats() -> msacc_data().
傳回 erlang:statistics(microstate_accounting)
所呈現的微狀態統計資料的獨立於執行時間系統的版本。所有計數器都已正規化為微秒解析度。
-spec stats(Analysis, Stats) -> non_neg_integer() when Analysis :: system_realtime | system_runtime, Stats :: msacc_data(); (Analysis, Stats) -> msacc_stats() when Analysis :: realtime | runtime, Stats :: msacc_data(); (Analysis, StatsOrData) -> msacc_data() | msacc_stats() when Analysis :: type, StatsOrData :: msacc_data() | msacc_stats().
傳回給定微狀態統計值的系統時間。系統時間是所有執行緒的累積時間。
realtime
- 傳回所有執行緒記錄的所有時間。runtime
- 傳回所有執行緒執行工作所花費的所有時間,也就是所有沒有花在sleep
狀態的時間。
從給定的微狀態統計值中,返回各個執行緒在即時或執行時所花費的時間比例。
返回一個微狀態統計值列表,其中相同類型的所有執行緒的值已合併。
-spec stop() -> boolean().
停止微狀態計帳。傳回先前是否已啟用或停用。
-spec to_file(Filename) -> ok | {error, file:posix()} when Filename :: file:name_all().
將目前的微狀態統計計數器傾印到可使用 file:consult/1
剖析的檔案。