2012-05-16 25 views
13

Ho un processo che sembra essere in fase di stallo:utilizzo della CPU alto per dormire processi

# strace -p 5075 
Process 5075 attached - interrupt to quit 
futex(0x419cf9d0, FUTEX_WAIT, 5095, NULL 

Si è seduto sulla chiamata di sistema "futex", e sembra essere a tempo indeterminato in attesa di un blocco. Il processo è dimostrato di essere consumare una grande quantità di CPU quando "top" è gestito:

# top -b -n 1 
top - 23:13:18 up 113 days, 4:19, 1 user, load average: 1.69, 1.74, 1.72 
Tasks: 269 total, 1 running, 268 sleeping, 0 stopped, 0 zombie 
Cpu(s): 8.1%us, 0.1%sy, 0.0%ni, 91.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
Mem: 12165696k total, 3810476k used, 8355220k free, 29440k buffers 
Swap: 8388600k total, 43312k used, 8345288k free, 879988k cached 

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
5075 omdb  18 0 2373m 1.7g 26m S 199.7 14.9 102804:11 java 

Il processo è anche dimostrato di essere in una "S" - stato di sospensione, che ha un senso se è in attesa di un po ' risorsa. Tuttavia, non capisco perché l'utilizzo della CPU sarebbe vicino al 200% se il processo è in stato di sospensione. Perché top riporta un utilizzo così elevato della CPU in un processo di sospensione? L'utilizzo della CPU non dovrebbe essere zero?

risposta

5

Non esiste alcuna correlazione tra l'utilizzo della CPU come riportato da top e lo stato del processo. Il man page dice (enfasi mio):

% della CPU - l'utilizzo della CPU

La parte del compito del tempo di CPU trascorso dall'ultimo aggiornamento dello schermo, espresso in percentuale del totale Tempo di CPU.

Quindi, il processo ha effettivamente utilizzato un'enorme quantità di tempo del processore dall'ultimo aggiornamento dello schermo. Sta dormendo, sì, ma è perché il processo attualmente in esecuzione è top stesso (il che ha senso, dal momento che sta aggiornando lo schermo).

+1

Bene, il fatto che 'top' sia in esecuzione non significa che l'altro processo debba andare a dormire. Più del 100% di utilizzo implica un sistema multicore ;-). Anche se la shell interattiva e i sottoprocessi che genera spawn potrebbero essere contemporaneamente in esecuzione e * happening * per far sì che l'altra attività stia dormendo, ma non è necessariamente diretta da una causa, giusto? – binki

4

L'uscita top è perfettamente normale.

I calcoli della media del carico includono processi in attesa di qualcosa (mutex/futex, IO ecc.) E processi che utilizzano effettivamente la CPU. Provarlo, diciamo, in esecuzione qualcosa come:

dd if=/dev/sda of=/dev/null 

e guardando uscita superiore per vedere cosa succede. Esso aumenterà il carico medio di 1.

Se si guarda a questa linea:

Cpu(s): 8.1%us, 0.1%sy, 0.0%ni, 91.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

"id" in "91.8% id" significa "idle". Quindi la CPU in realtà non sta facendo molto.

2

L'applicazione esegue l'fork dei processi figlio? L'output strace potrebbe indicare che il processo principale è solo in attesa che i processi figlio finiscano il loro lavoro. In tal caso, è possibile provare a eseguire

strace -f -p 5075 

per tracciare anche i processi figlio.

Problemi correlati