---
title: 25. Fejezet - DTrace
part: III. Rész Rendszeradminisztráció
prev: books/handbook/cutting-edge
next: books/handbook/partiv
showBookMenu: true
weight: 29
path: "/books/handbook/"
---

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