Il peut arriver que vous souhaitiez profiler votre programme sur des paramètres tels que :
- Temps pris par programme en mode utilisateur
- Temps pris par le programme en mode noyau
- Utilisation moyenne de la mémoire par le programme
- etc
Sous Linux, nous avons un utilitaire "time" spécialement conçu à cet effet. L'utilitaire "time" prend un nom de programme en entrée et affiche des informations sur les ressources utilisées par le programme. De plus, si la commande existe avec un statut différent de zéro, cet utilitaire affiche un message d'avertissement et un statut de sortie.
La syntaxe de 'time' est :
/usr/bin/time [options] program [arguments]
Dans la syntaxe ci-dessus, les "options" font référence à un ensemble d'indicateurs/valeurs facultatifs qui peuvent être transmis à l'utilitaire "time" pour activer ou désactiver une fonctionnalité particulière. Voici les options de commande de temps disponibles :
- -v, –verbose :cette option est transmise lorsqu'une description détaillée de la sortie est requise.
- –quite :cette option empêche l'utilitaire "time" de signaler l'état du programme.
- -f, –format :cette option permet à l'utilisateur de contrôler le format de sortie de l'utilitaire "time".
- -p, –portability :cette option définit le format de sortie suivant pour rendre la sortie conforme à POSIX
real %e user %U sys %S
Lorsque la commande "time" est exécutée, voici le type de sortie qu'elle donne :
# /usr/bin/time ls anaconda-ks.cfg bin install.log install.log.syslog mbox 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3888maxresident)k 0inputs+0outputs (0major+304minor)pagefaults 0swaps
Comme nous pouvons le voir ci-dessus, outre l'exécution de la commande, les deux dernières lignes de la sortie sont les informations sur les ressources que la commande "time" affiche.
Remarque :Dans l'exemple ci-dessus, la commande "time" a été exécutée sans aucune option. Il s'agit donc d'une sortie par défaut générée par la commande "time", qui n'est pas formatée correctement.
Comme nous pouvons le voir sur la sortie, le format par défaut de la sortie générée est :
%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k %Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps
L'option Formater
Cette option permet à l'utilisateur de décider de la sortie générée par la commande "time". Dans la dernière section, nous avons discuté du format par défaut utilisé dans la sortie. Dans cette section, nous allons apprendre à spécifier des formats personnalisés.
La chaîne de format se compose généralement de "spécificateurs de ressources" entrecoupés de texte brut. Un signe de pourcentage (`%') dans la chaîne de format entraîne l'interprétation du caractère suivant comme un spécificateur de ressource.
Une barre oblique inverse (`\') introduit un `échappement antislash', qui est traduit en un seul caractère d'impression lors de la sortie. `\t' produit un caractère de tabulation, `\n' produit une nouvelle ligne et `\\' produit une barre oblique inverse. Une barre oblique inverse suivie d'un autre caractère génère un point d'interrogation ('?') suivi d'une barre oblique inverse, pour indiquer qu'un échappement par barre oblique inverse non valide a été donné.
Le reste du texte dans la chaîne de format est copié tel quel dans la sortie. time imprime toujours une nouvelle ligne après avoir imprimé les informations d'utilisation de la ressource, donc normalement les chaînes de format ne se terminent pas par un caractère de nouvelle ligne (ou `0).
Par exemple :
$ /usr/bin/time -f "\t%U user,\t%S system,\t%x status" date Sun Jan 22 17:46:58 IST 2012 0.00 user, 0.00 system, 0 status
Nous voyons donc que dans l'exemple ci-dessus, nous avons essayé de changer le format de sortie en utilisant un format de sortie différent.
Ressources
Puisque nous avons discuté ci-dessus que l'utilitaire "time" affiche des informations sur l'utilisation des ressources par un programme, dans cette section, répertorions les ressources qui peuvent être suivies par cet utilitaire et les spécificateurs correspondants.
Depuis la page de manuel :
- C :nom et arguments de ligne de commande de la commande en cours de temporisation.
- D :taille moyenne de la zone de données non partagées du processus, en kilo-octets.
- E – Temps réel écoulé (horloge murale) utilisé par le processus, en [heures :]minutes :secondes.
- F :nombre de défauts de page majeurs ou nécessitant des E/S qui se sont produits pendant l'exécution du processus. Ce sont des défauts où la page a effectivement migré hors de la mémoire principale.
- I – Nombre d'entrées du système de fichiers par le processus.
- K – Utilisation totale moyenne de la mémoire (données + pile + texte) du processus, en kilo-octets.
- M – Taille maximale de l'ensemble résident du processus pendant sa durée de vie, en kilo-octets.
- O – Nombre de sorties du système de fichiers par le processus.
- P – Pourcentage du processeur obtenu par cette tâche. Il s'agit simplement des temps utilisateur + système divisés par le temps d'exécution total. Il imprime également un signe de pourcentage.
- R – Nombre de défauts de page mineurs ou récupérables. Ce sont des pages qui ne sont pas valides (donc elles sont fautives) mais qui n'ont pas encore été revendiquées par d'autres pages virtuelles. Ainsi, les données de la page sont toujours valides mais les tables système doivent être mises à jour.
- S – Nombre total de secondes CPU utilisées par le système pour le compte du processus (en mode noyau), en secondes.
- U – Nombre total de secondes CPU utilisées directement par le processus (en mode utilisateur), en secondes.
- W – Nombre de fois où le processus a été extrait de la mémoire principale.
- X – Quantité moyenne de texte partagé dans le processus, en kilo-octets.
- Z – Taille de page du système, en octets. Il s'agit d'une constante par système, mais elle varie d'un système à l'autre.
- c – Nombre de fois que le processus a subi un changement de contexte involontaire (parce que la tranche de temps a expiré).
- e – Temps réel écoulé (horloge murale) utilisé par le processus, en secondes.
- k – Nombre de signaux transmis au processus.
- p – Taille moyenne de la pile non partagée du processus, en kilo-octets.
- r – Nombre de messages de socket reçus par le processus.
- s – Nombre de messages socket envoyés par le processus.
- t – Taille moyenne de l'ensemble résident du processus, en kilo-octets.
- w – Nombre de fois où le programme a été volontairement modifié en contexte, par exemple en attendant la fin d'une opération d'E/S.
- x – État de sortie de la commande.
Nous pouvons donc voir qu'il existe une longue liste de ressources dont l'utilisation peut être suivie par l'utilitaire "time".
Pourquoi /usr/bin/time ? (Au lieu de juste le temps)
N'utilisons pas /usr/bin/time et utilisons "time" à la place.
$ time -f "\t%U user,\t%S system,\t%x status" date -f: command not found real 0m0.255s user 0m0.230s sys 0m0.030s
Comme le montre la sortie ci-dessus, la commande 'time' lorsqu'elle est utilisée sans le chemin complet (/usr/bin/time) crache une erreur concernant le drapeau '-f'. De plus, le format de sortie n'est ni celui que nous avons spécifié dans la commande ni le format par défaut dont nous avons parlé précédemment. Cela a conduit à une confusion sur la façon dont cette sortie a été générée.
Lorsque la commande "time" est exécutée sans le chemin complet (/usr/bin/time), c'est la commande "time" intégrée du shell bash qui est exécutée.
- Utilisez « man time » pour afficher la page de manuel de /usr/bin/time
- Utilisez "help time" pour afficher les informations sur l'heure de bash intégrée.