<?xml version="1.0" encoding="ISO-8859-7" standalone="no"?> <!-- Το Εγχειρίδιο του FreeBSD: DTrace The FreeBSD Greek Documentation Project $FreeBSD$ %SOURCE% en_US.ISO8859-1/books/handbook/dtrace/chapter.sgml %SRCID% 38826 --> <chapter id="dtrace"> <chapterinfo> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Γράφηκε από τον </contrib> </author> </authorgroup> </chapterinfo> <title>&dtrace;</title> <sect1 id="dtrace-synopsis"> <title>Σύνοψη</title> <indexterm><primary>&dtrace;</primary></indexterm> <indexterm> <primary>&dtrace; support</primary> <see>&dtrace;</see> </indexterm> <para>Το &dtrace;, γνωστό επίσης ως Dynamic Tracing, είναι ένα εργαλείο το οποίο αναπτύχθηκε από την &sun; για τον εντοπισμό προβλημάτων απόδοσης σε συστήματα που πρόκειται να χρησιμοποιηθούν ή χρησιμοποιούνται ήδη στην παραγωγή. Δεν πρόκειται για εργαλείο αποσφαλμάτωσης, αλλά για εργαλείο ανάλυσης πραγματικού χρόνου, με το οποίο μπορούν να εντοπιστούν προβλήματα απόδοσης και άλλες καταστάσεις.</para> <para>Το &dtrace; είναι ένα θαυμάσιο εργαλείο profiling και διαθέτει εντυπωσιακό πλήθος χαρακτηριστικών για την διάγνωση προβλημάτων του συστήματος. Μπορεί επίσης να χρησιμοποιηθεί για να εκτελέσει από πριν έτοιμα scripts, με τα οποία μπορείτε να εκμεταλλευθείτε καλύτερα τις δυνατότητες του. Οι χρήστες μπορούν ακόμα να γράψουν και τα δικά τους βοηθητικά προγράμματα, χρησιμοποιώντας την Γλώσσα D που παρέχει το &dtrace;, και να προσαρμόσουν με αυτό τον τρόπο το profiling στις δικές τους ανάγκες.</para> <para>Αφού διαβάσετε αυτό το κεφάλαιο, θα γνωρίζετε:</para> <itemizedlist> <listitem> <para>Τι είναι το &dtrace; και τι δυνατότητες παρέχει.</para> </listitem> <listitem> <para>Τις διαφορές υλοποίησης μεταξύ του &dtrace; του &solaris; και του &os;.</para> </listitem> <listitem> <para>Πως να ενεργοποιήσετε και να χρησιμοποιήσετε το &dtrace; στο &os;.</para> </listitem> </itemizedlist> <para>Πριν διαβάσετε αυτό το κεφάλαιο, θα πρέπει:</para> <itemizedlist> <listitem> <para>Να κατανοείτε βασικές έννοιες του &unix; και του &os; (<xref linkend="basics"/>).</para> </listitem> <listitem> <para>Να είστε εξοικειωμένος με τις βασικές διαδικασίες ρύθμισης και μεταγλώττισης προσαρμοσμένου πυρήνα (<xref linkend="kernelconfig"/>).</para> </listitem> <listitem> <para>Να είστε εξοικειωμένος με την ασφάλεια και τον τρόπο που αυτή σχετίζεται με το &os; (<xref linkend="security"/>).</para> </listitem> <listitem> <para>Να κατανοείτε πως μπορείτε να ανακτήσετε τον πηγαίο κώδικα του &os; και να τον χρησιμοποιήσετε ώστε να επαναμεταγλωττίσετε το σύστημα σας (<xref linkend="updating-upgrading"/>).</para> </listitem> </itemizedlist> <!-- Temporary warning to avoid listing experimental versions and production versions of FreeBSD with this technology. --> <warning> <para>Τη δεδομένη στιγμή, το &dtrace; θεωρείται ότι είναι σε πειραματικό στάδιο. Ορισμένες επιλογές μπορεί να υπολείπονται σε λειτουργικότητα, και κάποια τμήματα ίσως να μη λειτουργούν καθόλου. Με την πάροδο του χρόνου, οι παραπάνω δυνατότητες θα θεωρηθούν έτοιμες για χρήση σε μηχανήματα παραγωγής, και η παρούσα τεκμηρίωση θα ανανεωθεί ώστε να αντιπροσωπεύει αυτή την κατάσταση.</para> </warning> </sect1> <sect1 id="dtrace-implementation"> <title>Διαφορές στην Υλοποίηση</title> <para>Αν και το &dtrace; στο &os; είναι αρκετά όμοιο με αυτό του &solaris;, υπάρχουν κάποιες διαφορές που θα πρέπει να τις εξηγήσουμε πριν συνεχίσουμε. Η μεγαλύτερη διαφορά που θα παρατηρήσουν οι χρήστες, είναι ότι στο &os; το &dtrace; πρέπει να ενεργοποιηθεί χειροκίνητα. Υπάρχουν διάφορες επιλογές και αρθρώματα για τον πυρήνα που πρέπει να ενεργοποιηθούν ώστε το &dtrace; να λειτουργεί σωστά. Θα εξηγήσουμε αργότερα αυτές τις ρυθμίσεις.</para> <para>Η επιλογή <literal>DDB_CTF</literal> του πυρήνα χρησιμοποιείται για να ενεργοποιήσει την υποστήριξη φορτώματος των δεδομένων <acronym>CTF</acronym> από τον πυρήνα και τα αρθρώματα του. Το <acronym>CTF</acronym> είναι το Compact C Type format του &solaris;, το οποίο ενθυλακώνει μια ελαττωμένη μορφή πληροφοριών αποσφαλμάτωσης (debugging), όμοια με το <acronym>DWARF</acronym> και τα stabs. Αυτά τα δεδομένα <acronym>CTF</acronym> προστίθενται στα εκτελέσιμα μέσω των εργαλείων <command>ctfconvert</command> και <command>ctfmerge</command>. Το βοηθητικό πρόγραμμα <command>ctfconvert</command> ερμηνεύει τα τμήματα των <acronym>DWARF</acronym> <acronym>ELF</acronym> που περιέχουν πληροφορίες debug (δημιουργούνται από το μεταγλωττιστή), και το <command>ctfmerge</command> συγχωνεύει τα τμήματα <acronym>CTF</acronym> και <acronym>ELF</acronym> από τα αντικείμενα σε άλλα εκτελέσιμα ή κοινόχρηστες βιβλιοθήκες. Περισσότερες πληροφορίες για την ενεργοποίηση των παραπάνω στη μεταγλώττιση του πυρήνα και του συστήματος του &os;, θα δούμε παρακάτω.</para> <para>Στο &os; κάποιοι παροχείς είναι διαφορετικοί σε σχέση με το &solaris;. Ο πιο αξιοσημείωτος είναι ο παροχέας <literal>dtmalloc</literal> ο οποίος επιτρέπει το tracing του <function>malloc()</function> ανάλογα με τον τύπο του, στον πυρήνα του &os;.</para> <para>Μόνο ο <username>root</username> μπορεί να χρησιμοποιήσει το &dtrace; στο &os;. Αυτό σχετίζεται με διαφορές στην ασφάλεια, καθώς το &solaris; διαθέτει κάποιους ελέγχους ασφάλειας χαμηλού επιπέδου, οι οποίοι δεν υπάρχουν ακόμα στο &os;. Για το λόγο αυτό, η χρήση της συσκευής <devicename>/dev/dtrace/dtrace</devicename> απαγορεύεται αυστηρά για όλους τους χρήστες εκτός από τον <username>root</username>.</para> <para>Τέλος, το λογισμικό &dtrace; βρίσκεται υπό την άδεια <acronym>CDDL</acronym> της &sun;. Μπορείτε να διαβάσετε το κείμενο της άδειας <literal>Common Development and Distribution License</literal> στο &os;, στο αρχείο <filename>/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE</filename> ή να το διαβάσετε online στη διεύθυνση <ulink url="http://www.opensolaris.org/os/licensing">http://www.opensolaris.org/os/licensing</ulink>.</para> <para>Η άδεια ουσιαστικά σημαίνει ότι ένας πυρήνας &os; με τις επιλογές του &dtrace;, εξακολουθεί να βρίσκεται υπό την άδεια <acronym>BSD</acronym>. Ωστόσο το <acronym>CDDL</acronym> εμπλέκεται τη στιγμή που γίνεται διανομή των αρθρωμάτων σε δυαδική μορφή, ή τη στιγμή που φορτώνονται.</para> </sect1> <sect1 id="dtrace-enable"> <title>Ενεργοποίηση της Υποστήριξης &dtrace;</title> <para>Για να ενεργοποιήσετε την υποστήριξη για το &dtrace;, προσθέστε τις ακόλουθες γραμμές στο αρχείο ρυθμίσεων του πυρήνα:</para> <programlisting>options KDTRACE_HOOKS options DDB_CTF</programlisting> <note> <para>Οι χρήστες της αρχιτεκτονικής AMD64 θα θέλουν να προσθέσουν την ακόλουθη γραμμή στο αρχείο ρυθμίσεων του πυρήνα τους:</para> <programlisting>options KDTRACE_FRAME</programlisting> <para>Η επιλογή αυτή παρέχει υποστήριξη για τη λειτουργία <acronym>FBT</acronym>. Το &dtrace; μπορεί να λειτουργήσει και χωρίς αυτήν. Ωστόσο, θα παρέχει περιορισμένη υποστήριξη για function boundary tracing.</para> </note> <para>Όλος ο πηγαίος κώδικας θα πρέπει να μεταγλωττιστεί ξανά με τις επιλογές <acronym>CTF</acronym>. Για να γίνει αυτό, μεταγλωττίστε ξανά το &os; χρησιμοποιώντας:</para> <!-- XXXTR: WITH_CTF has been reported to leave a user with a broken system when used with buildworld. Until this is fixed, comment out those parts. When uncommenting, kill the extra screen. --> <screen>&prompt.root; <userinput>cd /usr/src</userinput> <!-- &prompt.root; <userinput>make WITH_CTF=1 buildworld</userinput>--> &prompt.root; <userinput>make WITH_CTF=1 kernel</userinput></screen> <!-- &prompt.root; <userinput>make WITH_CTF=1 installworld</userinput> &prompt.root; <userinput>mergemaster -Ui</userinput></screen> --> <para>Θα χρειαστεί να επανεκκινήσετε το σύστημα.</para> <para>Μετά την επανεκκίνηση, και με τον νέο πυρήνα φορτωμένο πλέον στη μνήμη, θα πρέπει να προσθέσετε υποστήριξη για το κέλυφος Korn. Αυτό απαιτείται, καθώς τα εργαλεία &dtrace; περιλαμβάνουν διάφορα βοηθητικά προγράμματα τα οποία είναι γραμμένα σε <command>ksh</command>. Εγκαταστήστε το port <filename role="package">shells/ksh93</filename>. Μπορείτε επίσης να εκτελέσετε αυτά τα εργαλεία και μέσω του <filename role="package">shells/pdksh</filename> ή του <filename role="package">shells/mksh</filename>.</para> <para>Τέλος, ανακτήστε την τρέχουσα σειρά εργαλείων &dtrace;. Η τελευταία έκδοση διατίθεται στην τοποθεσία <ulink url="http://www.opensolaris.org/os/community/dtrace/dtracetoolkit/"></ulink>. Διατίθεται και πρόγραμμα εγκατάστασης, το οποίο δεν είναι ωστόσο απαραίτητο να εκτελέσετε προκειμένου να χρησιμοποιήσετε τα εργαλεία.</para> </sect1> <sect1 id="dtrace-using"> <title>Χρησιμοποιώντας το &dtrace;</title> <para>Πριν χρησιμοποιήσετε τις λειτουργίες του &dtrace;, θα πρέπει να υπάρχει η αντίστοιχη συσκευή. Για να φορτώσετε τη συσκευή, θα πρέπει να δώσετε την παρακάτω εντολή:</para> <screen>&prompt.root; <userinput>kldload dtraceall</userinput></screen> <para>Θα πρέπει να έχετε πλέον υποστήριξη &dtrace;. Για να δείτε όλα τα probes, θα πρέπει να εκτελέσετε ως διαχειριστής την παρακάτω εντολή:</para> <screen>&prompt.root; <userinput>dtrace -l | more</userinput></screen> <para>Όλη η έξοδος περνάει μέσω του βοηθητικού προγράμματος <command>more</command>, διαφορετικά γρήγορα θα υπερχείλιζε την προσωρινή μνήμη της οθόνης. Στο σημείο αυτό, θα πρέπει να θεωρηθεί ότι το &dtrace; λειτουργεί. Είναι πλέον ώρα να εξετάσουμε αυτή τη σειρά εργαλείων.</para> <para>Η σειρά των εργαλείων είναι μια συλλογή από έτοιμα scripts που εκτελούνται με το &dtrace; ώστε να συλλέξουν πληροφορίες σχετικά με το σύστημα. Υπάρχουν scripts που ελέγχουν για ανοικτά αρχεία, τη μνήμη, τη χρήση της <acronym>CPU</acronym> και πολλά ακόμα. Κάντε εξαγωγή των scripts με την ακόλουθη εντολή:</para> <screen>&prompt.root; <userinput>gunzip -c DTraceToolkit* | tar xvf -</userinput></screen> <para>Μετακινηθείτε στον κατάλογο που τα αποσυμπιέσατε με την εντολή <command>cd</command> και αλλάξτε τα δικαιώματα εκτέλεσης σε όλα τα αρχεία, όπως στα αρχεία με τα μικρά γράμματα, σε <literal>755</literal>.</para> <para>Θα χρειαστεί να γίνουν αλλαγές στο περιεχόμενο σε όλα τα scripts. Όσα περιέχουν το <filename>/usr/bin/ksh</filename> θα πρέπει να αλλαχθούν σε <filename>/usr/local/bin/ksh</filename>, τα άλλα που περιέχουν το <filename>/usr/bin/sh</filename> θα πρέπει να αλλαχθούν σε <filename>/bin/sh</filename>, και τέλος αυτά που περιέχουν το <filename>/usr/bin/perl</filename> θα πρέπει να αλλαχθούν σε <filename>/usr/local/bin/perl</filename>.</para> <important> <para>Στο σημείο αυτό είναι σημαντικό να υπενθυμίσουμε στον αναγνώστη ότι η υποστήριξη &dtrace; στο &os; είναι <emphasis>ατελής</emphasis> και πειραματική. Πολλά από αυτά τα scripts δεν θα λειτουργήσουν, καθώς είναι είτε πολύ προσανατολισμένα στο &solaris;, ή χρησιμοποιούν probes τα οποία δεν υποστηρίζονται τη δεδομένη στιγμή.</para> </important> <para>Τη στιγμή που γράφονται αυτές οι γραμμές, μόνο δύο scripts από τη σειρά εργαλείων του &dtrace; υποστηρίζονται πλήρως στο &os;: το <filename>hotkernel</filename> και το <filename>procsystime</filename>. Αυτά τα δύο θα εξερευνήσουμε στα επόμενα τμήματα αυτής της ενότητας.</para> <para>Το <filename>hotkernel</filename> έχει σχεδιαστεί να αναγνωρίζει ποια συνάρτηση καταναλώνει το μεγαλύτερο χρόνο στον πυρήνα. Εκτελώντας το υπό κανονικές συνθήκες, θα δείτε έξοδο παρόμοια με την παρακάτω:</para> <screen>&prompt.root; <userinput>./hotkernel</userinput> Sampling... Hit Ctrl-C to end.</screen> <para>Ο διαχειριστής του συστήματος θα πρέπει να χρησιμοποιήσει το συνδυασμό πλήκτρων <keycombo action="simul"><keycap>Ctrl</keycap><keycap>C</keycap></keycombo> για να σταματήσει τη διεργασία. Με τον τερματισμό του, το script θα απεικονίσει μια σειρά από συναρτήσεις του πυρήνα και πληροφορίες σχετικά με το χρόνο τους, ταξινομώντας τις σε αύξουσα σειρά ανάλογα με το χρόνο:</para> <screen>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%</screen> <!-- XXXTR: I attempted to use objdump and nm on /boot/kernel/kernel to find 0xc10981a5, but to no avail. It would be nice to know how we should look that up. --> <para>Το script αυτό λειτουργεί επίσης με αρθρώματα του πυρήνα. Για να χρησιμοποιήσετε αυτό το χαρακτηριστικό, εκτελέστε το με την επιλογή <option>-m</option>:</para> <screen>&prompt.root; <userinput>./hotkernel -m</userinput> 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%</screen> <!-- XXXTR: I was unable to match these up with output from kldstat and kldstat -v and grep. Maybe I'm missing something seriously obvious. It is 5AM btw. --> <para>Το <filename>procsystime</filename> script συλλαμβάνει και τυπώνει τον χρόνο των κλήσεων συστήματος για μια συγκεκριμένη διεργασία μέσω του <acronym>PID</acronym> ή του ονόματος της. Στο παρακάτω παράδειγμα έχουμε ξεκινήσει μια νέα διεργασία του <filename>/bin/csh</filename>. Εκτελέσαμε το <filename>procsystime</filename> και το αφήσαμε στην αναμονή καθώς γράφαμε μερικές εντολές στο <command>csh</command> που είχαμε ανοίξει. Αυτά είναι τα αποτελέσματα της δοκιμής μας:</para> <screen>&prompt.root; <userinput>./procsystime -n csh</userinput> 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</screen> <para>Όπως φαίνεται, η κλήση του συστήματος για ανάγνωση (<function>read()</function>) είναι αυτή που καταναλώνει τον περισσότερο χρόνο σε νανοδευτερόλεπτα, ενώ το λιγότερο τον καταναλώνει η κλήση συστήματος <function>getpid()</function>.</para> </sect1> <sect1 id="dtrace-language"> <title>Η Γλώσσα D</title> <para>Η σειρά εργαλείων &dtrace;, περιλαμβάνει αρκετά scripts γραμμένα στην ειδική γλώσσα του &dtrace;. Η γλώσσα αυτή ονομάζεται <quote>η γλώσσα D</quote> στην τεκμηρίωση της &sun;, και είναι αρκετά όμοια με τη C++. Αναλυτική περιγραφή αυτής της γλώσσας είναι πέρα από τους σκοπούς αυτού του κειμένου. Υπάρχει ενεργή συζήτηση σχετικά με αυτή, στη διεύθυνση <ulink url="http://wikis.sun.com/display/DTrace/Documentation"></ulink>.</para> </sect1> </chapter>