3

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

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

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

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

任何帮助或建议将不胜感激。我是这个社区的初学者。

谢谢

4

2 回答 2

4

您正在尝试做的是众所周知的现有项目:

穆宁

例子

在此处输入图像描述

笔记

  • 它得到了开源社区的支持,所以...
  • 会更强大
  • 不要运行奇怪的命令,比如ps aux |grep Running Demo | awk '{print $3 $4}'butps auxw | awk '/Running Demo/{print $3 $4}'
  • 许多插件存在并且适用于基础:CPU、RAM、FW、Apache 等等
  • 如果您真的需要,请在护目镜搜索http://blah.token.ro/post/249956031/using-gnuplot-to-graph-process-cpu-usagegnuplot中查看前 3 名
于 2012-12-09T22:21:51.197 回答
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()
于 2014-03-23T13:01:29.660 回答