查看源代码 msacc (runtime_tools v2.1.1)
用于微状态统计的便利函数
此模块实现了一些用于分析微状态统计数据的便利函数。有关如何使用基本 API 以及不同状态代表什么含义的详细信息,请参阅 erlang:statistics(microstate_accounting)
。
基本场景
1> msacc:start(1000).
ok
2> msacc:print().
Average thread real-time : 1000513 us
Accumulated system run-time : 2213 us
Average scheduler run-time : 1076 us
Thread aux check_io emulator gc other port sleep
Stats per thread:
async( 0) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00%
async( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00%
aux( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 99.99%
scheduler( 1) 0.00% 0.03% 0.13% 0.00% 0.01% 0.00% 99.82%
scheduler( 2) 0.00% 0.00% 0.00% 0.00% 0.03% 0.00% 99.97%
Stats per type:
async 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00%
aux 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 99.99%
scheduler 0.00% 0.02% 0.06% 0.00% 0.02% 0.00% 99.89%
ok
第一个命令启用 1000 毫秒的微状态统计。有关更多详细信息,请参阅 start/0
、stop/0
、reset/0
和 start/1
。第二个命令打印在此期间收集的统计数据。首先打印三个通用统计数据。
平均实时时间 - 线程中收集数据的平均时间。这应该与收集数据的时间接近。
系统运行时间 - 系统中所有线程的总运行时间。如果您调用
msacc:stats(total_runtime,Stats).
,您将获得此值。平均调度器运行时间 - 调度器的平均运行时间。这是调度器未休眠的平均时间。
然后,为每个状态打印一列,其中显示此线程在其自身实时时间内花费在该状态的时间百分比。在线程特定时间之后,以类似格式打印每种线程类型的累积时间。
由于我们有平均实时时间和在每个状态中花费的百分比,我们可以通过将 平均线程实时时间
乘以 线程状态 %
来轻松计算在每个状态中花费的时间,也就是说,要获得调度器 1 在模拟器状态中花费的时间,我们执行 1000513us * 0.13% = 1300us
。
概要
类型
一个映射,其中包含不同的微状态统计状态以及在其中花费的微秒数。
可以传递给 print/2
的不同选项。
线程可以处于的不同状态。有关详细信息,请参阅 erlang:statistics(microstate_accounting)。
一个映射,其中包含不同的微状态统计状态。映射中的每个值都包含另一个映射,其中包含此线程在特定状态下花费的时间百分比。system
时间的百分比和该特定 thread
的时间都包含在该映射中。
一个映射,其中包含有关特定线程的信息。映射中的百分比可以是运行时间或实时时间,具体取决于是否从 stats/2
请求了 runtime
或 realtime
。system
是此特定线程的总系统时间的百分比。
函数
此函数检查是否可以使用微状态统计。
读取由 to_file(Filename) 生成的文件转储。
将当前的微状态统计信息打印到标准输出。等效于 msacc:print(msacc:stats(), #{}).
将给定的微状态统计值打印到标准输出。如果状态过多,这可能会很冗长。请参阅此参考手册的顶部,简要了解这些字段的含义。
将给定的微状态统计值打印到给定的文件或设备。其他参数的行为与 print/2
的相同。
重置微状态统计计数器。返回是否已启用或禁用。
启动微状态统计。返回之前是否已启用或禁用。
重置所有计数器,然后启动给定毫秒数的微状态统计。
返回 erlang:statistics(microstate_accounting)
提供的微状态统计数据的运行时系统独立版本。所有计数器都已标准化为微秒分辨率。
返回给定微状态统计值的系统时间。系统时间是所有线程的累积时间。
停止微状态统计。返回之前是否已启用或禁用。
将当前的微状态统计计数器转储到可以使用 file:consult/1
解析的文件中。
类型
-type msacc_data() :: [msacc_data_thread()].
-type msacc_data_counters() :: #{msacc_state() => non_neg_integer()}.
一个映射,其中包含不同的微状态统计状态以及在其中花费的微秒数。
-type msacc_data_thread() :: #{'$type' := msacc_data, type := msacc_type(), id := msacc_id(), counters := msacc_data_counters()}.
-type msacc_id() :: non_neg_integer().
-type msacc_print_options() :: #{system => boolean()}.
可以传递给 print/2
的不同选项。
-type msacc_state() ::
alloc | aux | bif | busy_wait | check_io | emulator | ets | gc | gc_fullsweep | nif | other |
port | send | sleep | timers.
线程可以处于的不同状态。有关详细信息,请参阅 erlang:statistics(microstate_accounting)。
-type msacc_stats() :: [msacc_stats_thread()].
-type msacc_stats_counters() :: #{msacc_state() => #{thread := float(), system := float()}}.
一个映射,其中包含不同的微状态统计状态。映射中的每个值都包含另一个映射,其中包含此线程在特定状态下花费的时间百分比。system
时间的百分比和该特定 thread
的时间都包含在该映射中。
-type msacc_stats_thread() :: #{'$type' := msacc_stats, type := msacc_type(), id := msacc_id(), system := float(), counters := msacc_stats_counters()}.
一个映射,其中包含有关特定线程的信息。映射中的百分比可以是运行时间或实时时间,具体取决于是否从 stats/2
请求了 runtime
或 realtime
。system
是此特定线程的总系统时间的百分比。
-type msacc_type() :: aux | async | dirty_cpu_scheduler | dirty_io_scheduler | poll | scheduler.
函数
-spec available() -> boolean().
此函数检查是否可以使用微状态统计。
-spec from_file(Filename) -> msacc_data() when Filename :: file:name_all().
读取由 to_file(Filename) 生成的文件转储。
-spec print() -> ok.
将当前的微状态统计信息打印到标准输出。等效于 msacc:print(msacc:stats(), #{}).
-spec print(DataOrStats) -> ok when DataOrStats :: msacc_data() | msacc_stats().
-spec print(DataOrStats, Options) -> ok when DataOrStats :: msacc_data() | msacc_stats(), Options :: msacc_print_options().
将给定的微状态统计值打印到标准输出。如果状态过多,这可能会很冗长。请参阅此参考手册的顶部,简要了解这些字段的含义。
可以通过首先使用 stats/2
操作 DataOrStats
来打印更具体的统计信息类型。例如,如果您想打印每个线程的运行时间百分比,您可以执行
msacc:print(msacc:stats(runtime, msacc:stats())).
如果您只想打印每个线程类型的运行时间,您可以执行
msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).
选项
system
- 打印每个状态在系统时间和线程时间内所花费的时间百分比。默认值:false。
-spec print(FileOrDevice, DataOrStats, Options) -> ok when FileOrDevice :: file:filename() | io:device(), DataOrStats :: msacc_data() | msacc_stats(), Options :: msacc_print_options().
将给定的微状态统计值打印到给定的文件或设备。其他参数的行为与 print/2
的相同。
-spec reset() -> boolean().
重置微状态统计计数器。返回是否已启用或禁用。
-spec start() -> boolean().
启动微状态统计。返回之前是否已启用或禁用。
-spec start(Time) -> true when Time :: timeout().
重置所有计数器,然后启动给定毫秒数的微状态统计。
-spec stats() -> msacc_data().
返回 erlang:statistics(microstate_accounting)
提供的微状态统计数据的运行时系统独立版本。所有计数器都已标准化为微秒分辨率。
-spec stats(Analysis, Stats) -> non_neg_integer() when Analysis :: system_realtime | system_runtime, Stats :: msacc_data(); (Analysis, Stats) -> msacc_stats() when Analysis :: realtime | runtime, Stats :: msacc_data(); (Analysis, StatsOrData) -> msacc_data() | msacc_stats() when Analysis :: type, StatsOrData :: msacc_data() | msacc_stats().
返回给定微状态统计值的系统时间。系统时间是所有线程的累积时间。
realtime
- 返回所有线程记录的所有时间。runtime
- 返回所有线程在执行工作时所花费的所有时间,即,不在sleep
状态下花费的所有时间。
返回给定微状态统计值中,各种线程中花费的实时时间或运行时间的分数。
返回微状态统计值的列表,其中已合并所有相同类型线程的值。
-spec stop() -> boolean().
停止微状态统计。返回之前是否已启用或禁用。
-spec to_file(Filename) -> ok | {error, file:posix()} when Filename :: file:name_all().
将当前的微状态统计计数器转储到可以使用 file:consult/1
解析的文件中。