Existe-t-il un moyen de déterminer à l'aide d'outils Linux/Unix standard combien un processus a dépensé en mode utilisateur et combien d'attente pour le noyau ?
En d'autres termes, exactement les valeurs "user" et "sys" que vous obtenez en utilisant time
, mais pendant processus d'exécution ?
REMARQUE : une façon est d'utiliser WBEM et d'énumérer Linux_UnixProcess, mais j'ai besoin d'utiliser autre outil que cela; mon objectif est de vérifier ce que le fournisseur WBEM me dit, c'est-à-dire que je dois utiliser un outil différent.
Réponse acceptée :
Sous Linux, les informations sont disponibles dans les champs 14 à 17 de /proc/$pid/stat
(voir proc(5) pour plus de détails):
Les champs sont :
- 14 :temps utilisateur (en nombre de ticks d'horloge)
- 15 :temps système
- 16 :temps d'attente des enfants par l'utilisateur
- 17 : temps d'attente systématique des enfants
(tous les threads d'un processus donné y ont les mêmes valeurs)
Ils ne sont pas directement signalés par ps
.
ps
rapporte 14 + 15 avec ps -o time
et 14 + 15 + 16 + 17
avec ps --cumulative -o bsdtime
.
Attention, le second champ dans /proc/$pid/stat
peut contenir des espaces ou des caractères de saut de ligne, vous ne pouvez donc pas l'analyser avec le $1
d'awk , $2
…
Vous pouvez utiliser perl
comme :
$ perl -MPOSIX -l -0777 -ne '@f = /(.*)|S+/gs;
printf "utime: %.2fnstime: %.2fncutime: %.2fncstime: %.2fn",
map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[13..16]' "/proc/$pid/stat"
utime: 3.79
stime: 2.06
cutime: 56.49
cstime: 34.27
Un processus peut récupérer ses propres temps avec getrusage(RUSAGE_SELF)
et getrusage(RUSAGE_CHILDREN)
.
Il y a aussi un times
appel système qui récupère les mêmes informations. Les shells POSIX ont un times
intégré pour cela. Certains shells fournissent également cette information avec time
(sans arguments).
$ times
0m3.800s 0m2.060s
0m56.512s 0m34.276s
$ ps -o time -p "$$"
TIME
00:00:05
$ ps --cumulative -o bsdtime -p "$$"
TIME
1:36