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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。