查看源代码 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/0stop/0reset/0start/1。第二个命令打印在此期间收集的统计数据。首先打印三个通用统计数据。

  • 平均实时时间 - 线程中收集数据的平均时间。这应该与收集数据的时间接近。

  • 系统运行时间 - 系统中所有线程的总运行时间。如果您调用 msacc:stats(total_runtime,Stats).,您将获得此值。

  • 平均调度器运行时间 - 调度器的平均运行时间。这是调度器未休眠的平均时间。

然后,为每个状态打印一列,其中显示此线程在其自身实时时间内花费在该状态的时间百分比。在线程特定时间之后,以类似格式打印每种线程类型的累积时间。

由于我们有平均实时时间和在每个状态中花费的百分比,我们可以通过将 平均线程实时时间 乘以 线程状态 % 来轻松计算在每个状态中花费的时间,也就是说,要获得调度器 1 在模拟器状态中花费的时间,我们执行 1000513us * 0.13% = 1300us

概要

类型

一个映射,其中包含不同的微状态统计状态以及在其中花费的微秒数。

可以传递给 print/2 的不同选项。

线程可以处于的不同状态。有关详细信息,请参阅 erlang:statistics(microstate_accounting)

一个映射,其中包含不同的微状态统计状态。映射中的每个值都包含另一个映射,其中包含此线程在特定状态下花费的时间百分比。system 时间的百分比和该特定 thread 的时间都包含在该映射中。

一个映射,其中包含有关特定线程的信息。映射中的百分比可以是运行时间或实时时间,具体取决于是否从 stats/2 请求了 runtimerealtimesystem 是此特定线程的总系统时间的百分比。

函数

此函数检查是否可以使用微状态统计。

读取由 to_file(Filename) 生成的文件转储。

将当前的微状态统计信息打印到标准输出。等效于 msacc:print(msacc:stats(), #{}).

将给定的微状态统计值打印到标准输出。如果状态过多,这可能会很冗长。请参阅此参考手册的顶部,简要了解这些字段的含义。

将给定的微状态统计值打印到给定的文件或设备。其他参数的行为与 print/2 的相同。

重置微状态统计计数器。返回是否已启用或禁用。

启动微状态统计。返回之前是否已启用或禁用。

重置所有计数器,然后启动给定毫秒数的微状态统计。

返回 erlang:statistics(microstate_accounting) 提供的微状态统计数据的运行时系统独立版本。所有计数器都已标准化为微秒分辨率。

返回给定微状态统计值的系统时间。系统时间是所有线程的累积时间。

停止微状态统计。返回之前是否已启用或禁用。

将当前的微状态统计计数器转储到可以使用 file:consult/1 解析的文件中。

类型

链接到此类型

msacc_data()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_data() :: [msacc_data_thread()].
链接到此类型

msacc_data_counters()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_data_counters() :: #{msacc_state() => non_neg_integer()}.

一个映射,其中包含不同的微状态统计状态以及在其中花费的微秒数。

链接到此类型

msacc_data_thread()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_data_thread() ::
          #{'$type' := msacc_data,
            type := msacc_type(),
            id := msacc_id(),
            counters := msacc_data_counters()}.
链接到此类型

msacc_id()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_id() :: non_neg_integer().
链接到此类型

msacc_print_options()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_print_options() :: #{system => boolean()}.

可以传递给 print/2 的不同选项。

链接到此类型

msacc_state()

查看源代码 (未导出) (自 OTP 19.0 起)
-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)

链接到此类型

msacc_stats()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_stats() :: [msacc_stats_thread()].
链接到此类型

msacc_stats_counters()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_stats_counters() :: #{msacc_state() => #{thread := float(), system := float()}}.

一个映射,其中包含不同的微状态统计状态。映射中的每个值都包含另一个映射,其中包含此线程在特定状态下花费的时间百分比。system 时间的百分比和该特定 thread 的时间都包含在该映射中。

链接到此类型

msacc_stats_thread()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_stats_thread() ::
          #{'$type' := msacc_stats,
            type := msacc_type(),
            id := msacc_id(),
            system := float(),
            counters := msacc_stats_counters()}.

一个映射,其中包含有关特定线程的信息。映射中的百分比可以是运行时间或实时时间,具体取决于是否从 stats/2 请求了 runtimerealtimesystem 是此特定线程的总系统时间的百分比。

链接到此类型

msacc_type()

查看源代码 (未导出) (自 OTP 19.0 起)
-type msacc_type() :: aux | async | dirty_cpu_scheduler | dirty_io_scheduler | poll | scheduler.

函数

链接到此函数

available()

查看源代码 (自 OTP 19.0 起)
-spec available() -> boolean().

此函数检查是否可以使用微状态统计。

链接到此函数

from_file(Filename)

查看源代码 (自 OTP 19.0 起)
-spec from_file(Filename) -> msacc_data() when Filename :: file:name_all().

读取由 to_file(Filename) 生成的文件转储。

链接到此函数

print()

查看源代码 (自 OTP 19.0 起)
-spec print() -> ok.

将当前的微状态统计信息打印到标准输出。等效于 msacc:print(msacc:stats(), #{}).

链接到此函数

print(DataOrStats)

查看源代码 (自 OTP 19.0 起)
-spec print(DataOrStats) -> ok when DataOrStats :: msacc_data() | msacc_stats().

等效于 print(DataOrStats, #{})

链接到此函数

print(DataOrStats, Options)

查看源代码 (自 OTP 19.0 起)
-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。
链接到此函数

print(FileOrDevice, DataOrStats, Options)

查看源代码 (自 OTP 19.0 起)
-spec print(FileOrDevice, DataOrStats, Options) -> ok
               when
                   FileOrDevice :: file:filename() | io:device(),
                   DataOrStats :: msacc_data() | msacc_stats(),
                   Options :: msacc_print_options().

将给定的微状态统计值打印到给定的文件或设备。其他参数的行为与 print/2 的相同。

链接到此函数

reset()

查看源代码 (自 OTP 19.0 起)
-spec reset() -> boolean().

重置微状态统计计数器。返回是否已启用或禁用。

链接到此函数

start()

查看源代码 (自 OTP 19.0 起)
-spec start() -> boolean().

启动微状态统计。返回之前是否已启用或禁用。

链接到此函数

start(Time)

查看源代码 (自 OTP 19.0 起)
-spec start(Time) -> true when Time :: timeout().

重置所有计数器,然后启动给定毫秒数的微状态统计。

链接到此函数

stats()

查看源代码 (自 OTP 19.0 起)
-spec stats() -> msacc_data().

返回 erlang:statistics(microstate_accounting) 提供的微状态统计数据的运行时系统独立版本。所有计数器都已标准化为微秒分辨率。

链接到此函数

stats/2

查看源代码 (自 OTP 19.0 起)
-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 状态下花费的所有时间。

返回给定微状态统计值中,各种线程中花费的实时时间或运行时间的分数。

返回微状态统计值的列表,其中已合并所有相同类型线程的值。

链接到此函数

stop()

查看源代码 (自 OTP 19.0 起)
-spec stop() -> boolean().

停止微状态统计。返回之前是否已启用或禁用。

链接到此函数

to_file(Filename)

查看源代码 (自 OTP 19.0 起)
-spec to_file(Filename) -> ok | {error, file:posix()} when Filename :: file:name_all().

将当前的微状态统计计数器转储到可以使用 file:consult/1 解析的文件中。