Lockstatプロバイダ
lockstatプロバイダは、ロックの使用状況および競合の調査に使用できるプローブを提供します。
lockstatプローブ
すべてのlockstatプローブについて、モジュール名はvmlinuxで、関数名は空の文字列です。
ロックは次のように分類されます:
-
スピン: これは、競合がある場合にスピン待機です。
-
アダプティブ: 競合がある場合は、スピン待機またはブロックのいずれかです。
-
Readers-writer。
次のプローブは、ロックが取得または解放されると起動します:
-
spin-acquire. -
spin-release. -
adaptive-acquire. -
adaptive-release. -
rw-acquire. -
rw-release.
ロックの競合が発生し、プローブが有効になっている場合は、ロックが取得される前に次のプローブが起動します:
-
spin-spin. -
adaptive-block,adaptive-spin. 使用される待機に応じて、一方のプローブが起動するか、もう一方のプローブが起動します。 -
rw-spin.
最後に、adaptive-acquire-errorプローブは、適応ロックの取得中にエラーが発生しました。
lockstatプローブの引数
次の表に、lockstatプローブの引数の型を示します。 argNは実装固有です。 args[]を使用して、プローブ引数にアクセスします。
表9-6 lockstatプローブの引数
| プローブ | args[0] | args[1] | args[2] |
|---|---|---|---|
|
|
|
- |
- |
|
|
|
|
- |
|
|
|
|
- |
|
|
|
- |
- |
|
|
|
|
- |
|
|
|
|
- |
|
|
|
|
- |
|
|
|
|
|
|
|
|
- |
- |
|
|
|
- |
- |
|
|
|
|
- |
ノート:
args[0]には、問題のロックへのポインタがあります。 競合が発生した場合に起動するプローブは、uint64_t args[1](ナノ秒単位の待機時間)をレポートします。 rwプローブは、RW_READERまたはRW_WRITERのいずれかのintもレポートします。 最後に、adaptive-acquire-errorは、ゼロ以外のエラーでintを報告します。
lockstatの例
次の例は、lockstatプロバイダによって公開されるプローブの使用を示しています。
アダプティブ・アク・ワイアとスピン・アク・ワイア
次のDソース・コードを入力し、whatlock.dという名前のファイルに保存します:
lockstat:::spin-acquire,
lockstat:::adaptive-acquire
/pid == $target/
{
@locks[probename] = count();
}
sudo dtrace -qs whatlock.d -c dateを使用して、dateコマンドでプログラムを実行します。 Dの出力は次のようになります:
adaptive-acquire 6
spin-acquire 134
dateコマンドで非常に多くのロックが取得されることは驚くべきことです。 多数のロックは、Oracle Liuxカーネルなどのスケーラブルなシステムに必要なファイングレイン・ロックの自然なアーティファクトです。