當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


erlang statistics(Item :: microstate_accounting)用法及代碼示例


statistics(Item :: microstate_accounting) ->
              [MSAcc_Thread] | undefined
OTP 19.0
類型:
MSAcc_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 中某些操作係統線程的映射列表。每個映射都包含 typeid 字段,可用於識別它是什麽線程,還包含一個計數器字段,其中包含有關在各種狀態下花費了多少時間的數據。

例子:

> 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.org大神的英文原創作品 statistics(Item :: microstate_accounting) -> [MSAcc_Thread] | undefined。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。