2012-05-16 8 views
13

Mam proces, który wydaje się być w impasie:CPU Wykorzystanie wysokiej do spania przetwarza

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

on siedzi na „futex” wywołania systemowego, i wydaje się być w nieskończoność oczekiwanie na blokadę. Proces jest przedstawiony do spożywania dużej ilości CPU podczas „top” jest prowadzony:

# 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 

proces jest również okazały się w „S” - stan uśpienia, co ma sens, jeśli czeka na jakiś ratunek. Jednak nie rozumiem, dlaczego wykorzystanie procesora byłoby bliskie 200%, jeśli proces jest w stanie uśpienia. Dlaczego top raportuje tak wysokie wykorzystanie procesora w procesie spania? Czy jego wykorzystanie procesora nie powinno wynosić zero?

Odpowiedz

5

Nie ma korelacji między wykorzystaniem procesora zgłoszonym przez top a stanem procesu. man page mówi (nacisk moje):

% CPU - użycie procesora

akcji Zadanie jest od czasu procesora upłynął od ostatniej aktualizacji ekranu, wyrażony jako procent całkowitego Czas procesora.

Twój proces rzeczywiście wykorzystał ogromną liczbę procesorów od ostatniej aktualizacji ekranu. Śpiąca, tak, ale to dlatego, że aktualnie działający proces to sama top (co ma sens, ponieważ obecnie aktualizuje ekran).

+1

Cóż, fakt, że 'top' jest uruchomiony nie oznacza, że ​​drugi proces musi spać. Ponad 100% wykorzystania implikuje system wielordzeniowy ;-). Chociaż interaktywna powłoka i podprocesy, które ją spawns mogą być jednocześnie uruchomione i * dzieje się * w celu spowodowania, że ​​inne zadania śpią, ale niekoniecznie jest to bezpośrednim powodem, prawda? – binki

4

Wyjście top jest całkowicie normalne.

Obliczenia średnie obciążenia obejmują procesy, które czekają na coś (mutexes/futexes, IO itp.), A także procesy, które faktycznie używają procesora. Przetestuj go, powiedzmy, uruchamiając coś takiego:

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

i oglądanie najlepszych wyników, aby zobaczyć, co się stanie. Zwiększy to średnie obciążenie o 1.

Jeśli spojrzeć na tej linii:

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" w "91,8% id" oznacza "idle". Więc procesor w rzeczywistości niewiele robi.

2

Czy Twoja aplikacja rozwidla procesy potomne? Wynik strace może wskazywać, że główny proces właśnie czeka, aż procesy potomne zakończą swoją pracę. Jeśli tak, możesz spróbować uruchomić również procesy potomne.