---
title: Hoofdstuk 25. DTrace
part: Deel III. Systeembeheer
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]]
== Overzicht

DTrace, ook bekend als Dynamic Tracing, was ontwikkeld door Sun(TM) als een gereedschap om prestatie-bottlenecks in productie- en preproductiesystemen op te sporen. Het is in geen enkel opzicht een debug-gereedschap, maar een gereedschap voor real-time analyse om prestatie- en andere zaken op te sporen.

DTrace is een opmerkelijk profileringsgereedschap, met een indrukwekkende verzameling mogelijkheden om systeemzaken te diagnosticeren. Het kan ook worden gebruikt om vooraf geschreven scripts te draaien om zo voordeel te halen uit de mogelijkheden. Gebruikers kunnen zelfs hun eigen middelen schrijven door gebruik te maken van de DTrace D Language, wat ze in staat stelt om hun profilering aan te passen aan hun specifieke behoeften.

Na het lezen van dit hoofdstuk weet u:

* Wat DTrace is en welke mogelijkheden het biedt.
* De verschillen tussen de DTrace-implementatie van Solaris(TM) en degene die door FreeBSD wordt aangeboden.
* Hoe DTrace op FreeBSD aan te zetten en te gebruiken.

Voordat u dit hoofdstuk leest, dient u:

* De beginselen van UNIX(R) en FreeBSD te begrijpen (crossref:basics[basics,UNIX® beginselen]).
* Bekend te zijn met de beginselen van kernelconfiguratie en -compilatie (crossref:kernelconfig[kernelconfig,De FreeBSD-kernel instellen]).
* Wat bekendheid te hebben met beveiliging en hoe het zich verhoudt tot FreeBSD (crossref:security[security,Beveiliging]).
* Te begrijpen hoe de broncode van FreeBSD te verkrijgen en te herbouwen (crossref:cutting-edge[updating-upgrading,FreeBSD updaten en upgraden]).

[WARNING]
====

Deze mogelijkheid wordt als experimenteel beschouwd. Van sommige opties kan er functionaliteit ontbreken, andere delen kunnen in het geheel niet werken. In de loop der tijd zal deze mogelijkheid als productierijp worden beschouwd en zal deze documentatie worden aangepast om die situatie te representeren.
====

[[dtrace-implementation]]
== Implementatieverschillen

Hoewel DTrace in FreeBSD erg lijkt op degene die in Solaris(TM) zit, zijn er verschillen die uitgelegd moeten worden voordat er verder wordt gegaan. Het primaire verschil dat gebruikers zullen zien is dat DTrace specifiek moet worden aangezet op FreeBSD. Er zijn kernelopties en modulen die aangezet moeten worden om DTrace juist te laten werken. Deze zullen later worden uitgelegd.

Er is een kerneloptie `DDB_CTF` die gebruikt wordt om ondersteuning voor het laden van CTF-gegevens van kernelmodulen en de kernel zelf. CTF is het Compact C Type Format van Solaris(TM) welke een beperkte vorm van debuginformatie bevat die vergelijkbaar is met DWARF en de befaamde stabs. Deze CTF-gegevens worden door de bouwmiddelen `ctfconvert` en `ctfmerge` aan de binairen toegevoegd. Het hulpmiddel `ctfconvert` parseert DWARFELF-debug-secties die door de compiler zijn aangemaakt en `ctfmerge` voegt CTFELF-secties van objecten samen in hun executables of gedeelde bibliotheken. Meer informatie over hoe dit voor de bouw van de kernel en FreeBSD aan te zetten komt eraan.

Sommige aanbieders voor FreeBSD verschillen van die voor Solaris(TM). De meest opmerkelijke is de aanbieder `dtmalloc`, welke het volgen van `malloc()` op soort in de FreeBSD-kernel toestaat.

Alleen `root` mag DTrace op FreeBSD gebruiken. Dit heeft te maken met beveiligingsverschillen, Solaris(TM) heeft enkele beveiligingscontroles op laag niveau die nog niet bestaan in FreeBSD. Hierom is [.filename]#/dev/dtrace/dtrace# strikt beperkt tot `root`.

Tenslotte valt de DTrace-software onder de CDDL-licentie van Sun(TM). De `Common Development and Distribution License` wordt bij FreeBSD geleverd, zie [.filename]#/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE# of bekijk het online op http://www.opensolaris.org/os/licensing[http://www.opensolaris.org/os/licensing].

Deze licentie houdt in dat een FreeBSD-kernel met de DTrace-opties nog steeds onder de BSD-licentie valt; de CDDL komt echter op de proppen wanneer de modulen in binaire vorm worden verspreid, of wanneer de binairen zijn geladen.

[[dtrace-enable]]
== Ondersteuning voor DTrace aanzetten

Voeg de volgende regels toe aan het kernelinstellingenbestand om ondersteuning voor DTrace aan te zetten:

[.programlisting]
....
options         KDTRACE_HOOKS
options         DDB_CTF
....

[NOTE]
====
Gebruikers van de AMD64-architectuur zullen de volgende regel aan hun kernelinstellingenbestand willen toevoegen:

[.programlisting]
....
options         KDTRACE_FRAME
....

Deze optie biedt ondersteuning voor de mogelijkheid FBT. DTrace zal zonder deze optie werken; er zal echter beperkte ondersteuning zijn voor het volgen van functiegrenzen.
====

Alle broncode moet herbouwd en geherinstalleerd worden met de CTF-opties. Om deze taak te volbrengen, wordt de FreeBSD-broncode herbouwd met:

[source,shell]
....
# cd /usr/src

# make WITH_CTF=1 kernel
....

Het systeem moet opnieuw gestart worden.

Nadat opnieuw is opgestart en de nieuwe kernel in het geheugen is geladen, dient ondersteuning voor de Korn-shell te worden toegevoegd. Dit is nodig omdat de verschillende hulpmiddelen van DTraceToolkit in `ksh` zijn geschreven. Installeer package:shells/ksh93[]. Het is ook mogelijk om deze hulpmiddelen in package:shells/pdksh[] of package:shells/mksh[] te draaien.

Als laatste dient de huidige DTraceToolkit verkregen te worden. Indien u FreeBSD 10 draait, vindt u de DTraceToolkit in [.filename]#/usr/shared/dtrace#. In andere gevallen kunt u de DTraceToolkit installeren via de port package:sysutils/dtrace-toolkit[].

[[dtrace-using]]
== 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:

[source,shell]
....
# kldload dtraceall
....

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

[source,shell]
....
# 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:

[source,shell]
....
# 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 [.filename]#/usr/bin/ksh# verwijzen dienen naar [.filename]#/usr/local/bin/ksh# te verwijzen, de anderen die [.filename]#/usr/bin/sh# gebruiken dienen gewijzigd te worden om [.filename]#/bin/sh# te gebruiken, en tenslotte dienen degenen die [.filename]#/usr/bin/perl# gebruiken veranderd te worden om [.filename]#/usr/local/bin/perl# te gebruiken.

[IMPORTANT]
====
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(TM)-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 [.filename]#hotkernel# en [.filename]#procsystime#. Dit zijn de twee die we in de volgende gedeelten van deze sectie zullen bekijken.

De [.filename]#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:

[source,shell]
....
# cd /usr/shared/dtrace/toolkit
# ./hotkernel
Sampling... Hit Ctrl-C to end.
....

De systeembeheerder moet de toetsencombinatie kbd:[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:

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

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

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

Het script [.filename]#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 [.filename]#/bin/csh# gedraaid. Het [.filename]#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:

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

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

[[dtrace-language]]
== De taal D

De DTrace-gereedschapskist bevat vele scripts in de speciale taal van DTrace. Deze taal wordt "de taal D" genoemd door de documentatie van Sun(TM), en lijkt sterk op C++. Een diepgaande discussie over de taal valt buiten het bereik van dit document. Het wordt uitgebreid behandeld op http://wikis.oracle.com/display/DTrace/Documentation[http://wikis.oracle.com/display/DTrace/Documentation].
