Guide d'administration système : Gestion des ressources des conteneurs et des zones Oracle Solaris

Chapitre 5 Administration de la comptabilisation étendue (tâches)

Ce chapitre décrit comment gérer le sous-système de comptabilisation étendue.

Pour avoir un aperçu du sous-système de comptabilisation étendue, reportez-vous au Chapitre 4Comptabilisation étendue (présentation).

Administration de l'utilitaire de comptabilisation étendue (liste des tâches)

Tâche 

Description 

Voir 

Activer l'utilitaire de comptabilisation étendue 

Servez-vous de la comptabilisation étendue pour gérer l'utilisation des ressources par chaque projet en cours d'exécution sur votre système. Vous pouvez tirer parti du sous-système de comptabilisation étendue pour capturer des données d'historique pour les tâches, les processus et les flux.

Activation de la comptabilisation étendue pour les processus, les tâches et les flux, Activation de la comptabilisation étendue à l'aide d'un script de démarrage

Afficher l'état de la comptabilisation étendue 

Déterminez l'état de l'utilitaire de comptabilisation étendue. 

Affichage de l'état de la comptabilisation étendue

Afficher les ressources de comptabilisation disponibles 

Affichez les ressources de comptabilisation disponibles sur votre système. 

Affichage des ressources de comptabilisation disponibles

Désactiver l'utilitaire de comptabilisation des processus, des tâches et des flux 

Désactivez la fonction de comptabilisation étendue. 

Désactivation de la comptabilisation des processus, des tâches et des flux

Utiliser l'interface Perl pour tirer parti de l'utilitaire de comptabilisation étendue 

Servez-vous de l'interface Perl pour développer des scripts de génération de rapports et d'extraction personnalisés. 

Utilisation de l'interface Perl pour accéder à libexacct

Utilisation de la fonctionnalité de comptabilisation étendue

Les utilisateurs peuvent gérer la comptabilisation étendue (démarrer la comptabilisation, l'arrêter et modifier ses paramètres de configuration) s'ils disposent d'un profil avec droits correspondants au type de comptabilisation étendue à gérer :

ProcedureActivation de la comptabilisation étendue pour les processus, les tâches et les flux

Pour activer l'utilitaire de comptabilisation étendue pour les processus, les tâches et les flux, servez-vous de la commande acctadm. Le paramètre final facultatif pour acctadm indique si la commande doit s'appliquer aux composants de comptabilisation des processus, des tâches système ou des flux de l'utilitaire.

  1. Connectez-vous en tant que superutilisateur ou prenez un rôle équivalent.

    Les rôles contiennent des autorisations et des commandes privilégiées. Pour plus d'informations au sujet des rôles, reportez-vous à la section Using the Solaris Management Tools With RBAC (Task Map) du System Administration Guide: Basic Administration.

  2. Activez la comptabilisation étendue pour les processus.


    # acctadm -e extended -f /var/adm/exacct/proc process
    
  3. Activez la comptabilisation étendue pour les tâches.


    # acctadm -e extended,mstate -f /var/adm/exacct/task task
    
  4. Activez la comptabilisation étendue pour les flux.


    # acctadm -e extended -f /var/adm/exacct/flow flow
    
Voir aussi

Pour plus d'informations, voir acctadm(1M).

Activation de la comptabilisation étendue à l'aide d'un script de démarrage

Il est possible d'activer la comptabilisation étendue de façon continue en associant le script /etc/init.d/acctadm à /etc/rc2.d.


# ln -s /etc/init.d/acctadm /etc/rc2.d/Snacctadm
# ln -s /etc/init.d/acctadm /etc/rc2.d/Knacctadm

La variable n est remplacée par un nombre.

Vous devez activer manuellement la comptabilisation étendue au moins une fois pour effectuer la configuration.

Pour plus d'informations au sujet de la configuration de la comptabilisation, reportez-vous à la section Configuration de la comptabilisation étendue.

Affichage de l'état de la comptabilisation étendue

Entrez acctadm sans argument pour afficher l'état actuel de l'utilitaire de comptabilisation étendue.


# acctadm
                 Task accounting: active
            Task accounting file: /var/adm/exacct/task
          Tracked task resources: extended
        Untracked task resources: none
              Process accounting: active
         Process accounting file: /var/adm/exacct/proc
       Tracked process resources: extended
     Untracked process resources: host
                 Flow accounting: active
            Flow accounting file: /var/adm/exacct/flow
          Tracked flow resources: extended
        Untracked flow resources: none

Dans l'exemple précédent, la comptabilisation des tâches système est active en mode étendu et en mode mstate. La comptabilisation des processus et des flux est active en mode étendu.


Remarque –

Dans le cadre de la comptabilisation étendue, microstate (mstate) fait référence aux données étendues (associées aux transitions de processus microstate) disponibles dans le fichier d'utilisation de processus (voir la page de manuel proc(4)). Ces données permettent d'obtenir un plus grand nombre de détails au sujet des activités du processus que les enregistrements de base ou étendus.


Affichage des ressources de comptabilisation disponibles

Les ressources disponibles peuvent varier d'un système à un autre et d'une plate-forme à une autre. Exécutez la commande acctadm avec l'option -r pour afficher les groupes de ressources de comptabilisation de votre système.


# acctadm -r
process:
extended pid,uid,gid,cpu,time,command,tty,projid,taskid,ancpid,wait-status,zone,flag,
memory,mstatedisplays as one line
basic    pid,uid,gid,cpu,time,command,tty,flag
task:
extended taskid,projid,cpu,time,host,mstate,anctaskid,zone
basic    taskid,projid,cpu,time
flow:
extended 
saddr,daddr,sport,dport,proto,dsfield,nbytes,npkts,action,ctime,lseen,projid,uid
basic    saddr,daddr,sport,dport,proto,nbytes,npkts,action

ProcedureDésactivation de la comptabilisation des processus, des tâches et des flux

Pour désactiver la comptabilisation des processus, des tâches et des flux, désactivez chacun de ces éléments en exécutant la commande acctadm avec l'option -x.

  1. Connectez-vous en tant que superutilisateur ou prenez un rôle équivalent.

    Les rôles contiennent des autorisations et des commandes privilégiées. Pour plus d'informations au sujet des rôles, reportez-vous à la section Using the Solaris Management Tools With RBAC (Task Map) du System Administration Guide: Basic Administration.

  2. Désactivez la comptabilisation des processus.


    # acctadm -x process 
    
  3. Désactivez la comptabilisation des tâches.


    # acctadm -x task
    
  4. Désactivez la comptabilisation des flux.


    # acctadm -x flow
    
  5. Assurez-vous que la fonction de comptabilisation a été désactivée pour l'ensemble des éléments.


    	# acctadm
                Task accounting: inactive
           Task accounting file: none
         Tracked task resources: extended
       Untracked task resources: none
             Process accounting: inactive
        Process accounting file: none
      Tracked process resources: extended
    Untracked process resources: host
                Flow accounting: inactive
           Flow accounting file: none
         Tracked flow resources: extended
       Untracked flow resources: none

Utilisation de l'interface Perl pour accéder à libexacct

Affichage récursif du contenu d'un objet exacct

Servez-vous du code suivant pour afficher de façon récursive le contenu d'un objet exacct . Notez que cette fonctionnalité est assurée par la bibliothèque en tant que fonction Sun::Solaris::Exacct::Object::dump(). Elle est également disponible par le biais de la fonction de convenance ea_dump_object().


sub dump_object
     {
             my ($obj, $indent) = @_;
             my $istr = '  ' x $indent;

             #
             # Retrieve the catalog tag.  Because we are 
             # doing this in an array context, the
             # catalog tag will be returned as a (type, catalog, id) 
             # triplet, where each member of the triplet will behave as 
             # an integer or a string, depending on context.
             # If instead this next line provided a scalar context, e.g.
             #    my $cat  = $obj->catalog()->value();
             # then $cat would be set to the integer value of the 
             # catalog tag.
             #
             my @cat = $obj->catalog()->value();

             #
             # If the object is a plain item
             #
             if ($obj->type() == &EO_ITEM) {
                     #
                     # Note: The '%s' formats provide s string context, so
                     # the components of the catalog tag will be displayed
                     # as the symbolic values. If we changed the '%s'
                     # formats to '%d', the numeric value of the components
                     # would be displayed.
                     #
                     printf("%sITEM\n%s  Catalog = %s|%s|%s\n", 
                        $istr, $istr, @cat);
                     $indent++;

                     #
                     # Retrieve the value of the item.  If the item contains
                     # in turn a nested exacct object (i.e., an item or
                     # group),then the value method will return a reference
                     # to the appropriate sort of perl object
                     # (Exacct::Object::Item or Exacct::Object::Group).
                     # We could of course figure out that the item contained
                     # a nested item orgroup by examining the catalog tag in
                     # @cat and looking for a type of EXT_EXACCT_OBJECT or
                     # EXT_GROUP.
                     #
                     my $val = $obj->value();
                     if (ref($val)) {
                             # If it is a nested object, recurse to dump it.
                             dump_object($val, $indent);
                     } else {
                             # Otherwise it is just a 'plain' value, so
                             # display it.
                             printf("%s  Value = %s\n", $istr, $val);
                     }

             #
             # Otherwise we know we are dealing with a group.  Groups
             # represent contents as a perl list or array (depending on
             # context), so we can process the contents of the group
             # with a 'foreach' loop, which provides a list context.
             # In a list context the value method returns the content
             # of the group as a perl list, which is the quickest
             # mechanism, but doesn't allow the group to be modified.
             # If we wanted to modify the contents of the group we could
             # do so like this:
             #    my $grp = $obj->value();   # Returns an array reference
             #    $grp->[0] = $newitem;
             # but accessing the group elements this way is much slower.
             #
             } else {
                     printf("%sGROUP\n%s  Catalog = %s|%s|%s\n",
                         $istr, $istr, @cat);
                     $indent++;
                     # 'foreach' provides a list context.
                     foreach my $val ($obj->value()) {
                             dump_object($val, $indent);
                     }
                     printf("%sENDGROUP\n", $istr);
             }
     }

Création et écriture d'un enregistrement de groupe dans un fichier

Servez-vous de ce script pour définir un nouvel enregistrement de groupe et l'écrire dans un fichier appelé /tmp/exacct.


#!/usr/bin/perl

use strict;
use warnings;
use Sun::Solaris::Exacct qw(:EXACCT_ALL);
# Prototype list of catalog tags and values.
     my @items = (
             [ &EXT_STRING | &EXC_DEFAULT | &EXD_CREATOR      => "me"       ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_PID     => $$         ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_UID     => $<         ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_GID     => $(         ],
             [ &EXT_STRING | &EXC_DEFAULT | &EXD_PROC_COMMAND => "/bin/rec" ],
     );

     # Create a new group catalog object.
     my $cat = ea_new_catalog(&EXT_GROUP | &EXC_DEFAULT | &EXD_NONE)

     # Create a new Group object and retrieve its data array.
     my $group = ea_new_group($cat);
     my $ary = $group->value();

     # Push the new Items onto the Group array.
     foreach my $v (@items) {
             push(@$ary, ea_new_item(ea_new_catalog($v->[0]), $v->[1]));
     }

     # Open the exacct file, write the record & close.
     my $f = ea_new_file('/tmp/exacct', &O_RDWR | &O_CREAT | &O_TRUNC)
        || die("create /tmp/exacct failed: ", ea_error_str(), "\n");
     $f->write($group);
     $f = undef;

Affichage du contenu d'un fichier exacct

Servez-vous du code Perl suivant pour afficher le contenu d'un fichier exacct.


#!/usr/bin/perl

     use strict;
     use warnings;
     use Sun::Solaris::Exacct qw(:EXACCT_ALL);

     die("Usage is dumpexacct <exacct file>\n") unless (@ARGV == 1);

     # Open the exact file and display the header information.
     my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str());
     printf("Creator:  %s\n", $ef->creator());
     printf("Hostname: %s\n\n", $ef->hostname());

     # Dump the file contents
     while (my $obj = $ef->get()) {
             ea_dump_object($obj);
     }

     # Report any errors
     if (ea_error() != EXR_OK && ea_error() != EXR_EOF)  {
             printf("\nERROR: %s\n", ea_error_str());
             exit(1);
     }
     exit(0);

Exemple de sortie de Sun::Solaris::Exacct::Object->dump()

Voici un exemple de la sortie obtenue en appliquant Sun::Solaris::Exacct::Object->dump() au fichier créé dans la section Création et écriture d'un enregistrement de groupe dans un fichier.


Creator:  root
Hostname: localhost
GROUP
       Catalog = EXT_GROUP|EXC_DEFAULT|EXD_NONE
       ITEM
         Catalog = EXT_STRING|EXC_DEFAULT|EXD_CREATOR
         Value = me
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_PID
         Value = 845523
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_UID
         Value = 37845
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_GID
         Value = 10
       ITEM
         Catalog = EXT_STRING|EXC_DEFAULT|EXD_PROC_COMMAND
         Value = /bin/rec
ENDGROUP