Voordat er gebruik wordt gemaakt van de functionaliteit van DTrace, moet het DTrace-apparaat bestaan. Geef het volgende commando om het apparaat te laten:
#
kldload dtraceall
Ondersteuning van DTrace zou nu beschikbaar moeten zijn. De beheerder kan het volgende commando uitvoeren om alle sondes te bekijken:
#
dtrace -l | more
Alle uitvoer wordt aan het hulpmiddel more
doorgegeven omdat het snel de schermbuffer zal laten overstromen.
DTrace kan nu als werkend worden beschouwd. Het is nu tijd om
de gereedschapskist te bekijken.
De gereedschapskist is een verzameling van kant-en-klare scripts die met DTrace gedraaid kunnen worden om informatie over het systeem te verzamelen. Er zijn scripts om open bestanden, geheugen, CPU-gebruik, en nog veel meer te controleren. Pak de scripts uit met het volgende commando:
#
gunzip -c DTraceToolkit* | tar xvf -
Ga naar die map met cd
en zet de
uitvoerpermissies voor alle bestanden waarvan de naam uit kleine
letters bestaat, op 755
.
De inhoud van al deze scripts moet veranderd worden. Degenen
die naar /usr/bin/ksh
verwijzen dienen naar
/usr/local/bin/ksh
te verwijzen, de anderen
die /usr/bin/sh
gebruiken dienen gewijzigd te
worden om /bin/sh
te gebruiken, en tenslotte
dienen degenen die /usr/bin/perl
gebruiken
veranderd te worden om /usr/local/bin/perl
te
gebruiken.
Op dit moment is het voorzichtig om de lezer eraan te herinneren dat de ondersteuning voor DTrace in FreeBSD niet compleet en experimenteel is. Veel van deze scripts zullen niet werken omdat ze of te Solaris™-specifiek zijn of omdat ze sondes gebruiken die momenteel niet ondersteund worden.
Op het moment van schrijven worden slechts twee scripts van de
DTrace Toolkit volledig ondersteund in FreeBSD: de scripts
hotkernel
en
procsystime
. Dit zijn de twee die we in de
volgende gedeelten van deze sectie zullen bekijken.
De hotkernel
is ontworpen om te
identificeren welke functie de meeste kerneltijd gebruikt. Als
het normaal gedraaid wordt, zal het uitvoer die op de volgende
lijkt produceren:
#
cd /usr/share/dtrace/toolkit
#
./hotkernel
Sampling... Hit Ctrl-C to end.
De systeembeheerder moet de toetsencombinatie Ctrl+C gebruiken om het proces te stoppen. Nadat het gestopt is, zal het script een lijst van kernelfuncties en timinginformatie weergeven, waarbij de uitvoer in volgorde van toenemende tijd is gesorteerd:
kernel`_thread_lock_flags 2 0.0% 0xc1097063 2 0.0% kernel`sched_userret 2 0.0% kernel`kern_select 2 0.0% kernel`generic_copyin 3 0.0% kernel`_mtx_assert 3 0.0% kernel`vm_fault 3 0.0% kernel`sopoll_generic 3 0.0% kernel`fixup_filename 4 0.0% kernel`_isitmyx 4 0.0% kernel`find_instance 4 0.0% kernel`_mtx_unlock_flags 5 0.0% kernel`syscall 5 0.0% kernel`DELAY 5 0.0% 0xc108a253 6 0.0% kernel`witness_lock 7 0.0% kernel`read_aux_data_no_wait 7 0.0% kernel`Xint0x80_syscall 7 0.0% kernel`witness_checkorder 7 0.0% kernel`sse2_pagezero 8 0.0% kernel`strncmp 9 0.0% kernel`spinlock_exit 10 0.0% kernel`_mtx_lock_flags 11 0.0% kernel`witness_unlock 15 0.0% kernel`sched_idletd 137 0.3% 0xc10981a5 42139 99.3%
Het script werkt ook met kernelmodules. Draai het script met
de vlag -m
om deze mogelijkheid te
gebruiken:
#
./hotkernel -m
Sampling... Hit Ctrl-C to end. ^C MODULE COUNT PCNT 0xc107882e 1 0.0% 0xc10e6aa4 1 0.0% 0xc1076983 1 0.0% 0xc109708a 1 0.0% 0xc1075a5d 1 0.0% 0xc1077325 1 0.0% 0xc108a245 1 0.0% 0xc107730d 1 0.0% 0xc1097063 2 0.0% 0xc108a253 73 0.0% kernel 874 0.4% 0xc10981a5 213781 99.6%
Het script procsystime
vangt en beeldt
het tijdsgebruik van systeemaanroepen af voor een gegeven
PID of procesnaam. In het volgende voorbeeld
wordt er een nieuwe instantie van /bin/csh
gedraaid. Het procsystime
werd uitgevoerd en
bleef wachten terwijl er enkele commando's op de andere instantie
van csh
werden getypt. Dit zijn de resultaten
van deze test:
#
./procsystime -n csh
Tracing... Hit Ctrl-C to end... ^C Elapsed Times for processes csh, SYSCALL TIME (ns) getpid 6131 sigreturn 8121 close 19127 fcntl 19959 dup 26955 setpgid 28070 stat 31899 setitimer 40938 wait4 62717 sigaction 67372 sigprocmask 119091 gettimeofday 183710 write 263242 execve 492547 ioctl 770073 vfork 3258923 sigsuspend 6985124 read 3988049784
Zoals te zien is, lijkt de systeemaanroep
read()
de meeste tijd in nanoseconden te
gebruiken en gebruikte de systeemaanroep
getpid()
de minste hoeveelheid tijd.