25.4. A DTrace használata
Vissza | 25. fejezet - DTrace | Előre

## 25.4. A DTrace használata

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.

Vissza | Fel | Előre
25.3. A DTrace támogatásának engedélyezése | Főoldal | 25.5. A D nyelv

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>.