Solaris 動的トレースガイド

fill ポリシー

単一のカーネル内バッファーを使用したい場合もあります。これは、switch ポリシーと適切な D 構造体を使って、D の変数を増分し exit() アクションを適切な述語に付加すれば、実現可能です。しかしこの方法では、欠落が発生する可能性が残ります。単一の大きいカーネル内バッファーを使用し、CPU 単位のバッファーが 1 つ以上占有されるまでトレースを続行するには、fill バッファーポリシーを使用します。このポリシーでは、有効なプローブが主バッファーの残りの空間に収まり切らない量のデータをトレースしようとするまで、トレースが続行されます。空間が足りなくなると、バッファーがいっぱいになったと見なされ、コンシューマに、CPU 単位のバッファーが少なくとも 1 つが占有されたという通知が送られます。dtrace(1M) がいっぱいになったバッファーを検出すると、トレースは停止し、すべてのバッファーが処理されたあと、dtrace は終了します。たとえバッファーに入るデータがあっても、いっぱいになったバッファーにはそれ以上トレースされません。

fill ポリシーを使用するには、bufpolicy オプションに fill を設定します。たとえば、次のコマンドは、バッファーポリシーを fill に設定し、CPU 単位の 2K のバッファーに、すべてのシステムコールエントリをトレースします。


# dtrace -n syscall:::entry -b 2k -x bufpolicy=fill

fill ポリシーと END プローブ

END プローブは、通常、DTrace コンシューマによってトレースが明示的に停止されるまで起動しません。END プローブは必ず、単一の CPU 上でのみ起動します。ただし、プローブが起動する CPU は未定義です。fill バッファーを使用しているときは、CPU 単位の主バッファーの少なくとも 1 つがいっぱいになったと見なされた時点で、明示的にトレースが停止します。fill ポリシーを選択した場合、END プローブは、いっぱいになったバッファーがある CPU 上でも起動します。fill バッファーへの END のトレースを可能にするため、DTrace は、END プローブが消費する見込みの空間の量を計算し、主バッファーのサイズからこの空間の量を引きます。結果が負の数になった場合、DTrace は起動せず、dtrace(1M) は対応するエラーメッセージを出力します。


dtrace: END enablings exceed size of principal buffer

予約機構により、いっぱいになったバッファーにも、END プローブ用の空間は必ず残されています。