2015-04-06 177 views
0

我正在寫一個小python腳本來測試一些東西。後來我想用它來創建與gnuplot的資源使用情節,但首先一些測試。CPU使用率(頂部輸出)如何總計超過100%?

腳本看起來像

import subprocess 

result = subprocess.check_output("top -b -n 1 -c", shell=True).split("\n") 

head = result[:5] 
body = [x for x in result[7:] if x] #removes empty strings 

for line in head: 
    print line 

csum = 0.0 
for line in body: 
    print line 
    csum += float(line.split()[8]) 

print "CPU usage of all processes added up", csum, "%" 

多次運行它將幾乎總是導致了顯示CPU使用率> 100%。有時甚至> 200%。怎麼會這樣?

它運行在具有兩個內核的虛擬機(virtualbox,ubuntu 14.04 64位)上。主機也有兩個內核。

是否所有正在運行的進程的使用值總和總是低於100%?我在同一時間運行htop,這表明我在每個核心上的負載約爲50%....

問題可能是某些進程啓動了其他進程,並且它們都顯示在頂級輸出中,而父進程還顯示了孩子的CPU使用情況? ==>孩子被算兩次?

+2

通常這個用法意味着100%的1核心;如果你有2個內核,它應該高達200%。如果稍微多一些,可能是由於四捨五入或取樣人爲因素造成的。 –

+0

好的,謝謝。因此,如果我想查看「真實」使用情況,將總和除以內核數量應該是正確的。 –

回答

7

100%cpu是1個CPU/CORE /線程的完全利用率。如果你有8個CPU,那麼最大值將是800%。

如果你有線程,故事有點複雜,因爲一個線程不是一個真正的CPU,但是,在Linux上它被視爲一個CPU。

+3

將每個CPU顯示爲100%在'top'中稱爲「[IRIX模式]」(http://stackoverflow.com/問題/ 14579124 /爲什麼此結果whiletrue-沒有線程睡眠的原因-100-CPU使用率上Linux的,但是)」。它可以被禁用,顯示每個8個CPU爲12.5% –

+0

好吧......很高興知道:)現在我明白了。 –

+0

有沒有更好的方法來找出幾個特定進程的CPU使用情況?我的意思是解析頂部的輸出 –

2

以我的經驗,我有一個超大的SQL數據庫,造成問題。這是因爲它導致mysqld(mysql守護進程)在超過系統內存容量的情況下執行,導致服務器崩潰。當我在UNIX中嘗試'top'命令時,系統顯示該進程正在使用超過100%的內存。因此進程可以利用超過100%的系統內存。