Solaris 動的トレースガイド

キャッシュ可能な述語の使用

DTrace では、述語を使って、計測結果から不要なデータを排除できます。指定された条件が満たされた場合だけ、データのトレースが行われます。多数のプローブを有効にするときは、通常、特定のスレッド (複数可) を識別するような形式の述語を使用します。該当する例として、/self->traceme//pid == 12345/ を挙げることができます。これらの述語の多くは、ほとんどのプローブのほとんどのスレッドに対して偽を返します。しかし、プローブの数があまりにも多いと、この評価自体にかなりのコストがかかるようになります。このコストを下げるため、DTrace は、スレッド固有変数 (/self->traceme/ など) や不変変数 (/pid == 12345/ など) だけが含まれている述語の評価をキャッシュに格納します。キャッシュに入った述語は、キャッシュに入っていない述語よりもずっと低コストで評価できます。特に、その述語に、スレッド固有変数や文字列比較などの比較的コストの高い操作が含まれている場合、この傾向は顕著になります。通常、述語のキャッシュをユーザーが意識することはありませんが、ここからは、より良い述語を作成するための指針を得ることができます。次の表を参照してください。

キャッシュ可能 

キャッシュ不能 

self->mumble

mumble[curthread]mumble[pid, tid]

execname

curpsinfo->pr_fnamecurthread->t_procp->p_user.u_comm

pid

curpsinfo->pr_pid curthread->t_procp->p_pipd->pid_id

tid

curlwpsinfo->pr_lwpid curthread->t_tid

curthread

curthread->any member curlwpsinfo->any membercurpsinfo->any member

以下は、推奨しない例です。

syscall::read:entry
{
	follow[pid, tid] = 1;
}

fbt:::
/follow[pid, tid]/
{}

syscall::read:return
/follow[pid, tid]/
{
	follow[pid, tid] = 0;
}

次のように、スレッド固有変数を使用する方法を推奨します。

syscall::read:entry
{
	self->follow = 1;
}

fbt:::
/self->follow/
{}

syscall::read:return
/self->follow/
{
	self->follow = 0;
}

キャッシュ可能な式だけを含む述語のみが、キャッシュ可能です。以下の述語は、すべてキャッシュ可能です。

/execname == "myprogram"/
/execname == $$1/
/pid == 12345/
/pid == $1/
/self->traceme == 1/

以下の述語では、大域変数が使用されています。そのため、これらはすべてキャッシュ不能です。

/execname == one_to_watch/
/traceme[execname]/
/pid == pid_i_care_about/
/self->traceme == my_global/