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.
Fontos: 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): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése,
kérjük erre a címre írjon: <gabor@FreeBSD.org>.