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