我想了解为什么调用chill()
DTrace 操作块会增加timestamp
变量,但不会增加vtimestamp
和walltimestamp
。
timestamp
这是一个显示调用后增加的示例chill()
:
# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' timestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6734 has exited
CPU ID FUNCTION:NAME
5 83475 _r_debug_postinit:entry 11258
5 85771 atexit:entry 2218
5 86468 __libc_atexit:entry 491
5 86428 exit:entry 441
5 85397 __cxa_thread_call_dtors:entry 441
5 86213 __cxa_finalize:entry 447
5 86213 __cxa_finalize:entry 565
5 83470 _rtld_addr_phdr:entry 454
5 86213 __cxa_finalize:entry 431
5 83470 _rtld_addr_phdr:entry 1645
5 84405 _exit:entry 432
如果我们运行相同的脚本但使用walltimestamp
(或vtimestamp
),我们将看到计数器没有增加:
# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' walltimestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6707 has exited
CPU ID FUNCTION:NAME
4 83475 _r_debug_postinit:entry 0
4 85771 atexit:entry 0
4 86468 __libc_atexit:entry 0
4 86428 exit:entry 0
4 85397 __cxa_thread_call_dtors:entry 0
4 86213 __cxa_finalize:entry 0
4 86213 __cxa_finalize:entry 0
4 83470 _rtld_addr_phdr:entry 0
4 86213 __cxa_finalize:entry 0
4 83470 _rtld_addr_phdr:entry 0
4 84405 _exit:entry 0
这对于 来说是可以理解的vtimestamp
,因为执行 DTrace 代码时它不会增加,但我不明白walltimestamp
这里的行为。
我在 amd64 上运行 FreeBSD 13.1-RELEASE-p1。
答案1
显然,这是 DTrace 中的一个错误。显然, 的实现chill()
仅使变量的缓存值无效timestamp
,而 for 的实现则不然walltimestamp
,这是不正确的。
感谢马克约翰斯顿提供的答案FreeBSD DTrace 邮件列表。