25.4. DTrace gebruiken
Terug | Hoofdstuk 25. DTrace | Volgende

## 25.4. DTrace gebruiken

Voordat er gebruik wordt gemaakt van de functionaliteit van DTrace, moet het DTrace-apparaat bestaan. Geef het volgende commando om het apparaat te laten:

    # kldload dtraceall

Ondersteuning van DTrace zou nu beschikbaar moeten zijn. De beheerder kan het volgende commando uitvoeren om alle sondes te bekijken:

    # dtrace -l | more

Alle uitvoer wordt aan het hulpmiddel `more` doorgegeven omdat het snel de schermbuffer zal laten overstromen. DTrace kan nu als werkend worden beschouwd. Het is nu tijd om de gereedschapskist te bekijken.

De gereedschapskist is een verzameling van kant-en-klare scripts die met DTrace gedraaid kunnen worden om informatie over het systeem te verzamelen. Er zijn scripts om open bestanden, geheugen, CPU-gebruik, en nog veel meer te controleren. Pak de scripts uit met het volgende commando:

    # gunzip -c DTraceToolkit* | tar xvf -

Ga naar die map met `cd` en zet de uitvoerpermissies voor alle bestanden waarvan de naam uit kleine letters bestaat, op `755`.

De inhoud van al deze scripts moet veranderd worden. Degenen die naar `/usr/bin/ksh` verwijzen dienen naar `/usr/local/bin/ksh` te verwijzen, de anderen die `/usr/bin/sh` gebruiken dienen gewijzigd te worden om `/bin/sh` te gebruiken, en tenslotte dienen degenen die `/usr/bin/perl` gebruiken veranderd te worden om `/usr/local/bin/perl` te gebruiken.

### Belangrijk:

Op dit moment is het voorzichtig om de lezer eraan te herinneren dat de ondersteuning voor DTrace in FreeBSD niet compleet en experimenteel is. Veel van deze scripts zullen niet werken omdat ze of te Solaris™-specifiek zijn of omdat ze sondes gebruiken die momenteel niet ondersteund worden.

Op het moment van schrijven worden slechts twee scripts van de DTrace Toolkit volledig ondersteund in FreeBSD: de scripts `hotkernel` en `procsystime`. Dit zijn de twee die we in de volgende gedeelten van deze sectie zullen bekijken.

De `hotkernel` is ontworpen om te identificeren welke functie de meeste kerneltijd gebruikt. Als het normaal gedraaid wordt, zal het uitvoer die op de volgende lijkt produceren:

    # cd /usr/share/dtrace/toolkit
    # ./hotkernel
    Sampling... Hit Ctrl-C to end.

De systeembeheerder moet de toetsencombinatie Ctrl+C gebruiken om het proces te stoppen. Nadat het gestopt is, zal het script een lijst van kernelfuncties en timinginformatie weergeven, waarbij de uitvoer in volgorde van toenemende tijd is gesorteerd:

    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%

Het script werkt ook met kernelmodules. Draai het script met de vlag `-m` om deze mogelijkheid te gebruiken:

    # ./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%

Het script `procsystime` vangt en beeldt het tijdsgebruik van systeemaanroepen af voor een gegeven PID of procesnaam. In het volgende voorbeeld wordt er een nieuwe instantie van `/bin/csh` gedraaid. Het `procsystime` werd uitgevoerd en bleef wachten terwijl er enkele commando's op de andere instantie van `csh` werden getypt. Dit zijn de resultaten van deze test:

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

Zoals te zien is, lijkt de systeemaanroep `read()` de meeste tijd in nanoseconden te gebruiken en gebruikte de systeemaanroep `getpid()` de minste hoeveelheid tijd.

Terug | Omhoog | Volgende
25.3. Ondersteuning voor DTrace aanzetten | Begin | 25.5. De taal D