Come visualizzare i processi attivi in tempo reale, in Linux: il comando top
Una macchina Linux non è mai inattiva, esistono infatti sempre una serie di processi in esecuzione in background.
Il comando top fornisce la lista dei processi attivi in tempo reale, cioè non fornisce un mero elenco statico, ma una lista che si aggiorna in tempo reale.
top
Il risultato ad esempio è il seguente
top - 10:26:27 up 214 days, 23:50, 1 user, load average: 0.53, 1.15, 1.81
Tasks: 156 total, 1 running, 154 sleeping, 1 stopped, 0 zombie
%Cpu(s): 9.5%us, 31.2%sy, 0.0%ni, 27.0%id, 7.6%wa, 1.0%hi, 23.7%si, 0.0%st
KiB Mem : 32780336 total, 14450032 free, 500476 used, 17829828 buff/cache
KiB Swap: 16515068 total, 16515068 free, 0 used. 30150864 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24954 root 20 0 1836664 59736 41100 S 1,0 0,2 946:07.05 fail2ban-server
9 root 20 0 0 0 0 S 0,3 0,0 148:54.60 rcu_sched
1010 root 20 0 75996 31536 31204 S 0,3 0,1 79:06.74 systemd-journal
1 root 20 0 191112 3788 2348 S 0,0 0,0 20:38.11 systemd
2 root 20 0 0 0 0 S 0,0 0,0 0:04.14 kthreadd
3 root 20 0 0 0 0 S 0,0 0,0 0:03.35 ksoftirqd/0
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0,0 0,0 0:11.01 migration/0
8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh
10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0,0 0,0 1:37.85 watchdog/0
12 root rt 0 0 0 0 S 0,0 0,0 1:11.94 watchdog/1
13 root rt 0 0 0 0 S 0,0 0,0 0:10.63 migration/1
14 root 20 0 0 0 0 S 0,0 0,0 0:04.04 ksoftirqd/1
16 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/1:0H
17 root rt 0 0 0 0 S 0,0 0,0 1:14.97 watchdog/2
18 root rt 0 0 0 0 S 0,0 0,0 0:09.63 migration/2
19 root 20 0 0 0 0 S 0,0 0,0 3:53.38 ksoftirqd/2
21 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/2:0H
22 root rt 0 0 0 0 S 0,0 0,0 1:09.36 watchdog/3
23 root rt 0 0 0 0 S 0,0 0,0 0:22.04 migration/3
In testa sono presenti, alcune informazioni tra cui l'utilizzo complessivo di CPU e RAM sul nostro sistema.
Vediamoli nel dettaglio
top - 10:26:27 up 214 days, 23:50, 1 user, load average: 0.53, 1.15, 1.81
Nella prima riga:
"10:26:27" indica l'ora corrente
"up 214 days": indica quanto tempo il sistema è stato avviato
"1 user": indicata quanti utenti sono collegati al sistema
"load average 0.53, 1.15, 1.81": è il carico medio del sistema.
Il carico medio è il risultato di una serie di calcoli per valutare l’utilizzo medio della CPU in un determinato periodo di tempo: 1, 5 e 15 minuti.
Nel nostro esempio
il carico medio nell'ultimo minuto è 0.53
il carico medio negli ultimi 5 minuti è 1.15
il carico medio negli ultimi 15 minuti è 1.81
Un carico medio pari a 1 significa che la CPU è completamente utilizzata ma i programmi non necessitano di attendere per essere utilizzati.
Un carico medio superiore a 1 indica che i programmi dovranno attendere per essere utilizzati e che il sistema diventerà più lento.
Se il carico medio è molto superiore ad 1, ed il server è lento, consigliamo di aumentare le specifiche tecniche del server rendendolo più performante.
NOTA: per ottenere il load average esiste anche il comando "uptime"
Proseguiamo ad analizzare alla riga successiva
Tasks: 156 total, 1 running, 154 sleeping, 1 stopped, 0 zombie
E' indicato il numero di task (processi) presenti: 156, di cui 1 è in esecuzione (running), 154 in stato di attesa (sleeping), 1 terminato, 0 in stato zombie.
I processi "zombie" sono processi già ultimati, ma che possiedono ancora un PID e quindi sono presenti nell'elenco dei processi.
In generale, quando avviamo un programma, succede questo:
- il processo "padre" viene avviato
- vengono creati uno o più processi "figli"
- i processi "figli" svolgono le loro operazioni fino a completamento
- il padre leggerà il segnale di uscita dei figli: il processo viene terminato, e quindi le risorse liberate, quando i figli hanno ultimato la loro operazione:
Se, per qualche motivo, il "padre" non riesce a leggere il segnale di uscita dei "figli", il figlio rimarrà attivo nel sistema come un processo "zombie" che in generale non dovrebbero occupare risorse, ma è sempre meglio non tenerli in vita.
Possiamo inviduare i processi zombie, con il loro PID, così
$ ps aux | grep Z
Ottenuto il PID, li killiamo così, dove al posto di {PID} indichiamo l'id del processo da killare
kill -s SIGCHLD {PID}
Dopo questa digressione sui processi zombie torniamo al risultato del nostro comando top.
La terza riga presenta il dettaglio di utilizzo della CPU
%Cpu(s): 9.5%us, 31.2%sy, 0.0%ni, 27.0%id, 7.6%wa, 1.0%hi, 23.7%si, 0.0%st
"9.5%us": indica che i processi utente occupano il 9.5%;
"31.2%sy": indica che i processi di sistema occupano il 31.2%;
"27.0%id": indica la percentuale di CPU disponibile;
"7.6%wa": indica il tempo di attesa IO della CPU.
In generale, come prima cosa controllare il valore del %id per vedere quanta CPU è ancora disponibile.
Se il valore di %id è basso allora controllare %us e %wa per capire cosa sta occupando la CPU.
Passiamo alla quarta e quinta riga montrano l'utilizzo della memoria:
KiB Mem : 32780336 total, 14450032 free, 500476 used, 17829828 buff/cache
KiB Swap: 16515068 total, 16515068 free, 0 used. 30150864 avail Mem
Mem: 255592k total, 167568k used, 88024k free, 25068k buffers
Swap: 524280k total, 0k used, 524280k free, 85724k cached
"32780336 total": è la memoria totale del sistema;
"14450032 free" è la parte di RAM che non contiene dati, cioè non usata;
"500476 used": è la parte di RAM che contiene dati cioè usata;
“17829828 buff/cache” è la parte di RAM che contiene dati per l’IO.
Per calcolare la quantità corretta di memoria disponibile bisogna usare la seguente formula:
memoria free + (memoria buffers + memoria cached)
Per calcolare la quantità di memoria usata dai programmi bisogna usare la seguente formula:
memoria used - (memoria buffers + memoria cached)
La lista dei processi attivi
Dopo le informazioni relativi all'utilizzi di CPU e RAM, abbiamo la lista dei processi attivi: utilizziamo le frecce della tastiere che scorrere l'elenco completo dei processi.
Vediamo nel dettaglio le colonne presenti:
- PID: l'id del processo attivo.
- USER: l'utente che ha lanciato il processo.
- PR: indica la priorità dell'attività.
- NI: indica l’indice del processo. Un valore positivo negativo indica una priorità più elevata, mentre un valore positivo positivo indica una priorità inferiore.
- VIRT: il valore complessivo di memoria virtuale utilizzata.
- RES: la quantità di memoria residente utilizzata.
- SHR: rappresenta la dimensione della memoria condivisa (kb) utilizzata da un'attività.
- S: Lo stato di una attività. I valori possibili sono S (sleeping), D (uninterruptible sleep), R (running), Z (zombies), o T (stopped or traced).
- %CPU: Percentuale di CPU utilizzata da un'attività.
- %MEM: Percentuale RAM utilizzata da un'attività.
- TIME+: il tempo totale di CPU utilizzata
- COMMAND: Il comando utilizzato per creare il processo
Come possiamo vedere, dopo aver lanciato il comando top, la lista di aggiorna dopo 3 secondi, all'infinito.
Se volessimo ad esempio limitarci a 10 "aggiornamenti", utilizziamo:
top -n 10
Se invece volessimo modificare i 3 secondi, tra un aggiornamento e il successivo, digitiamo "d" mentre top è in esecuzione: apparirà un prompt, in testa alla lista dei processi, in cui dobbiamo indicare di quanto modificare il numero di secondi
Change delay from 3,0 to
Digitiamo ad esempio 10 secondi: 10,0
In questo modo i dati verranno aggiornati ogni 10 secondi.
Come uscire dal comando top
Per uscire dal comando top, durante l'esecuzione di top, digitare "q" (quite).
Visualizzare i processi attivi di un utente
Per limitarci alla visualizzazione dei processi attivi di uno specifico utente, digitiamo top con l'opzione "u" (user) seguita dal nome utente.
Ad esempio per estrarre i processi attivi dell'utente root:
top -u root
Terminare un processo
Durante l'esecuzione di top, possiamo "killare" un processo digitando "k": apparirà un prompt in cui dovremo indicare il PID del processo che vogliamo terminare
PID to signal/kill [default pid = 24954]
Digitiamo ad esempio il PID 21014, per terminare questo specifico processo.
In alternativa al comando top, per killare un processo, possiamo utillzzare il comando "kiil -9", seguito dal PID del processo. Ad esempio:
kill -9 21014
Ordinare i processi per utilizzo di CPU
Per ordinare i processi in base all'utilizzo di CPU (colonna %CPU), durante l'esecuzione di top, utilizziamo assieme i tasti SHIFT + P
Ordinare i processi per utilizzo di RAM
Per ordinare i processi in base all'utilizzo di RAM (colonna %MEM), utilizziamo assieme i tasti SHIFT + M
Ordinare i processi per tempo di esecuzione
Per ordinare i processi in base al tempo di esecuzione (colonna TIME+) utilizziamo assieme i tasti SHIFT + T