FunTester 性能测试中获取 JVM 资源信息

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

根据以上场景,如果能从监控工程上得到解决自然是最好的。可以实时监控施压机和施压进程的 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 个:

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

在查阅资料的过程中,发现 SDK 的 API 很少能够直接获取硬件信息的,很多案例都是通过com.github.oshi:oshi-core:6.4.0这个类库实现的。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/333459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开…

脏牛漏洞(CVE-2016-5195)复现过程(详细完整版)

1、实验环境 KaLi 攻击机 Linux靶机 靶场 实验目的&#xff1a; 掌握漏洞利用的方法 掌握脏牛漏洞的原理 提高对内核安全性的认识 2、靶场搭建 VMware导入靶场 靶场地址&#xff1a;链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。…

SEO品牌推广的核心步骤

在当今数字化的商业环境中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;品牌推广已经成为企业不可或缺的一部分。通过优化网站&#xff0c;提高在搜索引擎结果中的排名&#xff0c;企业能够更好地吸引潜在客户&#xff0c;提升品牌知名度。本文将专心分享如何做好SEO品…

线性表的顺序存储实现

前言 线性表的顺序存储及基本操作的实现 一、线性表 线性表&#xff08;List&#xff09;是由同类型数据元素构成有序序列的线性结构&#xff0c;用户处理线性表数据时常常需要初始化、查找、插入、删除、计算数据长度等操作。 线性表还包含以下几个要素&#xff1a; 表中元…

C语言编译和链接

翻译环境和运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境 .第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令 .第二种是执行环境&#xff0c;它用于实际执行代码 翻译环境 翻译环境是由编译和链接两个大过程组成&#xff0c;而…

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装

AArch64 是随 ARMv8 ISA 一起引入的 64 位架构&#xff0c;用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。&#xff0c;而不能执行 A32 或 T32 指令。但是&#xff0c;与 AArch32 中不同&#xff0c;在64位状态下&#xff0c;指令可以访问 …

ArcGIS Pro控件汇总

控件来源 我们对其一一进行查看是否有控件 查看位置 控件展示 ribbonControls 展示 代码 <controls:ProWindow x:Class"ProAppModule9.ProWindowRibbon"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:controls"clr-…

集成学习算法(Bagging 思想、Boosting思想)及具体案例

概述&#xff1a;是机器学习中的一种思想&#xff0c;通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器 1、Bagging 思想 有放回的抽样&#xff08;booststrap抽样&#xff09;产生不同的训练集&#xff0c;从而训练不同的学习器&#xff1b;…

FairGuard游戏安全2023年度报告

导 读&#xff1a;2023年&#xff0c;游戏行业摆脱了疫情带来诸多负面影响&#xff0c;国内游戏市场收入与用户规模双双实现突破&#xff0c;迎来了历史新高点。但游戏黑灰产规模也在迅速扩大&#xff0c;不少游戏饱受其侵扰&#xff0c;游戏厂商愈发重视游戏安全问题。 为帮助…

重磅发布!基于百度飞桨的《人工智能基础及应用》书籍正式上线

科技日新月异的今天&#xff0c;人工智能已经成为引领未来的核心驱动力。为了帮助大家更好地深入理解人工智能的理论和技术&#xff0c;为未来发展做好准备&#xff0c;百度飞桨教材编写组联合北京交通大学王方石教授、北京邮电大学杨煜清特聘副研究员共同撰写推出了《人工智能…

使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

在此 FFmpeg 教程中&#xff0c;我们学习使用 FFmpeg 的命令行工具更改视频的分辨率&#xff08;或调整视频的大小/缩放&#xff09;。 更改视频的分辨率&#xff08;也称为调整大小或缩放&#xff09;是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此&#…

【笔记】Helm-3 主题-6 Chart仓库指南

Chart仓库指南 本节介绍如何创建和使用chart仓库。在高层级中&#xff0c;chart仓库是打包的chart存储和分享的位置。 社区的Helm chart仓位于 Artifact Hub &#xff0c;欢迎加入。不过Helm也可以创建并运行您自己的chart仓库。该指南将介绍如何操作。 Artifact Hub 先决条…

防爆气象站需要如何维护

TH-FBCQX2 在工业生产中&#xff0c;防爆气象站是保障安全生产的重要设备之一。由于其特殊的使用环境和功能&#xff0c;防爆气象站的维护保养工作显得尤为重要。 一、日常维护保养 清洁&#xff1a;防爆气象站的外部和内部组件需要定期清洁&#xff0c;以去除灰尘、油渍和杂质…

快速入门:搭建宠物用品小程序商城的必备知识

小程序商城逐渐成为商家展示和销售产品的重要渠道。对于宠物用品商家来说&#xff0c;搭建一个宠物用品小程序商城不仅可以提高品牌知名度&#xff0c;还能吸引更多的潜在客户。本文将介绍如何通过乔拓云平台搭建宠物用品小程序商城。 首先&#xff0c;商家需要登录乔拓云平台后…

GaussDB与openGauss有什么相同和不同?

众所周知&#xff0c;GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务&#xff0c;openGauss是开源数据库&#xff0c;两者之间又是什么样的关系&#xff0c;有什么相同和不同&#xff0c;让我…

Git教程学习:03 记录每次更新到仓库

文章目录 1 检查当前文件状态2 跟踪新文件3 暂存已修改的文件4 状态简览5 忽略文件6 查看已暂存和未暂存的修改7 提交更新8 跳过使用暂存区域9 移除文件10 移动文件 现在我们的机器上有了一个 真实项目 的 Git 仓库&#xff0c;并从这个仓库中检出了所有文件的 工作副本。 通常…

【技术科普】什么是AI视频识别分析?干货满满!

视频AI识别分析是指利用人工智能技术对视频数据进行智能化检测、分析和提取有用信息的过程。通过视频AI分析&#xff0c;可以自动化地识别、检测和理解视频中的对象、动作、场景等元素&#xff0c;并进行标记或者相关处理&#xff0c;最后形成相应事件的处理和告警信息。这项技…

软件是什么?前端,后端,数据库

软件是什么&#xff1f; 由于很多东西没有实际接触&#xff0c;很难理解&#xff0c;对于软件的定义也是各种各样。但是我还是不理解&#xff0c;软件开发中的前端&#xff0c;后端&#xff0c;数据库到底有什么关系呢&#xff01; 这个问题足足困扰了三年半&#xff0c;练习时…

分布式ID(2):雪花算法生成ID

1 雪花算法简介 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示: 41-bit的时间可以表示(1L&l…

双线逆变器之低压转高压DC-DC拓扑结构

这是一个升压的过程&#xff0c;电池电压48V经过变压器等一系列的元器件最后升压到400V 如何让变压器形成正负电压&#xff1f; 通过让Q6Q7开通&#xff0c;Q6Q8关闭形成上下- 通过让Q6Q7关闭&#xff0c;Q6Q8开通形成上-下 前面四个管子和变压器的作用就是类似一个方波发生…