statistics(Item :: microstate_accounting) ->
[MSAcc_Thread] | undefined
OTP 19.0MSAcc_Thread =
#{type := MSAcc_Thread_Type,
id := MSAcc_Thread_Id,
counters := MSAcc_Counters}
MSAcc_Thread_Type =
async | aux | dirty_io_scheduler | dirty_cpu_scheduler |
poll | scheduler
MSAcc_Thread_Id = integer() >= 0
MSAcc_Counters = #{MSAcc_Thread_State => integer() >= 0}
MSAcc_Thread_State =
alloc | aux | bif | busy_wait | check_io | emulator | ets |
gc | gc_fullsweep | nif | other | port | send | sleep | timers
微觀狀態統計可用於測量 Erlang 運行時係統執行各種任務所花費的時間。它被設計為盡可能輕量級,但啟用此函數時會存在一些開銷。微觀狀態會計旨在成為一種分析工具,幫助發現性能瓶頸。到start/stop/reset微觀狀態會計,使用係統標誌
microstate_accounting.
statistics(microstate_accounting) 返回表示 ERTS 中某些操作係統線程的映射列表。每個映射都包含 type 和 id 字段,可用於識別它是什麽線程,還包含一個計數器字段,其中包含有關在各種狀態下花費了多少時間的數據。
例子:
> erlang:statistics(microstate_accounting).
[#{counters => #{aux => 1899182914,
check_io => 2605863602,
emulator => 45731880463,
gc => 1512206910,
other => 5421338456,
port => 221631,
sleep => 5150294100},
id => 1,
type => scheduler}|...]
時間單位與返回的時間單位相同
os:perf_counter/0。因此,要將其轉換為毫秒,您可以執行以下操作:
lists:map(
fun(#{ counters := Cnt } = M) ->
MsCnt = maps:map(fun(_K, PerfCount) ->
erlang:convert_time_unit(PerfCount, perf_counter, 1000)
end, Cnt),
M#{ counters := MsCnt }
end, erlang:statistics(microstate_accounting)).
請注意,這些值不能保證是在每個狀態下花費的確切時間。這是因為進行了各種優化以使開銷盡可能小。
MSAcc_Thread_Type s:
scheduler- 完成大部分工作的主執行線程。看呃+S更多細節。
dirty_cpu_scheduler- 用於長時間運行 CPU 密集型工作的線程。看erl+SDcpu更多細節。
dirty_io_scheduler- 用於長時間運行 I/O 工作的線程。看erl+SDio更多細節。
async- 各種 linked-in 驅動程序(主要是文件驅動程序)使用異步線程來卸載非 CPU 密集型工作。看呃+A更多細節。
aux- 處理未專門分配給調度程序的任何工作。
poll- 是否對模擬器進行 IO 輪詢。看厄爾+IOt更多細節。
以下 MSAcc_Thread_State 可用。所有狀態都是排他的,這意味著一個線程不能同時處於兩種狀態。因此,如果將線程中所有計數器的數量相加,您就可以獲得該線程的總運行時間。
aux- 處理輔助工作所花費的時間。
check_io- 檢查新 I/O 事件所花費的時間。
emulator- 執行 Erlang 進程所花費的時間。
gc- 花費時間進行垃圾收集。當啟用額外狀態時,這是執行非完全掃描垃圾收集所花費的時間。
other- 時間花在做無名的事情上。
port- 執行端口所花費的時間。
sleep- 睡覺的時間。
可以通過configure添加更細粒度的MSAcc_Thread_State(如./configure --with-microstate-accounting=extra)。關閉微狀態記帳時啟用這些狀態會導致性能下降,而打開微狀態記帳時會增加開銷。
alloc- 花在管理內存上的時間。如果沒有額外的狀態,這次將分布在所有其他狀態上。
bif- 在 BIF 中花費的時間。如果沒有額外的狀態,這次是
emulator狀態的一部分。 busy_wait- 時間花在忙碌的等待上。這也是調度程序在使用時不再報告其處於活動狀態的狀態
statistics(scheduler_wall_time)。因此,如果您添加除此和睡眠之外的所有其他狀態,然後將其除以線程中的所有時間,您應該得到與scheduler_wall_time分數。沒有額外的狀態,這次是other狀態。 ets- 執行 ETS BIF 所花費的時間。如果沒有額外的狀態,這次是
emulator狀態的一部分。 gc_full- 進行全麵掃描垃圾收集所花費的時間。如果沒有額外的狀態,這次是
gc狀態的一部分。 nif- 在 NIF 中花費的時間。如果沒有額外的狀態,這次是
emulator狀態的一部分。 send- 發送消息所花費的時間(僅限進程)。如果沒有額外的狀態,這次是
emulator狀態的一部分。 timers- 管理計時器所花費的時間。如果沒有額外的狀態,這次是
other狀態的一部分。
實用模塊msacc(3)可用於更輕鬆地分析這些統計數據。
返回undefined如果係統標誌
microstate_accounting已關閉。
線程信息列表未排序,並且在調用之間可以以不同的順序出現。
線程和狀態如有更改,恕不另行通知。
相關用法
- erlang statistics(Item :: garbage_collection)用法及代碼示例
- erlang statistics(Item :: reductions)用法及代碼示例
- erlang statistics(Item :: runtime)用法及代碼示例
- erlang statistics(Item :: scheduler_wall_time)用法及代碼示例
- 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 :: microstate_accounting) -> [MSAcc_Thread] | undefined。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
