【问题标题】:cpu usage per process?每个进程的cpu使用率?
【发布时间】:2012-01-14 23:12:37
【问题描述】:

如何获取每个进程的 CPU 使用百分比?因此,例如,我想运行我的程序 prog 并获取它所产生的 cpu 使用率,例如:

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

有什么工具可以解决这个问题吗? 谢谢。

【问题讨论】:

  • top 是否足以满足您的目的?
  • 奥利,嗨。 top 的问题在于,出于我的目的,如果您愿意的话,它太“动态”了。我需要类似 linux time 命令的东西,只报告该进程的 cpu 使用情况。
  • 好吧,听起来你想知道你的进程使用的所有周期的百分比是在 CPU0、CPU1 等上运行的吗?在这种情况下,上面示例中的 127% 是什么意思?
  • 啊,这只是所有 CPU 的总和。因此,对于 4 个内核(上面的示例),该过程总共使用了 127% 超过 400% 的最大值。这有意义吗?
  • 那么您是说 400% 等于您的应用在其总运行时间期间充分利用的所有 4 个 CPU?

标签: linux performance


【解决方案1】:

对于火狐:

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

您必须对第三列求和(我认为这不是简单易行的方法),因为它实际上向您展示了每个线程。第一列是名称,第二个处理器,第三列,%cpu。

【讨论】:

  • awk 可以用 $3 抓住你的第三列我相信,我忘记了它的语法:\
【解决方案2】:

我认为你可以利用/proc/[pid]/stat/proc/stat中的信息来估计。

查看How to calculate the CPU usage of a process by PID in Linux from C? 的精彩答案,其中解释了如何计算单个处理器的 CPU 使用率。

您从 /proc/[pid]/stat 获得的倒数第 6 个数字是“处理器 %d,CPU 编号最后执行时间”(至少在 Ubuntu 12.04 上)。

要扩展到多个处理器,您可以对一段时间内的 CPU 使用情况进行采样,并(非常粗略地!)估计每个处理器上的时间比例。然后使用这些比例在处理器之间分配 CPU 使用率。根据/proc/stat 中的信息,您还可以对每个处理器的总时间进行采样,然后您就可以获得所需的所有变量!

有关 proc 的更多信息,请参阅http://linux.die.net/man/5/proc

【讨论】:

    【解决方案3】:

    linux process explorer 项目提供此功能,您可以在属性对话框中查看每个进程的 CPU/内存/IO 图表。

    【讨论】:

      【解决方案4】:

      这是我制作的一个简单的python:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多