Εγχειρίδιο του FreeBSD
Προηγ | Κεφάλαιο 26 DTrace | Επόμενο

# 26.4 Χρησιμοποιώντας το DTrace

Πριν χρησιμοποιήσετε τις λειτουργίες του DTrace, θα πρέπει να υπάρχει η αντίστοιχη συσκευή. Για να φορτώσετε τη συσκευή, θα πρέπει να δώσετε την παρακάτω εντολή:

    # kldload dtraceall

Θα πρέπει να έχετε πλέον υποστήριξη DTrace. Για να δείτε όλα τα probes, θα πρέπει να εκτελέσετε ως διαχειριστής την παρακάτω εντολή:

    # dtrace -l | more

Όλη η έξοδος περνάει μέσω του βοηθητικού προγράμματος `more`, διαφορετικά γρήγορα θα υπερχείλιζε την προσωρινή μνήμη της οθόνης. Στο σημείο αυτό, θα πρέπει να θεωρηθεί ότι το DTrace λειτουργεί. Είναι πλέον ώρα να εξετάσουμε αυτή τη σειρά εργαλείων.

Η σειρά των εργαλείων είναι μια συλλογή από έτοιμα scripts που εκτελούνται με το DTrace ώστε να συλλέξουν πληροφορίες σχετικά με το σύστημα. Υπάρχουν scripts που ελέγχουν για ανοικτά αρχεία, τη μνήμη, τη χρήση της CPU και πολλά ακόμα. Κάντε εξαγωγή των scripts με την ακόλουθη εντολή:

    # 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 στο FreeBSD είναι ατελής και πειραματική. Πολλά από αυτά τα scripts δεν θα λειτουργήσουν, καθώς είναι είτε πολύ προσανατολισμένα στο Solaris", ή χρησιμοποιούν probes τα οποία δεν υποστηρίζονται τη δεδομένη στιγμή.

Τη στιγμή που γράφονται αυτές οι γραμμές, μόνο δύο scripts από τη σειρά εργαλείων του DTrace υποστηρίζονται πλήρως στο FreeBSD: το `hotkernel` και το `procsystime`. Αυτά τα δύο θα εξερευνήσουμε στα επόμενα τμήματα αυτής της ενότητας.

Το `hotkernel` έχει σχεδιαστεί να αναγνωρίζει ποια συνάρτηση καταναλώνει το μεγαλύτερο χρόνο στον πυρήνα. Εκτελώντας το υπό κανονικές συνθήκες, θα δείτε έξοδο παρόμοια με την παρακάτω:

    # ./hotkernel
    Sampling... Hit Ctrl-C to end.

Ο διαχειριστής του συστήματος θα πρέπει να χρησιμοποιήσει το συνδυασμό πλήκτρων Ctrl+C για να σταματήσει τη διεργασία. Με τον τερματισμό του, το 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 αυτό λειτουργεί επίσης με αρθρώματα του πυρήνα. Για να χρησιμοποιήσετε αυτό το χαρακτηριστικό, εκτελέστε το με την επιλογή `-m`:

    # ./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` που είχαμε ανοίξει. Αυτά είναι τα αποτελέσματα της δοκιμής μας:

    # ./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()`.

Προηγ | Αρχή | Επόμενο
Ενεργοποίηση της Υποστήριξης DTrace | Πάνω | Η Γλώσσα D

Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την τεκμηρίωση πριν να επικοινωνήσετε με την <questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην <doc@FreeBSD.org>.