非常教程

Erlang 20参考手册

tools

lcnt

模块

lcnt

模块摘要

运行时系统锁分析工具。

描述

lcnt模块用于分析ErlangRuntime系统中的内部e线程锁。带着lcnt启用时,运行时系统中的内部计数器每次使用锁时都会更新。计数器存储有关获取尝试次数和在获取尝试期间发生的碰撞次数的信息。计数器还记录发生冲突时锁对阻塞线程造成的等待时间。

锁计数器生成的数据将从可并行的角度对测试场景的运行时系统的行为进行估计。开发这个工具主要是为了帮助Erlang运行时开发人员解决潜在的和通用的瓶颈。

模拟器中的锁以其保护的资源类型以及它们初始化的模拟器中的哪些位置命名,它们是锁'类'。大多数这些锁也被实例化了几次,并给出了唯一的标识符,以增加锁定粒度。通常情况下,实例化的锁保护资源的分离集,例如表,进程或端口。在其他情况下,它会保护特定范围的资源,例如pix_lock保护索引以处理映射,并在类中提供唯一编号。一个唯一的锁lcnt被一个名字(类)和一个标识符引用:{Name, Id}

系统中的某些锁是静态的,并保护全局资源,例如锁bif_timersrun_queue锁。其他锁是动态的,不一定是长期存在的,例如进程锁和ets-table锁。来自短期锁定的统计数据可以在锁定被删除时单独存储。此行为默认关闭以节省内存,但可以通过打开lcnt:rt_opt({copy_save, true})。该lcnt:apply/1,2,3功能在分析过程中启用此行为。

出口

start() -> {ok, Pid} | {error, {already_started, Pid}}

类型

启动锁定分析器服务器。服务器仅充当用户的媒介并执行对收集的数据的过滤和打印lcnt:collect/1

stop() -> ok

停止锁探查器服务器。

collect() -> ok

collect(node())

collect(Node) -> ok

类型

从运行时系统收集锁统计信息。如果服务器尚未启动,则启动该函数。然后将锁统计信息填充到服务器。如果服务器在收集之前保存了任何锁统计数据,则该数据将丢失。

clear() -> ok

clear(node())

clear(Node) -> ok

类型

清除运行时系统的内部锁统计信息。这并不是仅在运行时系统上清除服务器上的数据。所有用于静态锁的计数器都是零的,所有当前活动的动态锁都是零的,所有保存的锁现在都被销毁了。它还重置持续时间计时器。

conflicts() -> ok

conflicts([])。

conflicts([Option]) -> ok

类型

打印内部锁及其统计信息的列表。

有关选项说明,请参见lcnt:inspect/2

locations() -> ok

locations([])

locations([Option]) -> ok

类型

按源代码位置打印内部锁计数器列表。

有关选项说明,请参见lcnt:inspect/2

inspect(Lock) -> ok

inspect(Lock, [])

inspect(Lock, [Option]) -> ok

类型

打印特定锁的内部锁计数器列表。

NameId的端口和进程是可互换的。lcnt:swap_pid_keys/0也是为什么pid()port()两个选项都可以使用。NameId太空。PIDS和端口都是特殊的标识符,可以用lcnt:pid/2,3lcnt:port/1,2

选项说明:

{combine, bool()}组合来自锁类不同实例的统计信息。

违约:true{locations, bool()}按源文件和行号打印统计信息。

违约:false{max_locks, MaxLocks}打印或无限制的锁的最大数量none

默认值:20 {print, PrintOptions}打印选项:已 name命名的锁或已命名的一组锁(类)。用于初始化VM中的锁定的名称。id一组锁的内部ID,并不总是唯一的。这可能是ETS表(db_tab)表名,端口的端口号,整数标识符分配器等type锁的类型:rw_mutexmutexspinlockrw_spinlockproclockentry结合使用{locations, true}此选项可以打印锁操作源文件和行号入口点以及每个条目的统计信息。 tries此锁的收购数量。colls线程尝试获取此锁定时的冲突次数。这是当一个trylock是EBUSY,一个写操作尝试读取保持rw_lock,一个尝试读写保持rw_lock,一个线程试图锁定一个已经锁定的锁。(内部国家监督这一点)。ratio碰撞次数与尝试次数(收购)之间的比率。time此锁的累计等待时间。这可能比实际的挂钟时间更长,它是针对所有线程累计的。Trylock冲突不会累积时间。duration挂钟时间累计等待时间的百分比。由于累计时间来自所有线程,因此该百分比可能高于100%。

违约:[name,id,tries,colls,ratio,time,duration]{reverse, bool()}颠倒排序顺序。

违约:false{sort, Sort}列排序命令。

违约:time{thresholds, Thresholds}过滤阈值。超过阈值的任何值都会传递。

违约:[{tries, 0}, {colls, 0}, {time, 0}]

information() -> ok

打印lcnt服务器状态和有关收集的锁统计信息的一般信息。

swap_pid_keys() -> ok

掉期安置NameId端口和进程的空间。

load(Filename) -> ok

类型

将先前保存的数据还原到服务器。

save(Filename) -> ok

类型

将收集的数据保存到文件中。

方便函数

为了方便起见,使用了以下功能。

出口

apply(Fun) -> term()

类型

apply(Fun, [])

apply(Fun, Args) -> term()

类型

apply(Module, Function, Args)

apply(Module, Function, Args) -> term()

类型

清除锁计数器,然后设置仪表以保存所有已销毁的锁。设置函数之后,将元素传递给Args作为争论。当函数返回时,将立即将统计信息收集到服务器。集合之后,检测将返回到以前的行为。返回应用函数的结果。

警告

此函数只适用于微基准;它设置copy_savetrue在调用的持续时间内,这会很快导致内存耗尽。

pid(Id, Serial) -> pid()

pid(node(), Id, Serial)

pid(Node, Id, Serial) -> pid()

类型

使用创建0创建进程id。例子:

port(Id) -> port()

port(node(), Id)

port(Node, Id) -> port()

类型

使用创建0创建端口id。

内部运行时锁计数器控制器

以下函数控制内部计数器的行为。

出口

rt_collect() -> [lock_counter_data()]

rt_collect(node())

rt_collect(Node) -> [lock_counter_data()]

类型

返回原始锁计数器数据的列表。

rt_clear() -> ok

rt_clear(node())...

rt_clear(Node) -> ok

类型

清除内部计数器。同lcnt:clear(Node)

rt_mask() -> [category_atom()]

rt_mask(node())

rt_mask(Node) -> [category_atom()]

类型

请参阅rt_mask/2有关有效类别的列表。默认情况下启用所有类别。

rt_mask(Categories) -> ok | {error, copy_save_enabled}

类型

rt_mask(node(), Categories)

rt_mask(Node, Categories) -> ok | {error, copy_save_enabled}

类型

将锁定类别掩码设置为给定类别。

如果copy_save选项已启用;请参见lcnt:rt_opt/2

有效类别如下:

  • allocator
  • db (ETS表)
  • debug
  • distribution
  • generic
  • io
  • process
  • scheduler

此列表在任何时候都可能发生更改,任何给定的锁都可能属于该类别。

rt_opt({Type, bool()}) -> bool()

rt_opt(node(), {Type, Opt})...

rt_opt(Node, {Type, bool()}) -> bool()

类型

选项说明:

{copy_save, bool()}保留已销毁锁的统计信息。

违约:false

警告

当启用时,此选项将使用大量内存,必须用lcnt:rt_clear请注意,它不区分已销毁的锁和禁用计数的锁,因此启用此选项将禁用对锁类别掩码的更改。

{process_locks, bool()}配置文件进程锁,等于添加process到锁类别掩码;请参见lcnt:rt_mask/2

违约:true

另见

LCNT User's Guide

 © 2010–2017 Ericsson AB

根据ApacheLicense,版本2.0获得许可。

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1