jeudi 17 mars 2011

Monitorer les processus sous Ubuntu

Introduction
Sous windows, il existe le "task manager" et sous Ubuntu le "Moniteur Système" propose un environnement graphique pour visualiser les processus et l'utilisation des ressources (gnome-system-monitor, accessible depuis le menu "Système | Administration | Moniteur Système").

Tout comme sous Windows, il est possible de consulter les tâches en cours d'exécution, la consommation des ressources processeurs, de mémoire mais également le trafic réseau.
Tout comme sous Windows, il est également possible de terminer un processus (ou bien de le "tuer" en utilisant le menu contextuel).
A l'avantage de gnome-systeme-monitor, il est également possible de consulter les fichiers ouverts (et donc aussi les connexions réseaux) ainsi qu'une "table d'allocation mémoire".

Si la plupart des utilisateurs seront satisfait avec cette option graphique, d'autres voudront aller un peu plus loin et cette exploration avancée passe par la ligne de commande.
Dans ce domaine, surveiller les processus d'Ubuntu se fait de la même façon que sur n'importe quelle autre machine Linux/Unix.

Processus ID (pid)
Pour commencer, il faut savoir que tout processus Unix (programme, deamon, etc) est identifier par un identifiant unique, il s'appelle "pid".
Cet identifiant est également affiché dans le volet "Processus" du Moniteur Système.
Il est également possible d'obtenir la liste des processus (et pid correspondant) par différentes lignes de commande.
Ce qu'il faut savoir, c'est que le "pid" est une pierre angulaire de la gestion des processus.

free: La mémoire disponible
La commande free permet d'afficher l'état de la mémoire (utiliser-g ou -m pour afficher les résultats en giga ou megaoctects).

xxx@yyy:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2508       1392       1116          0        153        710
-/+ buffers/cache:        528       1980
Swap:        11998          0      11998
Shared - indique la mémoire partagée entre processus.
Buffers - la mémoire allouée au systèmes d'entrée/sortie.
Cached - la mémoire actuellement utilisé pour faire du cache.
+/- buffers/cache - indique la quantité de mémoire réellement utilisée pour les buffers et caches.

Juste une note pour signaler que [-/+ buffers/cache].free = mem.free + mem.shared + mem.buffer + mem.cached.

Top: Liste des processus
La commande top affiche quelques informations utiles ainsi qu'une liste des processus trié par ordre de consommation cpu.
Si top permet de garder un oeil sur les processus les plus gourmants et permet l'identification des processus qui freine le bon fonctionnement du système, le rafraichissement constant de top (toutes les 3 à 5 sec) le rend aussi peu utilise lorsque l'on désire espionner un processus particulier.
En effet, la position d'un processus dans la liste varie constamment avec fonction de sa consommation cpu. C'est assez agacant.
Voici le résultat d'une commande top.
Attention: Il est cependant possible d'indiquer précisément le ou les processes à suivre (top -p pid1,pid2,...)

top - 11:37:01 up 3 days, 21:11,  2 users,  load average: 0.34, 0.24, 0.23
Tasks: 182 total,   3 running, 179 sleeping,   0 stopped,   0 zombie
Cpu(s): 12.6%us,  1.1%sy,  0.0%ni, 86.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   2569208k total,  1451288k used,  1117920k free,   157804k buffers
Swap: 12286972k total,        0k used, 12286972k free,   729628k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
 9980 domeu     20   0  400m 115m  28m S   27  4.6   9:05.54 firefox-bin                                                
 1309 root      20   0 94356  74m  18m R   24  3.0  37:01.50 Xorg                                                       
 1706 domeu     20   0 69148  46m  14m S    3  1.9   7:47.29 compiz                                                     
 9997 domeu     20   0  134m  31m  14m S    3  1.2   1:42.08 plugin-containe                                            
10079 domeu     20   0 93140  13m  10m S    3  0.6   0:00.84 gnome-terminal                                             
 1160 root      20   0 19292 4356 3572 S    0  0.2   0:06.87 NetworkManager                                             
 9498 root      20   0     0    0    0 R    0  0.0   0:00.92 kondemand/2                                                
10322 domeu     20   0  2620 1156  840 R    0  0.0   0:00.02 top                                                        
    1 root      20   0  2864 1700 1224 S    0  0.1   0:00.86 init                                                       
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd                                                   
    3 root      20   0     0    0    0 S    0  0.0   0:04.54 ksoftirqd/0                                                
    4 root      RT   0     0    0    0 S    0  0.0   0:00.65 migration/0                                                
    5 root      RT   0     0    0    0 S    0  0.0   0:00.00 watchdog/0                                                 
   15 root      20   0     0    0    0 S    0  0.0   0:05.05 events/0                                                   
   19 root      20   0     0    0    0 S    0  0.0   0:00.00 cpuset                                   

L'entête mentionne:
  • La date et l'heure mais aussi "uptime" (cfr: up)
  • La charge moyenne (average load)
  • L'usage de la mémoire (y compris swap)
  • L'usage CPU détaillé
    • us : User
    • sy : system
    • ni : nice
    • id : idle
    • wa : iowait
    • hi : H/w interrupt requests
    • si : S/w interrupt requests
La liste elle-même reprend:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 9980 domeu     20   0  400m 115m  28m S   27  4.6   9:05.54 firefox-bin

pid - identification du processus
pr - la priorité attribuée par l'OS. Cette valeur dépend de la valeur de "nice" et d'autres paramètres. plus le chiffre est grand et moins le processus est prioritaire.
ni - la priorité donnée par l'utilisateur (-20 la plus haute, 20 la plus basse).
virt - la mémoire vituelle utilisée par le processus (mem processus + data processus + bibliothèques partagées utilisées + swap)
res - la quantité de ressource utilisé par le processus (mem processus + data processus)
shr - la mémoire partagée utilisée par le processus.
%cpu - évident
%mem - pourcentage de la mémoire physique utilisée par le processus.
time - temps cumulé durant lequel le processus a été actif.
command - la commande qui à lancé le processus

ps: Liste des processus
Une autre commande bien utile est ps, cette dernière permet de tirer une liste des procesus en cours d'exécution.
Les variantes les plus connues sont:
  • ps -ef
  • ps -efl
  • ps aux

La commande ps accepte de nombreux arguments bien documenté dans les pages du manuel.
(voir "man ps")

ps -ef
Permet de tirer une liste des processus en cours d'exécution.
Dans son utilisation la plus courante, ps -ef sert a trouver le pid d'un processus, voire même s'il fonctionne.
A titre d'exemple, pour savoir sur firefox est en cours de fonctionnement (et quel pid) on utilisera la commande suivante:
ps -ef | grep firefox

voici un extrait de l'outpup affiché par ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Mar10 ?        00:00:00 /sbin/init
root         2     0  0 Mar10 ?        00:00:00 [kthreadd]
root         3     2  0 Mar10 ?        00:00:06 [ksoftirqd/0]
uid - utilisateur ayant lancé le processus
pid - identification du processus
ppid - processus parent.
c - valeur entière indiquant le %cpu utilisé.
stime - Start Time, date et heure du lancement du processus
tty - terminal ayant lancé la commande (pas relevant dans un environnement graphique).
time - Cumul des temps d'exécutions du processus
cmd - la commande ayant lancé le processus.

ps -efL
Affiche le même contenu que la commande ps -ef mais ajoute des informations concernant les threads.
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root         1     0     1  0    1 Mar10 ?        00:00:00 /sbin/init
root         2     0     2  0    1 Mar10 ?        00:00:00 [kthreadd]
root         3     2     3  0    1 Mar10 ?        00:00:11 [ksoftirqd/0]
root         4     2     4  0    1 Mar10 ?        00:00:01 [migration/0]
root         5     2     5  0    1 Mar10 ?        00:00:00 [watchdog/0]
root        15     2    15  0    1 Mar10 ?        00:00:11 [events/0]
LWP - Identification du thread.
NLWP - Nombre de thread du processus.

ps aux
Cette commande permet d'obtenir un affichage beaucoup plus proche de la commande top.
Avec ps aux, il sera possible de connaître le %cpu et %mem mais aussi les consommations en ressource.
xxx@yyy:~$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2864  1700 ?        Ss   Mar10   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Mar10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Mar10   0:11 [ksoftirqd/0]
VSZ - Virtual memory size, correspond a la colonne virt de la commande top. (mem processus + data processus + bibliothèques partagées utilisées + swap)
RSS - Resident Set Size, mémoire utilisée par le processus et ses données. Correspond à la colonne res de la commande top.

kill: terminer un processus
La commande kill permet d'envoyer le signal SIGTERM (fin de processus) à un processus particulier identifié par son pid.
Si le processus ne semble pas répondre, il est possible d'utiliser l'option -9 (KILL) dans la commande kill, cela terminera le processus de façon expéditive.

Voici un exemple terminant/expédiant le processus 253.
kill -9 253
Cet autre exemple demandant la fin d'exécution (gracefully) des processus 457 et 1099
kill 457 1099

Dans les entrailles des processus
Dans le monde Unix, tout est représenté sous forme de fichier.
Ainsi, les processus en cours d'exécution se conforme à cette règle et font également partie du système de fichier.
Ainsi, en explorant le répertoire /proc, l'on se retrouve a explorer les processus en court d'éxécution.
La commande
ls -l /proc
affichera un répertoire par processus actif, le nom du répertoire étant le pid du processus (que l'on peu identifier à l'aide de ps -ef) et quelques autres fichiers et répertoires aux noms plus explicites.

Vous pouvez obtenir plus d'information sur /proc dans les manuels à l'aide de la commande.
man 5 proc

/proc/cpuinfo
Fournit des informations relatives à la configuration cpu de la machine.
cat /proc/cpuinfo

/proc/meminfo
Fournit des informations relatives à la mémoire du système.
Si toutes informations ne sont pas utiles, certaines peuvent se montrer pertinente.
xxx@yyy:~$ cat /proc/meminfo
MemTotal:        2569208 kB
MemFree:         1090812 kB
Buffers:          162756 kB
Cached:           740640 kB
SwapCached:            0 kB
...

/proc/PID
Un répertoire processus (identifier par la pid) contient une foule d'information.
En voici un exemple:
xxx@yyy:~$ ps -ef | grep firefox
domeu     9972     1  0 11:00 ?        00:00:00 /bin/sh /usr/lib/firefox-3.6.15/firefox
xxx@yyy:~$ ls -l /proc/9972
dr-xr-xr-x 2 domeu domeu 0 2011-03-14 11:08 attr
-r-------- 1 domeu domeu 0 2011-03-14 13:53 auxv
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 cgroup
--w------- 1 domeu domeu 0 2011-03-14 13:53 clear_refs
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:00 cmdline
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 comm
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 coredump_filter
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 cpuset
lrwxrwxrwx 1 domeu domeu 0 2011-03-14 13:53 cwd -> /home/domeu
-r-------- 1 domeu domeu 0 2011-03-14 13:53 environ
lrwxrwxrwx 1 domeu domeu 0 2011-03-14 11:22 exe -> /bin/dash
dr-x------ 2 domeu domeu 0 2011-03-14 11:00 fd
dr-x------ 2 domeu domeu 0 2011-03-14 13:53 fdinfo
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 io
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 latency
-r-------- 1 domeu domeu 0 2011-03-14 13:53 limits
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 loginuid
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 maps
-rw------- 1 domeu domeu 0 2011-03-14 13:53 mem
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 mountinfo
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 mounts
-r-------- 1 domeu domeu 0 2011-03-14 13:53 mountstats
dr-xr-xr-x 5 domeu domeu 0 2011-03-14 13:53 net
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 oom_adj
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 oom_score
-r-------- 1 domeu domeu 0 2011-03-14 13:53 pagemap
-r-------- 1 domeu domeu 0 2011-03-14 13:53 personality
lrwxrwxrwx 1 domeu domeu 0 2011-03-14 13:53 root -> /
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 sched
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 schedstat
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 sessionid
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:08 smaps
-r-------- 1 domeu domeu 0 2011-03-14 13:53 stack
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:00 stat
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:08 statm
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:00 status
-r-------- 1 domeu domeu 0 2011-03-14 13:53 syscall
dr-xr-xr-x 3 domeu domeu 0 2011-03-14 13:53 task
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:08 wcha
On y retrouve les informations suivantes:
  • cmdline - fichier contenant la ligne de commande.
  • cwd - lien symbolique vers le répertoire courant du processus.
  • environ - fichier contenant une copie des variables d'envrionnements liées au processus.
  • exe - lien symbolique vers l'exécutable
  • fd - file directory, répertoire contenant un liste des fichiers et sockets ouverts par le processus
xxx@yyy:/proc/9972$ ls -l fd
total 0
lr-x------ 1 domeu domeu 64 2011-03-14 11:00 0 -> /dev/null
lrwx------ 1 domeu domeu 64 2011-03-14 11:00 1 -> /home/domeu/.xsession-errors
lrwx------ 1 domeu domeu 64 2011-03-14 11:00 10 -> /usr/lib/firefox-3.6.15/firefox
lrwx------ 1 domeu domeu 64 2011-03-14 11:00 2 -> /home/domeu/.xsession-errors
  • root - lien vers le répertoire root du processus (habituellement /).
    Il faut savoir qu'il est possible d'utiliser un root customisé en utilisant chroot. Cela permet de restreindre l'accès au système de fichier ou d'utiliser un sous répertoire pour recréer le système de fichier, c'est très utile pour recréer un système minimaliste sans toucher au système de fichier, cette option est fort utilisée pour tester la compilation et l'installation de package sans risque pour le système.
    Pour les curieux, voir le liens http://doc.fedora-fr.org/wiki/Utilisation_de_chroot
  • Status - ce fichier affiche différentes informations relatif au fonctionnement du processus, y compris l'usage de la mémoire.
xxx@yyy:/proc/9972$ more status
Name: firefox
State: S (sleeping)
Tgid: 9972
Pid: 9972
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 20 24 46 111 119 122 1000 
VmPeak:     1896 kB
VmSize:     1896 kB
VmLck:        0 kB
VmHWM:      508 kB
VmRSS:      508 kB
VmData:      168 kB
VmStk:      136 kB
VmExe:       80 kB
VmLib:     1484 kB
VmPTE:       28 kB
VmSwap:        0 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
...

Inutile de présenter PID, PPID, Name et State.
VmSize - mémoire totale utilisée. VmLib + VmExe + VmData + VmStk.
VmLock - mémoire vérouillée (évite qu'elle passe en swap).
VmRss - mémoire Resident Set Size (mem processus + mem data + mem stack).
VmData - mémoire virtuelle utilisée par la heap (stockage des données)
VmStk - mémoire utilisé pour la stack
VmExe - mémoire utilisée par l'executable et le librairie liées statiquement.
VmLib - Mémoire virtuelle utilisée par les librairies chargées en cours d'exécution.
VmData - mémoire allouée aux données
VmSwap - mémoire en swap

  • Stat - version condensée de Status utilisé par la commande ps. le format produit par une instruction C printf est décrit dans le manuel d'utilisation (man 5 proc).

Aucun commentaire: