定期提取特定进程的CPU使用情况

时间:2012-12-09 22:19:44

标签: python regex awk cpu

我在Linux服务器上运行了一个演示程序,它消耗了相当多的CPU和内存使用量。这些参数会根据正在运行的演示的负载而不断变化。我想定期提取CPU使用率和内存使用量,即每3-4秒一次,并创建提取结果的图。

将流程视为“正在运行演示”,在我输入的终端上输入:

ps aux |grep Running Demo | awk '{print $3 $4}'

这为我提供了Running Demo的CPU和内存使用情况。但我想要接下来的两件事,即 1)每3-4秒输出一次该结果。 2)制作生成结果的图表。

任何帮助或建议都将受到高度赞赏。我是这个社区的先驱。

由于

2 个答案:

答案 0 :(得分:4)

您要做的事情是众所周知的现有项目:

请参阅Munin

示例

enter image description here

注意

  • 它得到了开源社区的支持,所以......
  • 会更强大
  • 不要运行像ps aux |grep Running Demo | awk '{print $3 $4}'ps auxw | awk '/Running Demo/{print $3 $4}'
  • 这样的奇怪命令
  • 存在许多插件,适用于基础知识:CPU,RAM,FW,Apache等等
  • 如果您真的需要gnuplot,请参阅护目镜搜索的前三名http://blah.token.ro/post/249956031/using-gnuplot-to-graph-process-cpu-usage

答案 1 :(得分:0)

以下python脚本接受输出文件名(png)和一个或多个pid。当你按ctrl-C它停止并使用gnuplot生成一个漂亮的图形。

#!/usr/bin/env python
import os
import tempfile
import time
import sys

def total(pids):
    return [sum(map(int, file('/proc/%s/stat' % pid).read().split()[13:17])) for pid in pids]

def main():
    if len(sys.argv) == 1 or sys.argv[1] == '-h':
        print 'log.py output.png pid1 pid2..'
        return
    pids = sys.argv[2:]
    results = []
    prev = total(pids)
    try:
        while True:
            new = total(pids)
            result = [(new[i]-prev[i])/0.1 for i, pid in enumerate(pids)]
            results.append(result)
            time.sleep(0.1)
            prev = new
    except KeyboardInterrupt:
        pass
    t1, t2 = tempfile.mkstemp()[1], tempfile.mkstemp()[1]
    f1, f2 = file(t1, 'w'), file(t2, 'w')
    print
    print 'data: %s' % t1
    print 'plot: %s' % t2
    for result in results:
        print >>f1, ' '.join(map(str, result))
    print >>f2, 'set terminal png size %d,480' % (len(results)*5)
    print >>f2, "set out '%s'" % sys.argv[1]
    print >>f2, 'plot ' + ', '.join([("'%s' using ($0/10):%d with linespoints title '%s'" % (t1, i+1, pid)) for i, pid in enumerate(pids)])
    f1.close()
    f2.close()
    os.system('gnuplot %s' % t2)

if __name__ == '__main__':
    main()