La somma di tutti i PID è "utime" il sistema totale utime?


9

Per misurare il tempo totale della CPU di un utente, sto usando il campo "utime" tra /proc/[pid]/stat:

utime %lu   Amount of time that this process has been scheduled in user
            mode, measured in clock ticks (divide by
            sysconf(_SC_CLK_TCK).  This includes guest time, guest_time
            (time spent running a virtual CPU, see below), so that
            applications that are not aware of the guest time field do
            not lose that time from their calculations.

(da man proc (5) )

Quindi, il mio "user utime" è la somma utimedi tutti i PID che questo utente sta eseguendo.

Spero che questo mi dia un valore preciso per il numero di secondi CPU che questo utente ha trascorso. Sono sulla buona strada?

Alcune delle cose che non capisco o non prendo ancora in considerazione:

  • Ogni PID ha anche un PID principale (o zero). Ma sto contando ogni PID, non solo quelli con un ppid di 0. È corretto?
  • Ci sono, oltre a utime, stime, cutime e cstime. Devo preoccuparmi di quelli? Suppongo che utime sia il numero totale di secondi della cpu per un PID, senza contare il genitore.

Se calcolo il tempo totale della CPU del sistema utilizzando /proc/uptime, questo valore è abbastanza vicino alla mia somma per tutti gli utenti, ma la differenza è significativa. Ad esempio (in minuti):

system cpu_time:         96.13
sum of users_cputime:   111.45

Correzione:

Ottengo valori "dall'aspetto sensato" per tutti i tipi di cose. Al momento sto usando la somma di utime, stime, cutime e cstime. E riporta valori che, anche se non li capisco, si correlano molto bene con le misurazioni di time.

Se sono completamente sulla strada sbagliata, c'è un'altra domanda:


/proc/cputimenon ha alcuna informazione sul tempo impiegato dalle CPU nell'esecuzione dei processi, quindi sono perplesso quale sia il tuo calcolo del "sistema cpu_time". Se stai facendo qualcosa con il secondo numero, è il tempo impiegato dall'attività inattiva ; Non so esattamente cosa significhi in pratica.
Gilles 'SO- smetti di essere malvagio' il

1
Il tuo "tempo dell'utente" dovrebbe aggiungere anche i valori utime da tutti i processi morti. Come li prendi in considerazione?
Gilles 'SO- smetti di essere malvagio' il

Mhh. Quello che chiamo "sistema cpu time" è semplicemente il primo valore di / proc / uptime, "secondi di sistema". Avrei pensato che fosse troppo alto, poiché conta anche i thread del kernel, ma come puoi vedere la somma di tutti i valori "utime" è ancora superiore al tempo di sistema da / proc / utime. Il tuo link, per quanto ne so, spiega perché. Anche se per essere chiari: non mi interessa davvero quel numero. Sono interessato a "tempo cpu per utente".
Stefano Palazzo,

Per quanto riguarda il secondo commento: per il momento, stavo pianificando di misurarlo periodicamente (diciamo ogni secondo), che avrebbe ignorato i processi di breve durata.
Stefano Palazzo,

Quindi il tuo calcolo del tempo della CPU di sistema è ($ 1- $ 2 / $ number_of_cups) dove $ 1 e $ 2 sono i valori da /proc/uptime? Quindi immagino che l'I / O attribuito al compito inattivo spiegherebbe la differenza. Non so nulla sull'argomento, quindi sospetto che mi manchi qualcosa di grave: non mi aspetterei che succeda così tanto nel compito inattivo, soprattutto considerando che la tua somma di utenti cputime probabilmente mancherà molto a breve- processi vissuti.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


3

Il modo tradizionale per registrare e tenere traccia del tempo della CPU dell'utente è la contabilità di processo . Su Linux, installa le utility di contabilità GNU , generalmente fornite da un pacchetto chiamato acct. Non sono sicuro di quanto sarà preciso nel tenere traccia del tempo trascorso in processi di breve durata, ma elencherà almeno tutti i processi mai eseguiti.

Esegui lastcommper ottenere un elenco di tutti i comandi eseguiti da qualsiasi utente e il tempo trascorso in ciascuno (arrotondato a ~ 10ms per i processi di breve durata, aspettati di vedere molti 0.00). Esegui saper visualizzare varie somme e statistiche. In particolare, sa -mvisualizza i totali per utente. Le statistiche accumulate per saesecuzione dall'ultima rotazione dei registri di contabilità (in genere si trovano in /var/log/account/).

Nota che non riuscirai a catturare tutti i processi campionando ad intervalli, non di gran lunga. Ti mancheranno quasi tutti i processi di breve durata e gli ultimi secondi di processi lunghi. La contabilità dei processi elenca tutti i processi passati.

In /proc/$pid/stat, il tempo dell'utente è il tempo impiegato per il calcolo, in contrapposizione al tempo di sistema impiegato per l'I / O. Quale contare dipende da cosa vuoi fare con le informazioni.

Contare tutti i PID è giusto. Non so cosa abbia a che fare il PID genitore con questo.

Sul lato del sistema, la descrizione di /proc/uptimesembra errata. Wikipedia ha ragione mentre scrivo. Il primo campo è il tempo reale trascorso dall'avvio del sistema, meno ogni tempo trascorso sospeso o in letargo. Il secondo campo è il tempo cumulativo impiegato nell'attività inattiva su tutte le CPU. Non sono sicuro di cosa significhi veramente; non è certamente il tempo di inattività totale sulla mia macchina. Nel kernel, il valore viene riassunta inuptime_proc_show dalle variabili aggiornati inaccount_idle_time .


Che dire di processi a esecuzione molto lunga? Non saattendere che il processo di smettere prima di segnalarlo del tempo di CPU?
Stefano Palazzo,

@StefanoPalazzo Sì, i dati contabili vengono scritti quando termina un processo. Ciò significa anche che non si ottengono dati per i processi in esecuzione dopo un arresto anomalo del sistema, per quanto ne so.
Gilles 'SO- smetti di essere malvagio' il

Questo è un problema - significa che non posso usarlo, poiché avremo molti processi di lunga durata.
Stefano Palazzo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.