msacc
msacc
模块
姆萨克
模块摘要
微观会计的方便函数
描述
该模块实现了用于分析微观账户数据的一些便利功能。有关如何使用基本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).
Average scheduler run-time调度程序
的平均运行时间,这就是您所得到的结果。这是调度程序没有睡眠的平均时间。
然后,每个状态的一列将以该线程在该状态中花费的实时时间百分比来打印。在线程特定的时间之后,每种线程的累计时间以类似的格式打印。
因为我们有即时平均在每个州度过,我们可以很容易地通过相乘计算每个状态所花费的时间的百分比Average thread real-time
用Thread state %
,即获得在我们做的仿真器状态的时间安排器1000513us * 0.13% = 1300us
。
数据类型
msacc_data() = [
msacc_data_thread()
]
msacc_data_thread() =
#{'$type' := msacc_data,
type :=
msacc_type()
,
id :=
msacc_id()
,
counters :=
msacc_data_counters()
}
msacc_data_counters() = #{msacc_state()=> integer() >= 0}
包含不同微观会计状态的地图,以及在其中花费的微秒数。
msacc_stats() = [
msacc_stats_thread()
]
msacc_stats_thread() =
#{'$type' := msacc_stats,
type :=
msacc_type()
,
id :=
msacc_id()
,
system := float(),
counters :=
msacc_stats_counters()
}
包含有关特定线程的信息的映射。地图中的百分比可以是运行时的,也可以是实时的,具体取决于runtime
或realtime
被要求stats/2
...system
此特定线程的系统总时间百分比。
msacc_stats_counters() =
#{msacc_state()=> #{thread := float(), system := float()}}
包含不同微观会计状态的地图。映射中的每个值都包含另一个映射,该映射包含此线程在特定状态下花费的时间百分比。两者的百分比system
时间和时间thread
是地图的一部分。
msacc_type() = scheduler | aux | async
msacc_id() = integer() >= 0
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_print_options() = #{system => boolean()}
可以给予的不同选项print/2
。
出口
available() - > boolean()
此函数检查是否可用微观状态会计。
start() - > boolean()
启动微观会计。返回以前是否已启用或禁用。
开始(时间) - > true
类型
重置所有计数器,然后开始计算给定毫秒的微状态。
stop() - > boolean()
停止微观会计。返回以前是否已启用或禁用。
reset() - > boolean()
重置微状态记帐计数器。返回是否已启用或禁用。
print() - >确定
打印当前的微观会计标准。同msacc:print(msacc:stats(),#{}).
打印(DataOrStats) - >确定
类型
将给定的微状态统计值打印到stdout。同msacc:print(DataOrStats,#{}).
打印(DataOrStats,选项) - >确定
类型
打印给定的微状态统计值以进行标准输出。对于许多状态,这可能是相当冗长的。有关字段含义的简要说明,请参阅本参考手册的顶部。
通过首先操作DataOrStats
使用stats/2
.例如,如果要打印每个线程的运行时百分比,则可以:
msacc:print(msacc:stats(runtime,msacc:stats())).
如果希望只打印每个线程类型的运行时,可以:
msacc:print(msacc:stats(type,msacc:stats(runtime,msacc:stats()))).
备选方案
system
打印系统时间和线程时间在每个状态中花费的时间百分比。默认值:假。
打印(FileOrDevice,DataOrStats,选项) - >确定
类型
将给定的微观统计值打印到给定的文件或设备。其他论点的行为方式与之相同print/2
。
stats() - > msacc_data()
返回微状态统计数据的运行时系统独立版本。erlang:statistics(microstate_accounting)
所有计数器都已归一化为微秒分辨率。
stats(Analysis,Stats) - > integer()> = 0
类型
返回给定微状态统计值的系统时间。系统时间是所有线程的累积时间。
realtime
返回所有线程记录的所有时间。runtime
返回为所有线程工作所花费的所有时间,即所有未在sleep
状态。
统计(分析,统计) - > msacc_stats()
类型
从给定的微状态统计值中返回用于各种线程的实时或运行时的分数。
统计信息(Analysis,StatsOrData) - > msacc_data()|msacc_stats()
类型
返回微状态统计值列表,其中所有相同类型线程的值都已合并。
to_file(文件名) - > ok | {error,file:posix()}
类型
将当前微观状态统计信息计数器转储到可以解析的文件file:consult/1
。
from_file(文件名) - > msacc_data()
类型
读取由to_file(Filename)
...