工具 | instrument
仪器
模块
仪器
模块摘要
仪器分析与实用函数
描述
模块instrument
包含对研究Erlang运行时系统中资源使用情况的支持。目前,只能研究内存的分配问题。
注
请注意,整个模块是实验性的,而且所使用的表示形式以及功能在将来可能会发生变化。
大instrument
在Erlang/OTPR9C中模块接口略有改变。
若要使用工具启动Erlang运行时系统,请使用+Mi*
的命令行参数集。erl
命令%28参见[医]分配%283%29和错误%281%29手册页%29。
内存分配的基本研究对象是内存分配图。内存分配映射包含每个分配内存块的描述符列表。当前,描述符是一个4元组。
{TypeNo, Address, Size, PidDesc}
何地TypeNo
是内存块类型编号,Address
是它在记忆中的位置Size
它的大小,以字节为单位。PidDesc
不是元组{X,Y,Z}
标识在分配块时正在执行的进程,或undefined
如果没有进程正在执行。PID元组{X,Y,Z}
可以通过使用c:pid/3
功能。
有关内存分配的各种详细信息:
在堆段和其他内存段上都分配内存块。这可能导致仪表功能报告非常大的漏洞。目前,检测功能%27T提供了对区分内存段之间的漏洞和内存段内分配块之间的漏洞的任何支持。进程的当前大小不能从Erlang内部获得,但是可以使用系统统计工具之一查看,例如,ps
或top
.Solaris公用事业公司pmap
可能很有用。它报告当前映射的内存段。
测试的开销:当模拟器已经用"+Mim true"
标志,每个块的前面是32位计算机上的24字节大头,64位计算机上有48字节大头。控件启动仿真程序时,"+Mis true"
标志,每个块前面有一个8字节的大头。这些是Erlang 5.3/OTPR9C模拟器使用的标头大小。模拟器的其他版本可以使用其他标头大小。功能block_header_size/1
可用于检索用于特定内存分配映射的标头大小。管理仪表数据的时间开销很小。
由测试功能提供的大小由模拟器%29请求的大小表示为%28,即不包括仪器标头或分配器使用的标头。
出口
allocator_descr(MemoryData, TypeNo) -> AllocDescr | invalid_type | "unknown"
类型
返回分配器的说明,该分配器管理类型为Number的内存块。TypeNo
用于MemoryData
有效TypeNo
S在返回的范围内。type_no_range/1
在这个特定的内存分配图上。如果TypeNo
是无效整数,invalid_type
会被归还。
block_header_size(MemoryData) -> int()
类型
返回生成内存分配映射的模拟器使用的内存块头大小。块头大小在不同的模拟器之间可能有所不同。
class_descr(MemoryData, TypeNo) -> ClassDescr | invalid_type | "unknown"
类型
返回类型编号的类的类描述。TypeNo
用于MemoryData
属于。有效TypeNo
S在返回的范围内。type_no_range/1
在这个特定的内存分配图上。如果TypeNo
是无效整数,invalid_type
会被归还。
descr(MemoryData) -> DescrMemoryData
类型
返回一个内存分配映射,其中类型数字(的第一个元素Desc
)已被类型描述替换,并且pid元组(第四个元素Desc
)已被实际的pid替换。
holes(MemoryData) -> ok
类型
打印终端上每个孔的大小(即分配的块之间的空间)。注:
真正大的孔可能是内存段之间的空洞。内存分配映射必须进行排序(请参阅sort/1
)。
mem_limits(MemoryData) -> {Low, High}
类型
返回{Low, High}
指示使用的最低和最高地址的元组。内存分配映射必须进行排序(请参阅sort/1
)。
memory_data() -> MemoryData | false
类型
MemoryData
如果模拟器已经用“ +Mim true
”命令行参数启动,则返回(内存分配映射); 否则,false
。注意:
memory_data/0
在收集数据时阻止执行其他进程。收集数据所需的时间可能很长。
memory_status(StatusType) -> [StatusInfo] | false
类型
返回StatusInfo
如果仿真器已启动,则为“+Mis true
“或”+Mim true
“命令行参数,则为,false
...
见read_memory_status/1
函数用于描述StatusInfo
术语。
read_memory_data(File) -> MemoryData | {error, Reason}
类型
从文件中读取内存分配映射。File
并归还它。假定该文件是由store_memory_data/1
错误代码与file:consult/1
...
read_memory_status(File) -> MemoryStatus | {error, Reason}
类型
从文件中读取内存分配状态File
并归还它。假定该文件是由store_memory_status/1
错误代码与file:consult/1
...
如果StatusType
是allocators
,About
是,信息是关于分配器。何时StatusType
是types
,About
信息是关于内存块类型。内存块类型除了名称之外不再描述,可能因模拟器而异。什么时候StatusType
是classes
,About
提供信息的内存块类型类。内存块类型在使用后会被分类。目前存在以下类别:
process_data
Erlang处理特定数据。binary_data
二郎双星。atom_data
Erlang原子。code_data
二郎密码。system_data
系统使用的其他数据
如果InfoName
是sizes
,Current
,MaxSinceLast
,和MaxEver
分别是电流的大小,因为到最后一次通话的最大尺寸store_memory_status/1
或memory_status/1
与特定的StatusType
,并且最大尺寸,因为模拟器启动。如果InfoName
是blocks
,Current
,MaxSinceLast
,和MaxEver
分别是块的当前数量,因为上次调用块的最大数量store_memory_status/1
或memory_status/1
与特定的StatusType
自模拟器启动和块的最大数量。
注:
内存块在“第一级”分配器上计算。例如:fix_alloc
将其内存池分配给ll_alloc
.当fix_alloc
块,它所驻留的块或池都不被视为通过ll_alloc
即使是这样。
sort(MemoryData) -> MemoryData
类型
对内存分配映射进行排序,以便地址按升序排列。
store_memory_data(File) -> true|false
类型
将当前的内存分配映射存储在文件上File
。返回true
如果仿真器已经开始用“ +Mim true
”命令行参数,并已成功存储的地图; 否则,false
。该文件的内容稍后可以使用读取read_memory_data/1
。注意:
store_memory_data/0
在收集数据时阻止执行其他进程。收集数据所需的时间可能很长。
store_memory_status(File) -> true|false
类型
将当前内存状态存储在文件中。File
.返回true
如果仿真器已启动,则为“+Mis true
“,或”+Mim true
“命令行参数,数据已成功存储,则为,false
.文件的内容可以在以后使用read_memory_status/1
。
sum_blocks(MemoryData) -> int()
类型
返回列表中内存块的总大小。
type_descr(MemoryData, TypeNo) -> TypeDescr | invalid_type
类型
中使用的类型数的类型说明。MemoryData
有效TypeNo
S在返回的范围内。type_no_range/1
在这个特定的内存分配图上。如果TypeNo
是无效整数,invalid_type
会被归还。
type_no_range(MemoryData) -> {Min, Max}
类型
中使用的内存块类型编号范围。MemoryData当由Erlang 5.3/otp r9c或更新的模拟器生成内存分配映射时,所有整数T满足Min<=T<=Max是有效的类型编号。当由预Erlang 5.3/otp r9C仿真器生成内存分配映射时,范围内的所有整数都是不有效类型编号。
另见
erts_alloc(3)
, erl(1)