当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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