書き込みプロセスによって発生したロック競合を測定するように求められました。その書き込みプロセスのロック状態データを表示しています。
私の質問は次のとおりです。
競合は、スレッドが特定のロックを待つ回数(他のスレッドがそのロックを保持しているため)、またはそのロックが解放されるまでスレッドが待たなければならない時間に関連していますか?
競合を両方のスケールで計算するのは正しいですか?
- ナノ秒(スレッドがイベントの発生/ロック解除を待たなければならない平均時間)と
- 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.