Solaris 动态跟踪指南

fill 策略

对于某些问题,您可能希望使用一个内核内部的缓冲区。虽然此方法可以使用 switch 策略和相应的 D 结构(通过在 D 中递增变量并相应地预测 exit() 操作)实现,但这样的实现不能消除发生删除的可能性。要请求内核中的单个大缓冲区,并继续跟踪,直到一个或多个每 CPU 缓冲区已填充,请使用 fill 缓冲区策略。在此策略下,跟踪将继续,直到已启用的探测器尝试跟踪的数据多于剩余主体缓冲区空间中可以容纳的数据。在剩余空间不足时,缓冲区将标记为已填充,并且将通知使用者,至少有一个每 CPU 缓冲区已填充。在 dtrace(1M) 检测到一个已填充的缓冲区后,将停止跟踪,并处理所有缓冲区,然后 dtrace 退出。即使缓冲区中还可容纳一些数据,也不会在已填充缓冲区中跟踪更多的数据。

要使用 fill 策略,请将 bufpolicy 选项设置为 fill。例如,以下命令使用设置为 fill 的缓冲策略,在每 CPU 2K 的缓冲区中跟踪每个系统调用项:


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

fill 策略和 END 探测器

在 DTrace 使用者显式停止跟踪之前,END 探测器通常不会触发。END 探测器一定仅在一个 CPU 中触发,而且是将触发探测器的未定义的 CPU。使用 fill 缓冲区时,如果至少有一个每 CPU 主体缓冲区标记为已填充,便会显式停止跟踪。如果选择了 fill 策略,则 END 探测器可能在有已填充缓冲区的 CPU 中触发。为了适应 fill 缓冲区中的 END 跟踪,DTrace 将计算 END 探测器可能使用的空间的数量,然后从主体缓冲区的大小中减去此空间。如果净大小为负数,DTrace 将拒绝启动,dtrace(1M) 将输出相应的错误消息:


dtrace: END enablings exceed size of principal buffer

预留空间机制可确保,对于任何 END 探测器,整个缓冲区始终有足够的空间。