我被要求测量写入过程引起的锁争用。我正在查看该写入过程的锁定状态数据。
我的问题如下:
争用是否与线程等待特定锁的次数(因为该锁被另一个线程占用)或线程必须等待该锁被释放的时间有关?
计算争用作为两者的衡量标准是否正确:
- 纳秒(线程必须等待事件发生/锁定释放的平均时间)和
- cnt(事件发生的次数)
从特定锁的 lockstat 收集的分析数据?即争用 ~ nsec * cnt
答案1
查看 Linux 内核文档,看起来它正在等待锁被释放。
- HOW
Lockdep already has hooks in the lock functions and maps lock instances to
lock classes. We build on that (see Documentation/locking/lockdep-design.txt).
The graph below shows the relation between the lock functions and the various
hooks therein.
__acquire
|
lock _____
| \
| __contended
| |
| <wait>
| _______/
|/
|
__acquired
|
.
<hold>
.
|
__release
|
unlock
lock, unlock - the regular lock functions
__* - the hooks
<> - states
笔记:看一下该链接,它也显示了用法。
衡量竞争
顺便说一句,您也可以/可以用来mutrace
计算给定可执行文件的争用。这篇文章对此进行了讨论,标题为:测量锁争用。
例如
$ LD_PRELOAD=/home/lennart/projects/mutrace/libmutrace.so gedit
mutrace: 0.1 sucessfully initialized.
mutrace: 10 most contended mutexes:
Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Type
35 368268 407 275 120,822 0,000 0,894 normal
5 234645 100 21 86,855 0,000 0,494 normal
26 177324 47 4 98,610 0,001 0,150 normal
19 55758 53 2 23,931 0,000 0,092 normal
53 106 73 1 0,769 0,007 0,160 normal
25 15156 70 1 6,633 0,000 0,019 normal
4 973 10 1 4,376 0,004 0,174 normal
75 68 62 0 0,038 0,001 0,004 normal
9 1663 52 0 1,068 0,001 0,412 normal
3 136553 41 0 61,408 0,000 0,281 normal
... ... ... ... ... ... ... ...
mutrace: Total runtime 9678,142 ms.