--- title: 25. Fejezet - DTrace part: III. Rész Rendszeradminisztráció prev: books/handbook/cutting-edge next: books/handbook/partiv showBookMenu: true weight: 29 params: path: "/books/handbook/dtrace/" --- [[dtrace]] = DTrace :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 25 :partnums: :source-highlighter: rouge :experimental: :images-path: books/handbook/dtrace/ ifdef::env-beastie[] ifdef::backend-html5[] :imagesdir: ../../../../images/{images-path} endif::[] ifndef::book[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] toc::[] endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] toc::[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [[dtrace-synopsis]] == Áttekintés A DTrace, vagy más néven Dynamic Tracing technológiát a Sun(TM) 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(TM) é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(R) és FreeBSD alapvetõ ismerete (crossref:basics[basics,A UNIX alapjai]); * a rendszermag konfigurációjának és fordításának alapvetõ ismerete (crossref:kernelconfig[kernelconfig,A FreeBSD rendszermag testreszabása]); * az operációs rendszerek és azon belül a FreeBSD biztonsági fogalmainak minimális ismerete (crossref:security[security,Biztonság]); * a FreeBSD forrásainak megszerzésének és azok lefordításának ismerete (crossref:cutting-edge[updating-upgrading,A FreeBSD frissítése és frissen tartása]). [WARNING] ==== 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. ==== [[dtrace-implementation]] == Eltérések az implementációban Noha a FreeBSD alatt megtalálható DTrace implementáció nagyon hasonló az eredeti, Solaris(TM) 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(TM) "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(TM) 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(TM) 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 [.filename]#/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(TM) CDDL licence vonatkozik. A `Common Development and Distribution License` FreeBSD a [.filename]#/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE# állományban található, vagy interneten keresztül a http://www.opensolaris.org/os/licensing[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. [[dtrace-enable]] == 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: [.programlisting] .... options KDTRACE_HOOKS options DDB_CTF .... [NOTE] ==== AMD64 architektúrán ezeken kívül még az alábbi sor is kelleni fog: [.programlisting] .... 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: [source,shell] .... # 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 package:shells/ksh93[] csomagot, de megjegyezzük, hogy ugyanezen eszközök számára a package:shells/pdksh[] vagy package: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/[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. [[dtrace-using]] == 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: [source,shell] .... # 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: [source,shell] .... # 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: [source,shell] .... # 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 [.filename]#/usr/bin/ksh# hivatkozásokat írjuk át mindenhol a [.filename]#/usr/local/bin/ksh# névre, illetve a [.filename]#/usr/bin/sh# hivatkozásokat [.filename]#/bin/sh# névre, majd végezetül pedig a [.filename]#/usr/bin/perl# hivatkozásokat a [.filename]#/usr/local/bin/perl# névre. [IMPORTANT] ==== 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(TM) 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 [.filename]#hotkernel# és a [.filename]#procsystime#. A szakasz további részében ezzel a kettõvel fogunk részletesebben foglalkozni. A [.filename]#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: [source,shell] .... # ./hotkernel Sampling... Hit Ctrl-C to end. .... A folyamat kbd:[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: [source,shell] .... 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: [source,shell] .... # ./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 [.filename]#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 [.filename]#/bin/csh# egy újabb példányát. A [.filename]#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: [source,shell] .... # ./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. [[dtrace-language]] == 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(TM) 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[http://wikis.sun.com/display/DTrace/Documentation] címen igen részletesen olvashatunk róla.