A DTrace funkcióinak alkalmazásához léteznie kell egy DTrace eszköznek. Ennek létrehozásához be kell töltenünk a megfelelő modult:
#
kldload dtraceall
Innentől már működésre kész a DTrace. Rendszeradminisztrátorként a következő módon kérdezhetjük le a rendelkezésre álló vizsgálatokat:
#
dtrace -l | more
Mivel lekérdezés eredménye pillanatok
alatt betöltené az egész képernyőt,
ezért az egészet még
átirányítjuk a more
parancshoz. Ha ez rendesen lefut, akkor a DTrace
ténylegesen használhatónak tekinthető.
Ezt követően tekintsük át a
hozzá tartozó eszközkészletet.
Ez a mellékelt eszközkészlet lényegében a rendszerrel kapcsolatos információk összegyűjtésére alkalmas szkripteket tartalmaz. Vannak szkriptek, amelyekkel a megnyitott állományokat, a memóriát, a processzorhasználatot és még sok minden mást kérdezhetünk le. A szkriptek a következő parancs segítségével tömöríthetőek ki:
#
gunzip -c DTraceToolkit* | tar xvf -
A cd
parancs
segítségével lépjünk be az
így keletkező könyvtárba, és a
kisbetűs névvel rendelkező
állományok engedélyeit állítsuk
be a 755
módra.
Mindegyik szkriptben el kell végeznünk némi
módosítást: a /usr/bin/ksh
hivatkozásokat írjuk át mindenhol a
/usr/local/bin/ksh
névre, illetve a
/usr/bin/sh
hivatkozásokat
/bin/sh
névre, majd
végezetül pedig a /usr/bin/perl
hivatkozásokat a /usr/local/bin/perl
névre.
Itt még egyszer kiemelnénk, hogy a FreeBSD-ben jelenleg megtalálható DTrace támogatás még nem teljes és kísérleti jelleggel szerepel. Ezért bizonyos szkriptek nem fognak működni, vagy azért, mert túlságosan Solaris™ lehetőségeihez igazodnak, vagy pedig azért, mert a jelenlegi implementáció által még nem ismert vizsgálatokra támaszkodnak.
Jelenlegi ismereteink szerint a FreeBSD egyelőre csak
két szkriptet támogat teljes mértékben,
ezek a hotkernel
és a
procsystime
. A szakasz további
részében ezzel a kettővel fogunk
részletesebben foglalkozni.
A hotkernel
feladata segíteni
beazonosítani azokat a függvényeket, amelyek a
legtöbb időt veszik igénybe a rendszermagon
belül. A szkript futtatásakor nagyjából
a következőt csinálja:
#
./hotkernel
Sampling... Hit Ctrl-C to end.
A folyamat Ctrl+C billentyűkombináció hatására állítható meg. A szkript futásának befejeződésekor különböző rendszermagbeli függvények és a hozzájuk tartozó idők jelennek meg, az utóbbi szerint növekvő sorrendben:
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%
Ez a szkript modulok esetén is alkalmazható.
Ezt a módját a -m
kapcsoló
megadásával aktiválhatjuk:
#
./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%
A procsystime
szkript egy adott
azonosítóval vagy névvel rendelkező
programhoz tudja megadni az általa kezdeményezett
rendszerhívások által felhasznált
időt. A most következő példában
elindítjuk a /bin/csh
egy újabb
példányát. A
procsystime
elindul, majd megvárja,
amíg kiadunk néhány parancsot a
csh
frissen indított
másolatában. A teszt eredményei tehát
a következők lesznek:
#
./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
Jól megfigyelhető, hogy (nanomásodpercekben
mérve) a legtöbb időt a
read()
, a legkevesebb időt pedig a
getpid()
rendszerhívás vette
igénybe.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.