在线文档教程

工具 | 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内部获得,但是可以使用系统统计工具之一查看,例如,pstop.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有效TypeNoS在返回的范围内。type_no_range/1在这个特定的内存分配图上。如果TypeNo是无效整数,invalid_type会被归还。

block_header_size(MemoryData) -> int()

类型

返回生成内存分配映射的模拟器使用的内存块头大小。块头大小在不同的模拟器之间可能有所不同。

class_descr(MemoryData, TypeNo) -> ClassDescr | invalid_type | "unknown"

类型

返回类型编号的类的类描述。TypeNo用于MemoryData属于。有效TypeNoS在返回的范围内。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...

如果StatusTypeallocatorsAbout是,信息是关于分配器。何时StatusTypetypesAbout信息是关于内存块类型。内存块类型除了名称之外不再描述,可能因模拟器而异。什么时候StatusTypeclassesAbout提供信息的内存块类型类。内存块类型在使用后会被分类。目前存在以下类别:

process_dataErlang处理特定数据。binary_data二郎双星。atom_dataErlang原子。code_data二郎密码。system_data系统使用的其他数据

如果InfoNamesizesCurrentMaxSinceLast,和MaxEver分别是电流的大小,因为到最后一次通话的最大尺寸store_memory_status/1memory_status/1与特定的StatusType,并且最大尺寸,因为模拟器启动。如果InfoNameblocksCurrentMaxSinceLast,和MaxEver分别是块的当前数量,因为上次调用块的最大数量store_memory_status/1memory_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有效TypeNoS在返回的范围内。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)