Su un sistema multiutente, voglio misurare l'utilizzo della CPU di ogni utente in pochi secondi di tempo della CPU. Ai fini di questa misurazione, suppongo che se un PID appartiene a un utente, questo utente sta causando il tempo della CPU, ovvero sto ignorando i daemon e il kernel.
Attualmente lo sto facendo, ogni cinque secondi:
- Ottieni ogni utente e i PID che stanno eseguendo
ps aux
- Per ogni PID, ottenere
x
, la somma di utime, cutime, stime e cstime da/proc/[pid]/stat
- calcola
t = x / interval
(l'intervallo non è sempre esattamente 5 secondi quando c'è un carico elevato)
Se eseguo questo, ottengo valori dall'aspetto sensato. Ad esempio: un utente di questo sistema ruotava in python ( while True: pass
) e il sistema mostrava circa 750 millisecondi di tempo di CPU al secondo. Quando il sistema si è bloccato per un po ', ha riportato 1600ms per un inverter da 1 secondo. Il che sembra giusto, ma capisco che questi valori possono essere ingannevoli, soprattutto se non li capisco davvero .
Quindi la mia domanda è questa:
Qual è un modo giusto e corretto per misurare il carico della CPU in base all'utente?
Il metodo deve essere piuttosto accurato. Potrebbero esserci molte centinaia di utenti su questo sistema, quindi l'estrazione delle percentuali ps aux
non sarà abbastanza accurata, specialmente per i thread di breve durata che molti software vogliono generare.
Anche se questo potrebbe essere complicato, so assolutamente che è possibile. Questo è stato il mio punto di partenza:
Il kernel tiene traccia del tempo di creazione di un processo e del tempo della CPU che consuma durante la sua vita. Ad ogni tick, il kernel aggiorna la quantità di tempo in jiffies che il processo corrente ha trascorso nel sistema e in modalità utente. - (dal Linux Documentation Project )
Il valore che sto cercando è la quantità di secondi (o jiffies) che un utente ha speso per la CPU, non una percentuale di carico del sistema o utilizzo della CPU.
È importante misurare il tempo della CPU mentre i processi sono ancora in esecuzione. Alcuni processi dureranno solo mezzo secondo, alcuni dureranno molti mesi - e dobbiamo prendere entrambi i tipi, in modo da poter tenere conto del tempo di CPU degli utenti con granularità.
top
puoi fare la modalità batch? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
dovrebbe mostrare il carico per {utente} in quel momento.