• 0
  • 0
分享
  • 性能测试中获取JVM资源信息
  • FunTeste 2023-04-03 13:26:52 字数 3031 阅读 784 收藏 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这个类库实现的。看了一下文档,功能非常强大,有兴趣的可以直接上这个。


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   其实软件测试入门并不难  我们自己生活中就有接触过很多跟软件测试相关的操作。而要是从事软件测试的工作,就是需要对软件进行更加系统的测试,并把你所测试的东西进行归纳总结,对软件整个使用和运行情况做一个系统、规范的报告。  软件测试的学习大致可以分为两大类,一是:理论学习;二是:项目实操;理论部分相对实操来说会简单一些, 但理论知识是实操学习的基础,所以说想要学好测试理论和实操二者缺一不可。  软件测试风口已至  在很多人的影响中,互联网中的技术岗一直以高薪吸引着很多人想要进入这个行业里面去。  所以就有很多零基础的小伙伴一直有想要进入互联网行业的想法。但是他们都会带有些“畏惧”的成分。  因...
            0 0 866
            分享
          • 前言一、 规范性能测试实施流程的意义规范的性能测试实施流程能够加强测试工作流程控制,明确性能测试各阶段应完成的工作,指导测试人员正确、有序的开展性能测试工作,提高各角色在性能能测试中的工作效率。本次分享的性能测试实施流程是性能测试开展的” 指导方针”,希望帮助您可以早日成为性能测试” 达人”。二、 性能测试实施流程性能测试流程分为五个阶段,分别是【需求调研阶段】→【测试准备阶段】→【测试执行阶段】→【测试报告阶段】→【测试总结阶段】。每个阶段做什么事情?重点关注什么?1. 需求调研阶段1.1. 阶段概述调研阶段的主要工作为:组建工作小组、项目创建、需求分析、模型构建、定制性能测试详细实施计划。...
            0 0 593
            分享
          • 接口测试的测试要点,你知道都有哪些吗?接口测试是软件测试中的重要组成部分,它的目的是评估接口的质量和可靠性,以保证系统的正常运行。在进行接口测试时,必须要考虑到以下几个方面:测试用例的编写 测试用例是接口测试的基础,它决定了测试的质量和可靠性。在编写测试用例时,需要考虑到接口的功能要求、输入输出、异常情况等。同时,测试用例必须详细、准确、明确,以保证测试的准确性。测试数据的准备 测试数据是测试的关键,它决定了测试的可靠性。在准备测试数据时,需要考虑到数据的真实性、有效性、合理性等。同时,测试数据必须真实、有效、合理,以保证测试的可靠性。团队协作 测试人员与开发人员、其他相关人员的协作对于接口测...
            0 0 743
            分享
          • 思路流程信息收集服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等)网站指纹识别(包括,cms,cdn,证书等),dns记录whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等)子域名收集,旁站,C段等google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等传输协议,通用漏洞,exp,github源码等漏洞挖掘浏览网站,看看网站规模,功能,特点等端口,弱口令,目录等扫描,对响应的端口进行漏洞探测,比如 rsync,心脏出血,mysql,ftp,ssh弱口令等。XSS,SQL...
            7 8 16693
            分享
          •   安全性测试的目的是发现危害手机中数据的安全和完整性的错误和缺陷。发现安全错误通常是比较困难的,软件通常功能运行正常但却不安全。  一、软件权限  APP软件权限包括:网络通信、信息发送、自动启动、 媒体录制、读取用户信息、写入用户数据等权限,因关系到用户个人信息和隐私的保护,需对软件权限和访问安全机制进行测试。  网络通信  信息发送  自动启动权限  媒体录制权限  读取用户信息  写入用户数据  二、安装&卸载  安装  1、应用程序应能正确安装到设备驱动程序上;  2、能够在安装设备驱动程序上找到应用程序的相应图标;  3、是否包含数字签名信息;  4、JAD文件和JAR包中...
            0 0 196
            分享
      • 51testing软件测试圈微信