$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
Que signifient «réel», «utilisateur» et «sys» dans la sortie du temps?
Lequel est significatif lors de l'analyse comparative de mon application?
unix
time
benchmarking
rayryeng
la source
la source
time
, faites-le faire quelque chose qui prendra au moins une seconde.time
s'agit d'un mot-clé bash. Donc , frappeman time
est pas vous donner une page de manuel pour le bashtime
, plutôt il donne la page de manuel/usr/bin/time
. Cela m'a fait trébucher.Réponses:
Statistiques de temps de traitement réel, utilisateur et Sys
Une de ces choses n'est pas comme les autres. Réel fait référence au temps réel écoulé; L'utilisateur et Sys font référence au temps CPU utilisé uniquement par le processus.
Le temps réel est l'horloge murale - le temps du début à la fin de l'appel. Il s'agit de tout le temps écoulé, y compris les tranches de temps utilisées par d'autres processus et le temps que le processus passe bloqué (par exemple, s'il attend que les E / S se terminent).
Utilisateur est la quantité de temps CPU passé en code en mode utilisateur (en dehors du noyau) dans le processus. Il s'agit uniquement du temps CPU réel utilisé lors de l'exécution du processus. Les autres processus et le temps que le processus passe bloqué ne comptent pas dans ce chiffre.
Sys est la quantité de temps CPU passé dans le noyau au sein du processus. Cela signifie exécuter le temps CPU consacré aux appels système dans le noyau, par opposition au code de bibliothèque, qui s'exécute toujours dans l'espace utilisateur. Comme «utilisateur», il s'agit uniquement du temps CPU utilisé par le processus. Voir ci-dessous pour une brève description du mode noyau (également appelé mode «superviseur») et du mécanisme d'appel système.
User+Sys
vous dira combien de temps CPU réel votre processus a utilisé. Notez que cela concerne tous les processeurs, donc si le processus a plusieurs threads (et que ce processus s'exécute sur un ordinateur avec plus d'un processeur), il peut potentiellement dépasser le temps d'horloge murale signalé parReal
(ce qui se produit généralement). Notez que dans la sortie, ces chiffres incluent leUser
Sys
temps et l' heure de tous les processus enfants (et leurs descendants) ainsi que le moment où ils auraient pu être collectés, par exemple parwait(2)
ouwaitpid(2)
, bien que les appels système sous-jacents renvoient séparément les statistiques du processus et de ses enfants.Origine des statistiques rapportées par
time (1)
Les statistiques signalées par
time
sont recueillies à partir de divers appels système. «Utilisateur» et «Sys» proviennent dewait (2)
( POSIX ) outimes (2)
( POSIX ), selon le système particulier. «Réel» est calculé à partir des heures de début et de fin recueillies lors de l'gettimeofday (2)
appel. Selon la version du système, diverses autres statistiques telles que le nombre de changements de contexte peuvent également être collectées partime
.Sur une machine multiprocesseur, un processus multi-thread ou un processus forking enfants peut avoir un temps écoulé inférieur au temps CPU total - car différents threads ou processus peuvent s'exécuter en parallèle. De plus, les statistiques de temps rapportées proviennent de différentes origines, de sorte que les temps enregistrés pour des tâches très courtes peuvent être sujets à des erreurs d'arrondi, comme le montre l'exemple de l'affiche originale.
Une brève introduction sur le mode noyau vs utilisateur
Sous Unix, ou tout système d'exploitation à mémoire protégée, le mode «noyau» ou «superviseur» fait référence à un mode privilégié dans lequel le processeur peut fonctionner. Certaines actions privilégiées qui pourraient affecter la sécurité ou la stabilité ne peuvent être effectuées que lorsque le processeur fonctionne en ce mode; ces actions ne sont pas disponibles pour le code d'application. Un exemple d'une telle action pourrait être la manipulation de la MMU pour accéder à l'espace d'adressage d'un autre processus. Normalement, le code en mode utilisateur ne peut pas faire cela (pour une bonne raison), bien qu'il puisse demander de la mémoire partagée au noyau, ce qui pourraitêtre lu ou écrit par plus d'un processus. Dans ce cas, la mémoire partagée est explicitement demandée au noyau via un mécanisme sécurisé et les deux processus doivent s'y attacher explicitement afin de l'utiliser.
Le mode privilégié est généralement appelé mode «noyau» car le noyau est exécuté par le processeur fonctionnant dans ce mode. Pour passer en mode noyau , vous devez donner une instruction spécifique (souvent appelé un piège ) qui passe la CPU à l' exécution en mode noyau et exécute le code à partir d' un emplacement spécifique tenu dans une table de saut. Pour des raisons de sécurité, vous ne pouvez pas basculer en mode noyau et exécuter du code arbitraire - les interruptions sont gérées via une table d'adresses qui ne peuvent pas être écrites à moins que le CPU ne s'exécute en mode superviseur. Vous interceptez avec un numéro d'interruption explicite et l'adresse est recherchée dans la table de saut; le noyau a un nombre fini de points d'entrée contrôlés.
Les appels «système» de la bibliothèque C (en particulier ceux décrits dans la section 2 des pages de manuel) ont un composant en mode utilisateur, qui est ce que vous appelez réellement à partir de votre programme C. Dans les coulisses, ils peuvent émettre un ou plusieurs appels système vers le noyau pour effectuer des services spécifiques tels que les E / S, mais ils ont également du code exécuté en mode utilisateur. Il est également tout à fait possible d'émettre directement une interruption en mode noyau à partir de n'importe quel code d'espace utilisateur si vous le souhaitez, bien que vous deviez peut-être écrire un extrait de langage assembleur pour configurer correctement les registres pour l'appel.
En savoir plus sur 'sys'
Il y a des choses que votre code ne peut pas faire à partir du mode utilisateur - des choses comme l'allocation de mémoire ou l'accès au matériel (disque dur, réseau, etc.). Ceux-ci sont sous la supervision du noyau, et lui seul peut les faire. Certaines opérations comme
malloc
oufread
/fwrite
invoqueront ces fonctions du noyau et compteront alors comme du temps «sys». Malheureusement, ce n'est pas aussi simple que "chaque appel à malloc sera compté en temps" sys ". L'appel àmalloc
fera un traitement de son propre chef (toujours compté dans le temps «utilisateur»), puis quelque part en cours, il peut appeler la fonction dans le noyau (compté dans le temps «sys»). Après être revenu de l'appel du noyau, il y aura un peu plus de temps dans «utilisateur», puismalloc
reviendra à votre code. Quant au moment où le changement se produit, et combien il est dépensé en mode noyau ... vous ne pouvez pas dire. Cela dépend de l'implémentation de la bibliothèque. En outre, d'autres fonctions apparemment innocentes pourraient également utilisermalloc
et similaires en arrière-plan, qui auront alors encore du temps dans «sys».la source
Pour développer la réponse acceptée , je voulais juste fournir une autre raison pour laquelle
real
≠user
+sys
.Gardez à l'esprit que cela
real
représente le temps réel écoulé, tandisuser
que lessys
valeurs et représentent le temps d'exécution du processeur. Par conséquent, sur un système multicœur, l' heureuser
et / ou lesys
temps (ainsi que leur somme) peuvent réellement dépasser le temps réel. Par exemple, sur une application Java que je lance pour la classe, j'obtiens cet ensemble de valeurs:la source
real
dépassementuser
et dusys
total? Les frais généraux du système d'exploitation tels que le changement de contexte de thread peuvent être?• réel : le temps réel passé à exécuter le processus du début à la fin, comme s'il était mesuré par un humain avec un chronomètre
• utilisateur : le temps cumulé passé par tous les CPU pendant le calcul
• sys : temps cumulé passé par tous les CPU pendant les tâches liées au système telles que l'allocation de mémoire.
la source
sys
le temps CPU est-il consacré aux appels système (et aux gestionnaires de défauts de page?)real
est souvent décrit comme le temps "horloge murale".Exemples POSIX C exécutables au minimum
Pour rendre les choses plus concrètes, je veux illustrer quelques cas extrêmes de
time
quelques programmes de test C minimum.Tous les programmes peuvent être compilés et exécutés avec:
et ont été testés dans Ubuntu 18.10, GCC 8.2.0, glibc 2.28, noyau Linux 4.18, ordinateur portable ThinkPad P51, CPU Intel Core i7-7820HQ (4 cœurs / 8 threads), 2x RAM Samsung M471A2K43BB1-CRC (2x 16GiB).
dormir
Sommeil non occupé ne compte pas dans les deux
user
ousys
seulementreal
.Par exemple, un programme qui dort une seconde:
GitHub en amont .
génère quelque chose comme:
Il en va de même pour les programmes bloqués lorsque les entrées-sorties deviennent disponibles.
Par exemple, le programme suivant attend que l'utilisateur entre un caractère et appuyez sur Entrée:
GitHub en amont .
Et si vous attendez environ une seconde, il produit exactement comme l'exemple de sommeil quelque chose comme:
Pour cette raison, vous
time
pouvez faire la distinction entre les programmes liés au processeur et aux E / S: que signifient les termes "lié au processeur" et "lié aux E / S"?Plusieurs threads
L'exemple suivant effectue des
niters
itérations de travaux inutiles purement liés au processeur sur lesnthreads
threads:GitHub en amont + code de tracé .
Ensuite, nous traçons wall, user et sys en fonction du nombre de threads pour une itération fixe de 10 ^ 10 sur mon 8 CPU hyperthread:
Tracer des données .
Du graphique, nous voyons que:
pour une application monocœur gourmande en CPU, le mur et l'utilisateur sont à peu près les mêmes
pour 2 cœurs, l'utilisateur est environ 2x mur, ce qui signifie que le temps de l'utilisateur est compté sur tous les threads.
l'utilisateur a pratiquement doublé, et le mur est resté le même.
cela continue jusqu'à 8 threads, ce qui correspond à mon nombre d'hyperthreads dans mon ordinateur.
Après 8, le mur commence également à augmenter, car nous n'avons pas de CPU supplémentaires pour mettre plus de travail dans un laps de temps donné!
Le ratio plateaux à ce stade.
Notez que ce graphique n'est clair et simple que parce que le travail est purement lié au processeur: s'il était lié à la mémoire, nous obtiendrions une baisse des performances beaucoup plus tôt avec moins de cœurs car les accès à la mémoire seraient un goulot d'étranglement, comme indiqué dans What signifient les termes «lié au processeur» et «lié aux E / S»?
Sys travail lourd avec
sendfile
La charge de travail sys la plus lourde que j'ai pu trouver était d'utiliser le
sendfile
, qui effectue une opération de copie de fichiers sur l'espace du noyau: Copiez un fichier de manière saine, sûre et efficaceJ'ai donc imaginé que ce noyau
memcpy
serait une opération gourmande en CPU.D'abord, j'initialise un grand fichier aléatoire de 10 Go avec:
Exécutez ensuite le code:
GitHub en amont .
ce qui donne essentiellement du temps système comme prévu:
J'étais également curieux de voir si cela
time
ferait la distinction entre les appels système de différents processus, alors j'ai essayé:Et le résultat a été:
Le temps sys est à peu près le même pour les deux que pour un seul processus, mais le temps du mur est plus grand car les processus sont probablement en concurrence pour l'accès en lecture sur disque.
Il semble donc que cela explique en fait quel processus a démarré un travail de noyau donné.
Code source Bash
Lorsque vous ne faites que
time <cmd>
sur Ubuntu, il utilise le mot-clé Bash comme on peut le voir sur:qui génère:
Nous avons donc grep source dans le code source Bash 4.19 pour la chaîne de sortie:
ce qui nous amène à la fonction execute_cmd.c
time_command
, qui utilise:gettimeofday()
etgetrusage()
si les deux sont disponiblestimes()
autrementqui sont tous des appels système Linux et des fonctions POSIX .
Code source de GNU Coreutils
Si nous l'appelons comme:
puis il utilise l'implémentation GNU Coreutils.
Celui-ci est un peu plus complexe, mais la source pertinente semble être à resuse.c et il le fait:
wait3
appel BSD non POSIX s'il est disponibletimes
etgettimeofday
sinonla source
Réel montre le temps de rotation total pour un processus; tandis que l'utilisateur affiche le temps d'exécution pour les instructions définies par l'utilisateur et Sys est pour le temps d'exécution des appels système!
Le temps réel comprend également le temps d'attente (le temps d'attente pour les E / S, etc.)
la source