&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. Implementatieverschillen Hoewel &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; aanzetten Voeg de volgende regels toe aan het kernelinstellingenbestand om ondersteuning voor &dtrace; aan te zetten: options KDTRACE_HOOKS options DDB_CTF Gebruikers van de AMD64-architectuur zullen de volgende regel aan hun kernelinstellingenbestand willen toevoegen: 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 &os;-broncode herbouwd met: &prompt.root; cd /usr/src &prompt.root; 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 &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; 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: &prompt.root; kldload dtraceall Ondersteuning van &dtrace; zou nu beschikbaar moeten zijn. De beheerder kan het volgende commando uitvoeren om alle sondes te bekijken: &prompt.root; 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: &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 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. 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;, 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.