chill()
DTrace 액션 블록을 호출하면 timestamp
변수는 증가하지만 vtimestamp
sum은 증가하지 않는 이유를 이해하려고 합니다 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
이는 DTrace 코드를 실행할 때 증가하지 않기 때문에 이해할 수 있지만 여기서는 동작을 vtimestamp
이해하지 못합니다 .walltimestamp
amd64에서 FreeBSD 13.1-RELEASE-p1을 실행하고 있습니다.
답변1
분명히 이것은 DTrace의 버그입니다. 분명히 의 구현은 chill()
변수의 캐시된 값만 무효화하는 timestamp
반면 for 의 구현은 그렇지 않습니다. walltimestamp
이는 잘못된 것입니다.
답변을 주신 Mark Johnston에게 감사드립니다.FreeBSD DTrace 메일링 리스트.