TomRhodesΓράφηκε από τον &dtrace;Σύνοψη&dtrace;&dtrace; support&dtrace;Το &dtrace;, γνωστό επίσης ως Dynamic Tracing, είναι ένα εργαλείο το
οποίο αναπτύχθηκε από την &sun; για τον εντοπισμό προβλημάτων απόδοσης
σε συστήματα που πρόκειται να χρησιμοποιηθούν ή χρησιμοποιούνται ήδη
στην παραγωγή. Δεν πρόκειται για εργαλείο αποσφαλμάτωσης, αλλά για
εργαλείο ανάλυσης πραγματικού χρόνου, με το οποίο μπορούν να
εντοπιστούν προβλήματα απόδοσης και άλλες καταστάσεις.Το &dtrace; είναι ένα θαυμάσιο εργαλείο profiling και διαθέτει
εντυπωσιακό πλήθος χαρακτηριστικών για την διάγνωση προβλημάτων του
συστήματος. Μπορεί επίσης να χρησιμοποιηθεί για να εκτελέσει από πριν
έτοιμα scripts, με τα οποία μπορείτε να εκμεταλλευθείτε καλύτερα τις
δυνατότητες του. Οι χρήστες μπορούν ακόμα να γράψουν και τα δικά τους
βοηθητικά προγράμματα, χρησιμοποιώντας την Γλώσσα D που παρέχει το
&dtrace;, και να προσαρμόσουν με αυτό τον τρόπο το profiling στις δικές
τους ανάγκες.Αφού διαβάσετε αυτό το κεφάλαιο, θα γνωρίζετε:Τι είναι το &dtrace; και τι δυνατότητες παρέχει.Τις διαφορές υλοποίησης μεταξύ του &dtrace; του &solaris; και
του &os;.Πως να ενεργοποιήσετε και να χρησιμοποιήσετε το &dtrace;
στο &os;.Πριν διαβάσετε αυτό το κεφάλαιο, θα πρέπει:Να κατανοείτε βασικές έννοιες του &unix; και του &os;
().Να είστε εξοικειωμένος με τις βασικές διαδικασίες ρύθμισης και
μεταγλώττισης προσαρμοσμένου πυρήνα
().Να είστε εξοικειωμένος με την ασφάλεια και τον τρόπο που αυτή
σχετίζεται με το &os; ().Να κατανοείτε πως μπορείτε να ανακτήσετε τον πηγαίο κώδικα του
&os; και να τον χρησιμοποιήσετε ώστε να επαναμεταγλωττίσετε το
σύστημα σας ().Τη δεδομένη στιγμή, το &dtrace; θεωρείται ότι είναι σε πειραματικό
στάδιο. Ορισμένες επιλογές μπορεί να υπολείπονται σε λειτουργικότητα,
και κάποια τμήματα ίσως να μη λειτουργούν καθόλου. Με την πάροδο του
χρόνου, οι παραπάνω δυνατότητες θα θεωρηθούν έτοιμες για χρήση σε
μηχανήματα παραγωγής, και η παρούσα τεκμηρίωση θα ανανεωθεί ώστε να
αντιπροσωπεύει αυτή την κατάσταση.Διαφορές στην ΥλοποίησηΑν και το &dtrace; στο &os; είναι αρκετά όμοιο με αυτό του &solaris;,
υπάρχουν κάποιες διαφορές που θα πρέπει να τις εξηγήσουμε πριν
συνεχίσουμε. Η μεγαλύτερη διαφορά που θα παρατηρήσουν οι χρήστες,
είναι ότι στο &os; το &dtrace; πρέπει να ενεργοποιηθεί χειροκίνητα.
Υπάρχουν διάφορες επιλογές και αρθρώματα για τον πυρήνα που πρέπει να
ενεργοποιηθούν ώστε το &dtrace; να λειτουργεί σωστά. Θα εξηγήσουμε
αργότερα αυτές τις ρυθμίσεις.Η επιλογή DDB_CTF του πυρήνα χρησιμοποιείται για
να ενεργοποιήσει την υποστήριξη φορτώματος των δεδομένων
CTF από τον πυρήνα και τα αρθρώματα του. Το
CTF είναι το Compact C Type format του &solaris;,
το οποίο ενθυλακώνει μια ελαττωμένη μορφή πληροφοριών αποσφαλμάτωσης
(debugging), όμοια με το DWARF και τα
stabs. Αυτά τα δεδομένα CTF προστίθενται στα
εκτελέσιμα μέσω των εργαλείων ctfconvert και
ctfmerge. Το βοηθητικό πρόγραμμα
ctfconvert ερμηνεύει τα τμήματα των
DWARF ELF που περιέχουν
πληροφορίες debug (δημιουργούνται από το μεταγλωττιστή), και
το ctfmerge συγχωνεύει τα
τμήματα CTF και ELF από τα
αντικείμενα σε άλλα εκτελέσιμα ή κοινόχρηστες βιβλιοθήκες.
Περισσότερες πληροφορίες για την ενεργοποίηση των παραπάνω στη
μεταγλώττιση του πυρήνα και του συστήματος του &os;, θα δούμε
παρακάτω.Στο &os; κάποιοι παροχείς είναι διαφορετικοί σε σχέση με το
&solaris;. Ο πιο αξιοσημείωτος είναι ο παροχέας
dtmalloc ο οποίος επιτρέπει το tracing του
malloc() ανάλογα με τον τύπο του, στον πυρήνα του
&os;.Μόνο ο root μπορεί να χρησιμοποιήσει το
&dtrace; στο &os;. Αυτό σχετίζεται με διαφορές στην ασφάλεια, καθώς το
&solaris; διαθέτει κάποιους ελέγχους ασφάλειας χαμηλού επιπέδου, οι
οποίοι δεν υπάρχουν ακόμα στο &os;. Για το λόγο αυτό, η χρήση της
συσκευής /dev/dtrace/dtrace απαγορεύεται
αυστηρά για όλους τους χρήστες εκτός από τον
root.Τέλος, το λογισμικό &dtrace; βρίσκεται υπό την άδεια
CDDL της &sun;. Μπορείτε να διαβάσετε το κείμενο
της άδειας Common Development and Distribution
License στο &os;, στο αρχείο
/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE
ή να το διαβάσετε online στη διεύθυνση
http://www.opensolaris.org/os/licensing.Η άδεια ουσιαστικά σημαίνει ότι ένας πυρήνας &os; με τις επιλογές
του &dtrace;, εξακολουθεί να βρίσκεται υπό την άδεια
BSD. Ωστόσο το CDDL εμπλέκεται
τη στιγμή που γίνεται διανομή των αρθρωμάτων σε δυαδική μορφή, ή τη
στιγμή που φορτώνονται.Ενεργοποίηση της Υποστήριξης &dtrace;Για να ενεργοποιήσετε την υποστήριξη για το &dtrace;, προσθέστε τις
ακόλουθες γραμμές στο αρχείο ρυθμίσεων του πυρήνα:options KDTRACE_HOOKS
options DDB_CTFΟι χρήστες της αρχιτεκτονικής AMD64 θα θέλουν να προσθέσουν την
ακόλουθη γραμμή στο αρχείο ρυθμίσεων του πυρήνα τους:options KDTRACE_FRAMEΗ επιλογή αυτή παρέχει υποστήριξη για τη λειτουργία
FBT. Το &dtrace; μπορεί να λειτουργήσει και χωρίς
αυτήν. Ωστόσο, θα παρέχει περιορισμένη υποστήριξη για
function boundary tracing.Όλος ο πηγαίος κώδικας θα πρέπει να μεταγλωττιστεί ξανά με τις
επιλογές CTF. Για να γίνει αυτό, μεταγλωττίστε
ξανά το &os; χρησιμοποιώντας:&prompt.root; cd /usr/src
&prompt.root; make WITH_CTF=1 kernelΘα χρειαστεί να επανεκκινήσετε το σύστημα.Μετά την επανεκκίνηση, και με τον νέο πυρήνα φορτωμένο πλέον στη
μνήμη, θα πρέπει να προσθέσετε υποστήριξη για το κέλυφος Korn. Αυτό
απαιτείται, καθώς τα εργαλεία &dtrace; περιλαμβάνουν διάφορα βοηθητικά
προγράμματα τα οποία είναι γραμμένα σε
ksh. Εγκαταστήστε το port
shells/ksh93. Μπορείτε επίσης να
εκτελέσετε αυτά τα εργαλεία και μέσω του
shells/pdksh ή του
shells/mksh.Τέλος, ανακτήστε την τρέχουσα σειρά εργαλείων &dtrace;. Η τελευταία
έκδοση διατίθεται στην τοποθεσία
.
Διατίθεται και πρόγραμμα εγκατάστασης, το οποίο δεν είναι ωστόσο
απαραίτητο να εκτελέσετε προκειμένου να χρησιμοποιήσετε τα
εργαλεία.Χρησιμοποιώντας το &dtrace;Πριν χρησιμοποιήσετε τις λειτουργίες του &dtrace;, θα πρέπει να
υπάρχει η αντίστοιχη συσκευή. Για να φορτώσετε τη συσκευή, θα πρέπει
να δώσετε την παρακάτω εντολή:&prompt.root; kldload dtraceallΘα πρέπει να έχετε πλέον υποστήριξη &dtrace;. Για να δείτε όλα τα
probes, θα πρέπει να εκτελέσετε ως διαχειριστής την παρακάτω
εντολή:&prompt.root; dtrace -l | moreΌλη η έξοδος περνάει μέσω του βοηθητικού προγράμματος
more, διαφορετικά γρήγορα θα υπερχείλιζε την
προσωρινή μνήμη της οθόνης. Στο σημείο αυτό, θα πρέπει να θεωρηθεί ότι
το &dtrace; λειτουργεί. Είναι πλέον ώρα να εξετάσουμε αυτή τη σειρά
εργαλείων.Η σειρά των εργαλείων είναι μια συλλογή από έτοιμα scripts που
εκτελούνται με το &dtrace; ώστε να συλλέξουν πληροφορίες σχετικά με το
σύστημα. Υπάρχουν scripts που ελέγχουν για ανοικτά αρχεία, τη μνήμη,
τη χρήση της CPU και πολλά ακόμα. Κάντε εξαγωγή των
scripts με την ακόλουθη εντολή:&prompt.root; gunzip -c DTraceToolkit* | tar xvf -Μετακινηθείτε στον κατάλογο που τα αποσυμπιέσατε με την εντολή
cd και αλλάξτε τα δικαιώματα εκτέλεσης σε όλα τα
αρχεία, όπως στα αρχεία με τα μικρά γράμματα, σε
755.Θα χρειαστεί να γίνουν αλλαγές στο περιεχόμενο σε όλα τα scripts.
Όσα περιέχουν το
/usr/bin/ksh θα πρέπει να αλλαχθούν σε
/usr/local/bin/ksh, τα άλλα που περιέχουν το
/usr/bin/sh θα πρέπει να αλλαχθούν σε
/bin/sh, και τέλος αυτά που περιέχουν το
/usr/bin/perl θα πρέπει να αλλαχθούν σε
/usr/local/bin/perl.Στο σημείο αυτό είναι σημαντικό να υπενθυμίσουμε στον αναγνώστη
ότι η υποστήριξη &dtrace; στο &os; είναι ατελής
και πειραματική. Πολλά από αυτά τα scripts δεν θα λειτουργήσουν,
καθώς είναι είτε πολύ προσανατολισμένα στο &solaris;, ή χρησιμοποιούν
probes τα οποία δεν υποστηρίζονται τη δεδομένη στιγμή.Τη στιγμή που γράφονται αυτές οι γραμμές, μόνο δύο scripts από τη
σειρά εργαλείων του &dtrace; υποστηρίζονται πλήρως στο &os;: το
hotkernel και το procsystime.
Αυτά τα δύο θα εξερευνήσουμε στα επόμενα τμήματα αυτής της
ενότητας.Το hotkernel έχει σχεδιαστεί να αναγνωρίζει
ποια συνάρτηση καταναλώνει το μεγαλύτερο χρόνο στον πυρήνα. Εκτελώντας
το υπό κανονικές συνθήκες, θα δείτε έξοδο παρόμοια με την
παρακάτω:&prompt.root; ./hotkernel
Sampling... Hit Ctrl-C to end.Ο διαχειριστής του συστήματος θα πρέπει να χρησιμοποιήσει το
συνδυασμό πλήκτρων CtrlC για
να σταματήσει τη διεργασία. Με τον τερματισμό του, το script θα
απεικονίσει μια σειρά από συναρτήσεις του πυρήνα και πληροφορίες σχετικά
με το χρόνο τους, ταξινομώντας τις σε αύξουσα σειρά ανάλογα με το
χρόνο: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%Το script αυτό λειτουργεί επίσης με αρθρώματα του πυρήνα. Για να
χρησιμοποιήσετε αυτό το χαρακτηριστικό, εκτελέστε το με την επιλογή
:&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%Το procsystime script συλλαμβάνει και τυπώνει
τον χρόνο των κλήσεων συστήματος για μια συγκεκριμένη διεργασία μέσω
του PID ή του ονόματος της. Στο παρακάτω παράδειγμα
έχουμε ξεκινήσει μια νέα διεργασία του /bin/csh.
Εκτελέσαμε το procsystime και το αφήσαμε στην
αναμονή καθώς γράφαμε μερικές εντολές στο csh που
είχαμε ανοίξει. Αυτά είναι τα αποτελέσματα της δοκιμής μας:&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Όπως φαίνεται, η κλήση του συστήματος για ανάγνωση
(read()) είναι αυτή που καταναλώνει τον
περισσότερο χρόνο σε νανοδευτερόλεπτα, ενώ το λιγότερο τον καταναλώνει
η κλήση συστήματος getpid().Η Γλώσσα DΗ σειρά εργαλείων &dtrace;, περιλαμβάνει αρκετά scripts γραμμένα στην
ειδική γλώσσα του &dtrace;. Η γλώσσα αυτή ονομάζεται
η γλώσσα D στην τεκμηρίωση της &sun;, και είναι αρκετά
όμοια με τη C++. Αναλυτική περιγραφή αυτής της γλώσσας είναι πέρα από
τους σκοπούς αυτού του κειμένου. Υπάρχει ενεργή συζήτηση σχετικά με
αυτή, στη διεύθυνση .