2012-05-16 33 views
13

我有出現僵持的過程:CPU利用率高對睡眠的進程

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

這是坐在「futex的」系統調用,並似乎在鎖被無限期等待。該過程被示爲消耗大量的CPU在運行時「頂」:

# 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 

過程也證明是一個「S」 - 睡眠狀態,這是有道理的,如果它等待一些資源。但是,我不明白爲什麼如果進程處於睡眠狀態,CPU利用率將接近200%。爲什麼top會在睡眠過程中報告如此高的CPU利用率?其CPU利用率不應爲零?

回答

5

有所報告的top和過程狀態的CPU使用率之間沒有相關性。該man page說(強調礦):

%的CPU - CPU使用率

自上次屏幕更新的經過的CPU時間任務的份額,以總百分比CPU時間。

因此,自上次屏幕更新以來,您的進程確實使用了大量的處理器時間。它正在休眠,是的,但那是因爲當前正在運行的進程本身是top(這很有意義,因爲它當前正在更新屏幕)。

+1

好了,'top'運行並不意味着其他進程的事實,必須睡覺。超過100%的利用率意味着多核系統;-)。雖然它產生的交互式shell和子進程可能會同時運行,並且發生*導致另一個任務處於睡眠狀態,但它並不一定是一個原因的直接對吧? – binki

4

top的輸出是完全正常的。

平均負載計算包括正在等待的東西過程(互斥/ futexes的,IO等)以及工藝中實際使用的CPU。測試它,運行如下所示:

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

並觀察頂部輸出以查看會發生什麼。如果你看一下這條線將增加1

提高平均負荷:在「91.8%ID」

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」的意思是「空閒」。所以CPU實際上並沒有做太多的工作。

2

您的應用程序fork子進程? strace輸出可能表明主進程正在等待子進程完成其工作。如果是這樣,您可以嘗試運行

strace -f -p 5075 

以跟蹤子進程。