options KDTRACE_HOOKS options DDB_CTF
25. Fejezet - DTrace
This translation may be out of date. To help with the translations please access the FreeBSD translations instance.
Table of Contents
25.1. Áttekintés
A DTrace, vagy más néven Dynamic Tracing technológiát a Sun™ dolgozta ki szerverek teljesítményében jelentkezõ szûk keresztmetszetek felderítésének megkönnyítésére. Ez nem egy nyomkövetésre szolgáló megoldást takar, hanem inkább a rendszer valós idejû elemzését és teljesítményének vizsgálatát elõsegítõ eszközt.
A DTrace figyelemre méltó elemzõeszköz, rengeteg rendkívül hasznos képességgel rendelkezik a rendszerben felbukkanó problémák diagnosztizálására. Elõre programozott szkriptek segítségével pedig ezen képességek további elõnyeit tudjuk kihasználni, ugyanis a DTrace programozható egy ún. D nyelven, amelynek révén a különbözõ vizsgálatokat könnyen a saját igényeink szerint tudjuk alakítani.
A fejezet elolvasása során megismerjük:
mi is az a DTrace és milyen lehetõségei vannak;
a Solaris™ és FreeBSD operációs rendszereken megtalálható DTrace implementációk közti eltéréseket;
a DTrace FreeBSD alatt hogyan engedélyezhetõ és használható.
A fejezet elolvasásához ajánlott:
a UNIX® és FreeBSD alapvetõ ismerete (A UNIX alapjai);
a rendszermag konfigurációjának és fordításának alapvetõ ismerete (A FreeBSD rendszermag testreszabása);
az operációs rendszerek és azon belül a FreeBSD biztonsági fogalmainak minimális ismerete (Biztonság);
a FreeBSD forrásainak megszerzésének és azok lefordításának ismerete (A FreeBSD frissítése és frissen tartása).
Ez a funkció még folyamatos tesztelés alatt áll. Bizonyos részei még egyáltalán nem, vagy csak korlátozottan érhetõek el. A dokumentáció annak megfelelõen fog majd változni, hogy ezek az elemek fokozatosan elérik az éles felhasználáshoz szükséges szintet. |
25.2. Eltérések az implementációban
Noha a FreeBSD alatt megtalálható DTrace implementáció nagyon hasonló az eredeti, Solaris™ alatt futó változathoz, tartalmaz bizonyos különbségeket, amelyeket a továbblépés elõtt mindenképpen érdemes megemlítenünk. Az egyik legfontosabb ilyen szembetûnõ különbség, hogy a FreeBSD esetén a DTrace használatát külön engedélyezni kell. A DTrace megfelelõ mûködéséhez tehát a rendszermag konfigurációs állományában meg kell adnunk bizonyos beállításokat és modulokat kell betöltenünk. Ezekrõl hamarosan szó lesz.
A rendszermag konfigurációs állományában a DDB_CTF
opció segítségével tudjuk engedélyezni ún. CTF adatok betöltését mind a rendszermag moduljaiból, mind pedig magából a rendszermagból egyaránt. A CTF a Solaris™ "Compact Type Format" elnevezésû formátumára utal, amellyel például a DWARF megoldásához hasonló módon tárolhatunk tömörített alakban különbözõ típusú nyomkövetési információkat. Ilyen CTF adatok többek közt a ctfconvert
és a ctfmerge
használatával rendelhetõek hozzá bináris állományokhoz. A ctfconvert
segédprogram a fordítóprogram által az ELF állományokban szereplõ DWARF típusú szakaszokban tárolt információkat képes beolvasni, és a ctfmerge
a tárgykódban található CTF típusú ELF szakaszokat tudja végrehajtható állományokká vagy osztott könyvtárakka összefûzni. Röviden beszélni fogunk arról, hogyan lehet mindezeket a FreeBSD alaprendszerébe és rendszermagjába is beépíteni.
FreeBSD és Solaris™ esetén elõfordulhat, hogy más fajta providerek állnak rendelkezésünkre. Ezek közül talán a legfontosabb a dtmalloc
, amely a FreeBSD rendszermagjában típus szerint teszi lehetõvé a malloc()
függvény követését.
FreeBSD alatt kizárólag csak a root
tudja használni a DTrace-t. Ennek oka a két operációs rendszer biztonsági megoldásai közti különbségekben keresendõ, mivel a Solaris™ esetén létezik néhány olyan alacsonyszintû ellenõrzés, amely a FreeBSD-nél még nincs. Ezért például a /dev/dtrace/dtrace eszköz szigorúan csak a root
számára érhetõ el.
Végezetül megemlítjük, hogy a DTrace felhasználására a Sun™ CDDL licence vonatkozik. A Common Development and Distribution License
FreeBSD a /usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE állományban található, vagy interneten keresztül a http://www.opensolaris.org/os/licensing címen.
Ezen licenc értelmében a DTrace támogatással készített FreeBSD rendszermagok továbbra is BSD licencûek maradnak, azonban a rendszerrel terjesztett binárisok futtatásakor vagy a modulok betöltésekor már a CDDL érvényesül.
25.3. A DTrace támogatásának engedélyezése
A DTrace által felkínált lehetõségeket a következõ sorok hozzáadásával tudjuk engedélyezni a rendszermag konfigurációs állományában:
AMD64 architektúrán ezeken kívül még az alábbi sor is kelleni fog: options KDTRACE_FRAME Ezzel a beállítással az FBT ("function boundary tracing") részére nyújtunk támogatást. A DTrace ugyan enélkül is képes lesz mûködni, de akkor csak korlátozott mértékben tudunk ilyen típusú vizsgálatokat végezni. |
Az egész rendszert újra kell fordítanunk a CTF használatával. Ennek elvégzéséhez a következõ parancsokat kell kiadnunk:
# cd /usr/src
# make WITH_CTF=1 kernel
A fordítás befejezõdése után indítsuk újra a rendszerünket.
A rendszer újraindulása és az új rendszermag betöltõdése után szükségünk lesz egy Korn-féle parancsértelmezõre is, mivel a DTrace eszköztárában rengeteg, a ksh
programra épülõ eszközt fogunk találni. Ezért tehát telepítsük a shells/ksh93 csomagot, de megjegyezzük, hogy ugyanezen eszközök számára a shells/pdksh vagy shells/mksh csomagok is megfelelnek.
Végül töltsük le a DTrace eszköztárának legfrissebb változatát. Az aktuális verzió a http://www.opensolaris.org/os/community/dtrace/dtracetoolkit/ címen érhetõ el. Képes önmagát telepíteni, de a benne található eszközök használatához nem kötelezõ ezt elvégezni.
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.
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.
25.5. A D nyelv
A DTrace eszköztárában megtalálható számos szkript a DTrace saját programozási nyelvén íródott. Ezt a nyelvet nevezik a Sun™ implementációjában "a D nyelvnek". Ennek ismertetésére itt most külön nem térünk ki, azonban a http://wikis.sun.com/display/DTrace/Documentation címen igen részletesen olvashatunk róla.
Last modified on: 2024. március 9. by Danilo G. Baio