Time

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Mesure du temps d'exécution
Commande time (builtin) / /usr/bin/time (externe)
Contexte Diagnostiquer la durée, la charge CPU et la consommation mémoire d'une commande
Voir aussi Perf (profilage plus fin)

time mesure le temps d'exécution d'une commande. Il existe en réalité deux commandes distinctes portant ce nom : un builtin du shell (bash, zsh...) et un exécutable séparé /usr/bin/time, aux options et au comportement différents — notamment pour rediriger leur sortie.

Le builtin du shell

Sous bash, time est un mot-clé du shell, pas un exécutable. Il s'utilise devant n'importe quelle commande ou bloc de commandes :

time rm -rf /folder/bar && mkdir -p /folder/bar

time ./script.sh

# mesurer plusieurs commandes enchaînées : les grouper dans un bloc { ; }
time { rm -rf /folder/bar && mkdir -p /folder/bar; echo "done"; }

Le builtin écrit son résultat sur la sortie d'erreur du shell, en dehors du flux normal de la commande chronométrée. Rediriger la sortie de la commande ne capture donc pas le résultat de time : il faut grouper dans un bloc et rediriger le bloc entier.

# ne capture PAS le temps mesuré (seule la sortie de script.sh va dans out.log)
time ./script.sh > out.log 2>&1

# capture le temps mesuré : le bloc entier est redirigé
{ time ./script.sh; } > out.log 2>&1

/usr/bin/time : la commande externe

/usr/bin/time est un vrai exécutable (paquet time sur Debian/RHEL, souvent absent par défaut). Contrairement au builtin, sa sortie peut être redirigée normalement puisqu'il s'agit d'un process comme un autre, et il dispose d'une option -o pour écrire directement dans un fichier :

/usr/bin/time ./script.sh 2> timing.log

/usr/bin/time -o timing.log ./script.sh

/usr/bin/time -a -o timing.log ./script.sh   # -a : ajoute (append) au lieu d'écraser

⚠️ Si time tape directement sur le builtin du shell, il faut appeler le chemin complet /usr/bin/time (ou \time) pour utiliser la version externe.

Comprendre real / user / sys

Les deux commandes affichent les trois mêmes mesures, avec un sens souvent confondu :

  • real : le temps d'horloge murale (wall clock) écoulé du début à la fin — inclut les attentes I/O, réseau, et le temps passé à attendre d'autres processus sur le CPU.
  • user : le temps CPU passé en code utilisateur par le process (et ses enfants) — hors noyau.
  • sys : le temps CPU passé dans le noyau pour le compte du process (appels système, gestion mémoire, I/O...).

user + sys peut dépasser real sur une machine multi-cœurs (travail parallélisé sur plusieurs CPU), et peut aussi être bien inférieur à real si la commande passe le plus clair de son temps à attendre (I/O disque, réseau, sleep).

/usr/bin/time -v : statistiques détaillées

L'option -v (verbose) de la commande externe donne un rapport bien plus complet que real/user/sys : mémoire maximale utilisée, nombre de page faults, opérations d'entrée/ sortie disque, changements de contexte...

/usr/bin/time -v ./script.sh

Extrait typique de sortie :

	Command being timed: "./script.sh"
	User time (seconds): 12.34
	System time (seconds): 1.02
	Percent of CPU this job got: 187%
	Elapsed (wall clock) time (h:mm:ss or m:ss): 0:07.13
	Maximum resident set size (kbytes): 245760
	Major (requiring I/O) page faults: 3
	Minor (reclaiming a frame) page faults: 58421
	Voluntary context switches: 142
	Involuntary context switches: 891
	File system inputs: 1024
	File system outputs: 512

Champs les plus utiles en pratique :

  • Maximum resident set size : pic de mémoire physique réellement utilisée (RSS) — utile pour dimensionner une limite de mémoire cgroup/Docker.
  • Major page faults : pages qui ont dû être rechargées depuis le disque (swap ou fichier) — un nombre élevé indique une pression mémoire ou un swap actif.
  • Minor page faults : pages allouées sans I/O disque (normal et généralement sans incidence, à la différence des major faults).
  • File system inputs/outputs : volume d'I/O disque bloc effectué par la commande.

Voir aussi

  • Perf — profilage CPU plus fin (échantillonnage, compteurs matériels)