<?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>