&dtrace;TomRhodesGeschreven door RenéLadanVertaald door Overzicht&dtrace;&dtrace;-ondersteuning&dtrace;&dtrace;, ook bekend als Dynamic Tracing, was ontwikkeld door
&sun; 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; en degene die door &os; wordt aangeboden.Hoe &dtrace; op &os; aan te zetten en te gebruiken.Voordat u dit hoofdstuk leest, dient u:De beginselen van &unix; en &os; te begrijpen
().Bekend te zijn met de beginselen van kernelconfiguratie en
-compilatie ().Wat bekendheid te hebben met beveiliging en hoe het zich
verhoudt tot &os; ().Te begrijpen hoe de broncode van &os; te verkrijgen en te
herbouwen ().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.ImplementatieverschillenHoewel &dtrace; in &os; erg lijkt op degene die in &solaris;
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 &os;. 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; 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
DWARF ELF-debug-secties die
door de compiler zijn aangemaakt en ctfmerge
voegt CTF ELF-secties van
objecten samen in hun executables of gedeelde bibliotheken. Meer
informatie over hoe dit voor de bouw van de kernel en &os; aan te
zetten komt eraan.Sommige aanbieders voor &os; verschillen van die voor
&solaris;. De meest opmerkelijke is de aanbieder
dtmalloc, welke het volgen van
malloc() op soort in de &os;-kernel
toestaat.Alleen root mag &dtrace; op &os;
gebruiken. Dit heeft te maken met beveiligingsverschillen,
&solaris; heeft enkele beveiligingscontroles op laag niveau die
nog niet bestaan in &os;. Hierom is
/dev/dtrace/dtrace strikt beperkt tot
root.Tenslotte valt de &dtrace;-software onder de
CDDL-licentie van &sun;. De Common
Development and Distribution License wordt bij &os;
geleverd, zie
/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE
of bekijk het online op
http://www.opensolaris.org/os/licensing.Deze licentie houdt in dat een &os;-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.Ondersteuning voor &dtrace; aanzettenVoeg de volgende regels toe aan het kernelinstellingenbestand
om ondersteuning voor &dtrace; aan te zetten:options KDTRACE_HOOKS
options DDB_CTFGebruikers van de AMD64-architectuur zullen de volgende
regel aan hun kernelinstellingenbestand willen toevoegen:options KDTRACE_FRAMEDeze 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 &os;-broncode herbouwd met:&prompt.root; cd /usr/src
&prompt.root; make WITH_CTF=1 kernelHet 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
&dtrace;Toolkit in ksh zijn geschreven. Installeer
shells/ksh93. Het is ook
mogelijk om deze hulpmiddelen in shells/pdksh of shells/mksh te draaien.Als laatste dient de huidige &dtrace;Toolkit verkregen te worden.
Indien u &os; 10 draait, vindt u de &dtrace;Toolkit in
/usr/share/dtrace. In andere gevallen kunt u de
&dtrace;Toolkit installeren via de port sysutils/DTraceToolkit.&dtrace; gebruikenVoordat er gebruik wordt gemaakt van de functionaliteit van
&dtrace;, moet het &dtrace;-apparaat bestaan. Geef het volgende
commando om het apparaat te laten:&prompt.root; kldload dtraceallOndersteuning van &dtrace; zou nu beschikbaar moeten zijn. De
beheerder kan het volgende commando uitvoeren om alle sondes te
bekijken:&prompt.root; dtrace -l | moreAlle 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:&prompt.root; 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.Op dit moment is het voorzichtig om de lezer eraan te
herinneren dat de ondersteuning voor &dtrace; in &os;
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 &os;: 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:&prompt.root; cd /usr/share/dtrace/toolkit
&prompt.root; ./hotkernel
Sampling... Hit Ctrl-C to end.De systeembeheerder moet de toetsencombinatie CtrlC
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 om deze mogelijkheid te
gebruiken:&prompt.root; ./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:&prompt.root; ./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 3988049784Zoals te zien is, lijkt de systeemaanroep
read() de meeste tijd in nanoseconden te
gebruiken en gebruikte de systeemaanroep
getpid() de minste hoeveelheid tijd.De taal DDe &dtrace;-gereedschapskist bevat vele scripts in de speciale
taal van &dtrace;. Deze taal wordt de taal D
genoemd door de documentatie van &sun;, 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.