lcnt
lcnt
模块
lcnt
模块摘要
运行时系统锁分析工具。
描述
大lcnt
模块用于分析ErlangRuntime系统中的内部e线程锁。带着lcnt
启用时,运行时系统中的内部计数器每次使用锁时都会更新。计数器存储有关获取尝试次数和在获取尝试期间发生的碰撞次数的信息。计数器还记录发生冲突时锁对阻塞线程造成的等待时间。
锁计数器生成的数据将从可并行的角度对测试场景的运行时系统的行为进行估计。开发这个工具主要是为了帮助Erlang运行时开发人员解决潜在的和通用的瓶颈。
模拟器中的锁以其保护的资源类型以及它们初始化的模拟器中的哪些位置命名,它们是锁'类'。大多数这些锁也被实例化了几次,并给出了唯一的标识符,以增加锁定粒度。通常情况下,实例化的锁保护资源的分离集,例如表,进程或端口。在其他情况下,它会保护特定范围的资源,例如pix_lock
保护索引以处理映射,并在类中提供唯一编号。一个唯一的锁lcnt
被一个名字(类)和一个标识符引用:{Name, Id}
。
系统中的某些锁是静态的,并保护全局资源,例如锁bif_timers
和run_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
类型
打印特定锁的内部锁计数器列表。
锁Name
和Id
的端口和进程是可互换的。lcnt:swap_pid_keys/0
也是为什么pid()
和port()
两个选项都可以使用。Name
和Id
太空。PIDS和端口都是特殊的标识符,可以用lcnt:pid/2,3
和lcnt: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_mutex
,mutex
,spinlock
,rw_spinlock
或proclock
。entry
结合使用{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
掉期安置Name
和Id
端口和进程的空间。
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_save
到true
在调用的持续时间内,这会很快导致内存耗尽。
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获得许可。