2011-01-28 2 views
8

Dove l'applicazione top ottiene i dati su Linux? Sarei interessato ai dati di caricamento/pid della CPU in tempo reale. (Ho letto tutta la documentazione nella pagina man/proc/pid, ma le informazioni non ci sono).dove arriva la parte superiore dei dati in tempo reale

Il pid è un jboss. Ho bisogno dei dati leggeri (da esportare facilmente).

+0

Il carico è una metrica a livello di sistema, non di processo. Intendevi l'utilizzo della CPU di processo? –

+0

sei sicuro che le informazioni non ci sono? 'find/proc/1' ad esempio, ci sono MOLTE cose, hai passato tutto? –

+0

Ho fatto tutto questo :) – Mark

risposta

4

come documentato in proc(5), nel file /proc/(pid)/stat si hanno i campi:

utime %lu 

quantità di tempo che questo processo è stato programmato in modalità utente, misurati in orologio zecche (dividere per sysconf (_SC_CLK_TCK). Questo include ora ospite, ora_corsa (tempo trascorso in esecuzione una CPU virtuale, vedere di seguito), in modo che le applicazioni che sono non a conoscenza del campo ora ospite fare non perdere tale tempo dai loro calcoli .

stime %lu 

quantità di tempo che questo processo è stato programmato in modalità kernel , misurata in clock ticks (divisione da sysconf (_SC_CLK_TCK).

Per ottenere l'utilizzo della CPU per un processo specifico, utilizzare questi campi.Il processo di alto livello aggregherà l'utilizzo della CPU su tutti i thread, per una ripartizione per thread, è possibile trovare gli altri thread in /proc/(pid)/task.

Se si preferisce essere avvisati quando C Il tempo PU supera qualche soglia, è possibile utilizzare clock_getcpuclockid per ottenere un handle per il relativo orologio della CPU, quindi timer_create o timerfd per ricevere una notifica quando raggiunge un livello specificato. Tuttavia, si noti che i timer cputime cross-process sono una caratteristica opzionale nelle specifiche POSIX e potrebbero non essere supportati (non ho testato).

+0

effettivamente credo "ps -Lp (pid) opcpu "aggrega tutti quei thread, non è vero? Sfortunatamente ps fornisce solo istantanee di quel carico di cpu/thread (non può essere usato nel monitoraggio in tempo reale) e aggrega nello script di bash tutti i 300 thread in quel jboss, per "cat" -ing tutti i file specifici per quello Pids bambino sembra inaffidabile. – Mark

+0

@Xander, dopo aver controllato, si scopre che il processo di livello superiore si aggrega su tutti i thread. Quindi puoi semplicemente usare il file stat per il monitoraggio. Ho anche aggiunto alcune note su clock_getcpuclockid, che può essere utile. – bdonlan

11

In caso di dubbio, utilizzare strace (1)!

open("/proc/2/stat", O_RDONLY) = 4 
open("/proc/2/statm", O_RDONLY) = 4 
open("/proc/3/stat", O_RDONLY) = 4 
open("/proc/3/statm", O_RDONLY) = 4 
+0

ciao, grazie per il suggerimento strace! è ottimo. l'unico problema è che dopo uno strace dump non riesco ad arrivare dove effettivamente scrivo allo stdout il caricamento della cpu (perché analizzando i file che hai consigliato non ho potuto trovare quello che stavo cercando ...) – Mark