2012-01-14 7 views
3

Как я могу получить процент использования процессора за каждый процесс? Так, например, я хотел бы, чтобы запустить свою программу prog и получить использование центрального процессора он понесены, например:Использование процессора в процессе?

prog name cpu0 cpu1 cpu2 cpu3 total 
    prog  15 20 45 47 127% 

Есть ли какой-либо инструмент для этого? Спасибо.

+0

Является 'top' достаточно для ваших целей? –

+0

Оли, привет. Проблема с 'top' заключается в том, что она слишком« динамична », если вы будете, для моих целей. Мне нужно что-то вроде команды linux 'time', сообщив об использовании процессора только в этом процессе. –

+0

Хорошо, такие звуки, как вы хотите узнать, сколько процентов всех циклов, используемых вашим процессом, выполнялось на CPU0, CPU1 и т. Д.? В этом случае, что означает 127% в вашем примере выше? –

ответ

0

linux process explorer Проект предоставляет эту функциональность, вы можете увидеть график для CPU/Memory/IO для каждого процесса в диалоговом окне свойств.

enter image description here

1

Для светлячок:

while [ 1 ]; do ps --no-heading -C firefox -L -o command,psr,pcpu|sort -k 2 -n; echo; sleep 1; done 

Вы должны были бы подвести третий столбец (который я не вижу смешного простой способ сделать), потому что это на самом деле показывая вам каждый поток. Первый столбец - это имя, второй процессор, третий,% процессор.

+0

awk может захватить вас третьим столбцом с 3 долларами, я считаю, я забыл синтаксис для него: \ –

1

Я думаю, что вы можете использовать информацию в /proc/[pid]/stat и /proc/stat, чтобы оценить это.

Ознакомьтесь с замечательными ответами на How to calculate the CPU usage of a process by PID in Linux from C?, в которых объясняется, как рассчитать загрузку процессора% для одного процессора.

6-й номер последнего номера, который вы получаете от /proc/[pid]/stat, - это «процессор% d, номер последнего последнего выполненного» (по крайней мере, на Ubuntu 12.04).

Чтобы расширить доступ к нескольким процессорам, вы можете попробовать использовать процессор в течение периода и (очень грубо!) Оценить долю времени на каждом процессоре. Затем используйте эти пропорции для разделения использования процессора между процессорами. Основываясь на информации в /proc/stat, вы также можете просмотреть общее время для каждого процессора, а затем у вас есть все необходимые переменные!

См. http://linux.die.net/man/5/proc для получения дополнительной информации о proc.

0

Вот простой питон я сделал:

import re,time,sys 
cpuNum=0 
if len(sys.argv)==1: 
    print "use pidcpu <pid1,pid2,..,pidn>" 
    sys.exit(0) 

pids=sys.argv.pop() 

def getCpuTot(): 
    global cpuNum 
    f=open("/proc/stat","r") 
    ln=f.read() 
    f.close() 
    #cpu 858286704 148088 54216880 117129864 2806189 5046 16997674 0 0 0 
    r=re.findall("cpu[\d\s]{1}\s+(\d+)\s(\d+)\s(\d+)\s(\d+)\s.*?",ln,re.DOTALL) 
    cpuNum=len(r)-1 
    return int(r[0][0])+int(r[0][1])+int(r[0][2])+int(r[0][3]) 

def getPidCPU(pid): 
    f=open("/proc/"+ str(pid) +"/stat","r") 
    ln=f.readline() 
    f.close() 
    a=ln.split(" ") 
    return int(a[13])+int(a[14]) 

cpu1=getCpuTot() 
cpupid1=[] 
for pid in pids.split(","): 
    cpupid1.append(getPidCPU(pid)) 
time.sleep(1) 
cpu2=getCpuTot()  
cpupid2=[] 
for pid in pids.split(","): 
    cpupid2.append(getPidCPU(pid)) 


i=0 
for pid in pids.split(","): 
    perc=int(cpuNum*(cpupid2[i]-cpupid1[i])*100/float(cpu2-cpu1)) 
    i+=1 
    print pid,perc