• 0
  • 0
分享
  • 性能测试中获取JVM资源信息
  • FunTeste 2023-04-03 13:26:52 字数 3031 阅读 1082 收藏 0

在以往性能测试中,通常施压机的硬件资源不会成为压力瓶颈,但是在多任务并行的场景中,如果一个任务占用当前机器资源过多,会影响其他任务执行。或者当前用例本身存在问题,导致性能无法进一步提升,影响了性能测试执行。

根据以上场景,如果能从监控工程上得到解决自然是最好的。可以实时监控施压机和施压进程的CPU占用、内存使用、GC清空。但是,重点来了,并不是总能拥有一套完美的监控系统。这个时候,就需要自己手动解决一些痛点。

经过查阅资源,最终将方案锁定在java.lang.management.ManagementFactory这个类,看名字和路径大概能猜个七七八八了。以上我提到的信息都可以调用这个类的API获取。

CPU使用率

下面分享一下如何获取当前JVM的CPU使用情况。

    static ThreadMXBean threadBean = ManagementFactory.getThreadMXBean()

    static OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean()

    static long lastSysTime = System.nanoTime()

    static long lastUserTime = 0
    
    /**
     * 获取最大进程数N,CPU使用率N*100%
     * @return
     */
    static int getAvailableProcessors() {
        osMxBean.getAvailableProcessors()
    }

    /**
     * 获取当前线程CPU使用率,最大100
     * 已乘以100,已经除以了系统最大进程数
     * @return
     */
    static double getCpuUsage(boolean avg = true) {
        long totalTime = 0
        for (long id : threadBean.getAllThreadIds()) {
            totalTime += threadBean.getThreadCpuTime(id)
        }
        long curtime = System.nanoTime()
        long usedTime = totalTime - lastUserTime
        long totalPassedTime = curtime - lastSysTime
        lastSysTime = curtime
        lastUserTime = totalTime
        def d = avg ? (((double) usedTime) / totalPassedTime / getAvailableProcessors()) * 100 : (((double) usedTime) / totalPassedTime) * 100
        return d > 100 ? 8.88 : d
    }

这里我用了一个参数,用来区分是否返回平均使用率还是返回总使用率之和。因为在docker环境中com.funtester.utils.OSUtil#getAvailableProcessors返回值着实让我很迷惑,至今还没懂其中奥妙。

下面分享获取系统负载的方法:

    /**
     * 获取系统一分钟内的平均load
     * @return
     */
    static def getLoad() {
        osMxBean.getSystemLoadAverage() / getAvailableProcessors()
    }

同样的问题也存在这个方法中,但目前使用比较少,就没有做修改。

获取GC信息


    static List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();

    /**
     * 获取GC信息{@link com.funtester.utils.OSUtil.GCInfo}
     * @return
     */
    static def getGCinfo() {
        def infos = []
        for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
            infos << new GCInfo(gcMxBean)
        }
        infos
    }

    /**
     * GC信息类
     */
    static class GCInfo extends AbstractBean {

        String name

        int count

        int time

        GCInfo(String name, int count, int time) {
            this.name = name
            this.count = count
            this.time = time
        }

        GCInfo(GarbageCollectorMXBean gcMxBean) {
            this.name = gcMxBean.getName()
            this.count = gcMxBean.getCollectionCount()
            this.time = gcMxBean.getCollectionTime()
        }

    }

这里只能算是个输出,很少用GC信息作为独立的依据。

其他

获取内存信息:

    /**
     * 获取堆内存信息
     * @return
     */
    static def heapMemInfo() {
        memoryMXBean.getHeapMemoryUsage()
    }

    /**
     * 获取非堆内存信息
     * @return
     */
    static def noHeapMemInfo() {
        memoryMXBean.getNonHeapMemoryUsage()
    }

使用场景

目前我的使用场景主要2个:

  • 在本地执行性能测试场景中,将JVM信息定期输出,包含在性能测试数据取样的功能中。
  • 在服务执行性能测试场景中,将JVM信息作为一个资源调配的指标。例如:CPU资源占用过高,就降低一下对象池的活跃数据,主动回收一些资源。

在查阅资料的过程中,发现SDK的API很少能够直接获取硬件信息的,很多案例都是通过com.github.oshi:oshi-core:6.4.0这个类库实现的。看了一下文档,功能非常强大,有兴趣的可以直接上这个。


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 什么是接口文档?当你第一次需要将电脑连接至屏幕时,可能会被各种接口和线缆弄得一头雾水。HDMI、VGA、DVI、DisplayPort……这些名词听起来都十分专业,高深莫测。但实际上它们就像是电脑和外接设备之间的“桥梁”,帮助它们互相沟通和交流。其中,HDMI 接口可谓是应用范围最广的一种。它不仅可以将电脑与电视连接,也可以连接显示器和投影仪等其他设备。当小 A 购买了一台新的电脑后,他想要将显示画面投射至一块色准极佳的屏幕上加以扩展。此时,他只需要使用 HDMI 线将屏幕与电脑的 HDMI 接口连接,然后像魔术般,黑漆的屏幕瞬间有了灵动的画面。真的好像变魔术一样,小 A 并不需要知道屏幕与电...
            0 0 1444
            分享
          •   TestCase系统简介:  TestCase系统是一款根据业务需要的轻量级测试用例管理系统,以Case管理为核心,以测试数据持久化,用例资产化,测试产出标准化来规划测试管理;使用标准用例模板输入输出,更有利于思维发散的脑图格式展现用例,通过高质量、可复用的公共case库提升case编写效率,降低新人指导成本;同时通过对外接口对接其他系统,关联JDTest质量管理系统-用例管理-自动化测试平台-持续交付流水线-缺陷管理等要素,生成多维度交叉的测试统计数据嵌入各阶段测试报告中,助您客观评估测试进度、产品质量,有效把控产品风险。  TestCase的优势  ·它支持业务条线,项目,系统,模块等...
            8 8 2454
            分享
          •   前言  在我们写端到端测试之前,我们应该明确我们是基于一个用户的角度去测试我们的页面,所以这无关我们的所有源码,我们应该只专注于浏览器所呈现给我们的资源,包括页面上的element、控制台中network中的所有的请求以及导航栏上的url信息,这是我们可以去测试和观察到的所有的点。  语法实战  spec基本结构// https://docs.cypress.io/api/introduction/api.html import { DEV_SERVER } from '../config/conf' descri...
            0 0 1108
            分享
          •   近日,有传言称微软公司欲将其在中国设立的唯一研究机构 —— 微软亚洲研究院(MSRA)撤离中国,转移到加拿大温哥华。但 MSRA 向界面新闻明确表示:此消息不属实。  本月中旬据金融时报报道,四位知情人士透露,总部位于北京的微软亚洲研究院已经开始寻求签证,以便将顶级人工智能专家从北京转移到其在温哥华的研究所。知情人士表示,此举可能会影响 20 至 40 名员工。一位接近微软的人士表示,微软正在加拿大建立一个由来自世界各地的专家组成的新实验室。  根据微软今年 9 月发布的一篇帖子,微软在中国拥有 9000 名员工,其中逾 80% 是软件工程师或从事研发工作。该公司还宣布计划在该国再招聘 1...
            0 0 1018
            分享
          •   互动评论有礼 | 51Testing软件测试网20岁啦!感谢大家的一路相伴,在此20周年之际,小编特准备了10份精美礼品送出。让我们携手并进,期待下一个二十年~  参与方式  微信扫描下方二维码,在视频评论区讲出你与51Testing的故事或送上对51Testing的祝福。  我们将在评论区抽取5位点赞数最高的好友,和5位最走心好友每人奉上1份精品好礼(音箱、保温杯、小风扇、加湿器、体脂秤等多种礼品任选其一)~  大家多多在评论区留言互动,中奖几率会提升哦!  活动奖品  活动时间  2024年5月6日11:30-2024年5月13日15:00  *活动截止到5月13日下午15:00~活动...
            0 0 809
            分享
      • 51testing软件测试圈微信