资讯专栏INFORMATION COLUMN

安利一个实用小工具 oscillo:帮助你观察命令运行时在时间轴上的cpu和内存占用率

Paul_King / 933人阅读

摘要:如果使用过,如果有一颗的心的话,一定会觉得不但酷炫而且十分实用。不过如果想观察一个程序从运行开始到结束的占用率怎么办好办,利用的异步观察就行。

如果使用过glances,如果有一颗geek的心的话,一定会觉得不但酷炫而且十分实用。不过如果想观察一个程序从运行开始到结束的cpu占用率怎么办?好办,利用python的psutil异步观察就行。

介绍一下放在github上的一个项目: oscillo

使用方式

使用方式很简单,直接 pip install oscillo即可安装使用.

命令行参数的格式是 ": "

name: 命令行的别名/id (任意字符串),当--commands/-c参数指定多个命令时,该值将作为命令的唯一标识,不可重复

command [args]: 需要测试资源消耗的命令,比如 gzip file.ext

示例如下,监控gzip压缩一个文件时耗费的cpu、memory和时间:

oscillo -c "gzip: gzip file.ext" -o output-file

-c 代表将执行一个linux cmd 命令。参数后面可以跟以空格隔开的多个参数

-o 结果输出文件:

命令执行完成后,会在当前目录下生成一个.log 文件。文本结构是json 格式. 数据结构如下

{
  "test": {
            "elapsed": 0.022143125534057617,  //总执行时间
            "cpu": [], 
            "memory": []
          }
}

同时会产生一个.png文件,-o参数指定,默认值为metrix

在控制台上,oscillo会打印summary信息,其中包含命令的耗时、最大内存使用、最大cpu使用、退出码等在控制台上,oscillo会打印summary信息,其中包含命令的耗时、最大内存使用、最大cpu使用、退出码等

如果想对比多个命令对资源的消耗,可以使用 -c/--commands 选项指定多条命令, e.g.:

对比gziptar命令对资源的消耗:

oscillo -c "t1: gzip file.ext"  "t2: tar czf target.tar.gz file1" -o output

效果如下:

实现原理

这个工具的原型,来自于一次为了对比几种客户端性能而写的一个脚本,它的原理就是:

在程序中启动一个子进程,获取进程id

通过psutil观察该进程,每隔一段时间记录一次cpu和内存的负载

通过matplotlib画图

说一下其中碰到的一个坑:欲监控的子进程A在内部调用了另一个耗资源的子进程B,但是psutil只能观察到子进程A的资源消耗情况,粗暴的解决办法就是:观察全局的资源消耗情况:

class Stopwatch(object):

    def __init__(self, pid):
        self.__is_run = False
        self.__start_time = 0
        self.__elapsed_times = 0
        self.memory_percent = []
        self.cpu_percent = []
        self.pid = pid

    def start(self):
        if self.__is_run:
            return False
        self.__is_run = True
        self.__start_time = time.time()

        if self.pid > 0:
            p = psutil.Process(self.pid)
        else:
            p = psutil
            p.memory_percent = lambda: p.virtual_memory().percent
        while self.__is_run:
            try:
                self.cpu_percent.append(p.cpu_percent(1))
                self.memory_percent.append(p.memory_percent())
            except psutil.NoSuchProcess:
                break

    @property
    def elapsed(self):

        if self.__is_run:
            return self.__elapsed_times + time.time() - self.__start_time
        return self.__elapsed_times

    def stop(self):
        self.__elapsed_times = self.elapsed
        self.__is_run = False
BTW

当前的功能比较简单,可能有很多东西没用想到,欢迎使用和完善

git仓库: oscillo

原文地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43491.html

相关文章

  • 几种 Docker 监控工具对比

    摘要:在我们列举的几个监控的服务或平台中,这是唯一一款国内产品。也是一款付费监控解决方案,计划收费方案是美分小时。同样也支持监控,还包括对容器级事件的监测停止开始等等和管理容器产生的日志。由于是一个监控方案,相对来说它的安装和部署都比较简单。 轻量级虚拟化容器 Docker,自发布以来便广受业界关注,在开源界和企业界掀起了一阵风。Docker 容器相对于 VM 有以下几个优势:启动速度快;资...

    张春雷 评论0 收藏0
  • Docker 监控实战

    摘要:监控告警是运营系统最核心的功能之一,腾讯内部有一套很成熟的监控告警平台,而且开发运维同学已经习惯这套平台,如果我们针对容器再开发一个监控告警平台,会花费很多精力,而且没有太大的意义。也是一款付费监控解决方案,计划收费方案是美分小时。 如今,越来越多的公司开始使用 Docker 了,现在来给大家看几组数据: 2 / 3 的公司在尝试了 Docker 后最终使用了它 也就是说 Docker...

    william 评论0 收藏0
  • 基本性能分析,省了几百万美元

    摘要:本文是关于我如何应用基本性能分析技术,借助火焰图做了一处小改进,使得我们计算机集群的状况获得了倍的改善,并在第二年帮助节省了几百万刀。最终,通过对平均大小在的事件进行批量插入,我们的吞吐量获得了的提高。 本文是关于我如何应用基本性能分析技术,借助火焰图做了一处小改进,使得我们 Postgres 计算机集群的 CPU 状况获得了 10 倍的改善,并在第二年帮助 Heap 节省了几百万刀。针对用...

    张宪坤 评论0 收藏0
  • 了解RoboMaster视觉组(三)视觉组使用的软件

    摘要:视觉组接触的软件进行视觉开发会用到各种各样的软件开发环境辅助工具等,所以很有必要了解一些相关的快捷键命令使用技巧。没有这样保姆级的,并不存在一款能够自动为你生成的软件。一款录制屏幕的软件。 --NeoZng【neozng1@hnu.edu.cn】 3.视觉组接触的软件 进行视觉开发会用到...

    AlphaWallet 评论0 收藏0

发表评论

0条评论

Paul_King

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<