首页 > 编程语言 >一款Java 性能监控和统计工具——MyPerf4J!【送源码】

一款Java 性能监控和统计工具——MyPerf4J!【送源码】

时间:2024-08-13 22:26:49浏览次数:13  
标签:Java MyPerf4J 0.00 源码 2176 监控 path ASM

背景

随着所在公司的发展,应用服务的规模不断扩大,原有的垂直应用架构已无法满足产品的发展,几十个工程师在一个项目里并行开发不同的功能,开发效率不断降低。

于是公司开始全面推进服务化进程,把团队内的大部分工程师主要精力全部都集中到服务化中。服务化可以让每个工程师仅在自己负责的子项目中进行开发,提高了开发的效率,但是服务化同时也带来了其他问题:

  • 无法知道每个服务的运行情况,例如,某一台服务它目前的 QPS 是多少?它的平均延迟是多少,99% 的延迟是多少,99.9% 的延迟又是多少?

  • 某一个接口响应时间慢,如何定位是哪个方法引起的?

  • 每个服务的负载是否均衡?

  • 当服务出现抖动时,如何判断是 DB、Cache 还是下游服务引起的?

  • DB 和 Cache 响应延迟是多少?

  • 如何评估服务的容量,随着服务的调用量越来越大,这个服务需要多少机器来支撑?什么时候应该加机器?

针对以上开发中的烦恼,今天我们介绍一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具——MyPerf4J

使用场景

  • 在开发环境中快速定位 Java 应用程序的性能瓶颈

  • 在生产环境中长期监控 Java 应用程序的性能指标

特性

  • 高性能: 单线程支持每秒 1000万次 响应时间的记录,每次记录只花费 73纳秒

  • 无侵入: 采用 JavaAgent 方式,对应用程序完全无侵入,无需修改应用代码

  • 低内存: 采用内存复用的方式,整个生命周期只产生极少的临时对象,不影响应用程序的GC

  • 高精度: 采用纳秒来计算响应时间

  • 高实时: 支持秒级监控,最低 1 秒!

监控指标

MyPerf4J 为每个应用收集数十个监控指标,所有的监控指标都是实时采集和展现的。

下面是 MyPerf4J 目前支持的监控指标列表:

Method

RPS,Count,Avg,Min,Max,StdDev,TP50, TP90, TP95, TP99, TP999, TP9999, TP99999, TP100

图片

Memory

HeapInit,HeapUsed,HeapCommitted,HeapMax,NonHeapInit,NonHeapUsed,NonHeapCommitted,NonHeapMax

图片

JVM GC

CollectCount,CollectTime

图片

JVM Class

Total,Loaded,Unloaded

图片

快速启动

MyPerf4J 采用 JavaAgent 配置方式,透明化接入应用,对应用代码完全没有侵入。

下载
  • 下载并解压 MyPerf4J-ASM.zip

  • 阅读解压出的 README 文件

  • 修改解压出的 MyPerf4J.properties 配置文件中 app_namemetrics.log.xxx 和 filter.packages.include 的配置值

MyPerf4J-ASM.zip包:https://github.com/LinShunKang/Objects/blob/master/zips/CN/MyPerf4J-ASM-3.3.0-SNAPSHOT.zip?raw=true

配置

在 JVM 启动参数里加上以下两个参数

-javaagent:/path/to/MyPerf4J-ASM.jar  
-DMyPerf4JPropFile=/path/to/MyPerf4J.properties  

运行

启动应用,监控日志输出到 /path/to/log/method_metrics.log:

MyPerf4J Method Metrics [2020-01-01 12:49:57, 2020-01-01 12:49:58]  
Method[6]                            Type        Level  TimePercent      RPS  Avg(ms)  Min(ms)  Max(ms)    StdDev    Count     TP50     TP90     TP95     TP99    TP999   TP9999  
DemoServiceImpl.getId2(long)      General      Service      322.50%     6524     0.49        0        1     0.50      6524        0        1        1        1        1        1  
DemoServiceImpl.getId3(long)      General      Service      296.10%     4350     0.68        0        1     0.47      4350        1        1        1        1        1        1  
DemoServiceImpl.getId4(long)      General      Service      164.60%     2176     0.76        0        1     0.43      2176        1        1        1        1        1        1  
DemoServiceImpl.getId1(long)      General      Service        0.00%     8704     0.00        0        0     0.00      8704        0        0        0        0        0        0  
DemoDAO.getId1(long)         DynamicProxy          DAO        0.00%     2176     0.00        0        0     0.00      2176        0        0        0        0        0        0  
DemoDAO.getId2()             DynamicProxy          DAO        0.00%     2176     0.00        0        0     0.00      2176        0        0        0        0        0        0 
卸载

在 JVM 启动参数中去掉以下两个参数,重启即可卸载此工具。

-javaagent:/path/to/MyPerf4J-ASM.jar  
-DMyPerf4JPropFile=/path/to/MyPerf4J.properties  

开源地址

  • https://github.com/LinShunKang/MyPerf4J

 ——EOF——

福利:

扫码回复【酒店】可免费领取酒店管理系统源码

标签:Java,MyPerf4J,0.00,源码,2176,监控,path,ASM
From: https://blog.csdn.net/java_121388/article/details/141175351

相关文章

  • Java基础-学习笔记10
    **10内部类**内部类一个类的内部又完整的嵌套了另一个类的结构,被嵌套的类成为内部类,嵌套其他类的类称为外部类。是类的第五大成员(属性、方法、构造器、代码块、内部类)。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。classOuter//外部类{......
  • Java数组04:多维数组
    多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。多维数组的动态初始化(以二维数组为例)直接为每一维分配空间,格式如下:type[][]typeName=newtype[typeLength1][typeLength2];type可以为基本数据类型和复合数据类型,arraylen......
  • java
    markdown二级标题字体markdownmarkdownmarkdownmarkdown引用哈哈哈分割线图片![截图](C:\Users\黄刘洋\Pictures\Screenshots\屏幕截图2024-08-13161113.png)超链接点击跳转4399列表AA表格名字性别生日张三男1977.1.1代码publi......
  • Java数组03:数组使用
    数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本循环或者ForEach循环。【该实例完整地展示了如何创建、初始化和操纵数组】publicclassTestArray{ publicstaticvoidmain(String[]args){ double[]myList={1.9,2.9,3.4,3.5}; /......
  • Java数组02:数组声明创建
    1.声明数组首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:dataType[]arrayRefVar;//首选的方法或dataTypearrayRefVar[];//效果相同,但不是首选方法建议使用dataType[]arrayRefVar的声明风格声明数组变量。dataTypearrayRefVar[]风格是来......
  • JDBC在java代码中的使用
    声明对于数据库的增删改查,在使用jdbc的过程中分二类,查(DQL)语句和增,删,改(DML语句)他们的整体都分为以下五部分,只是DQL语句多了数据的处理部分。在使用之前需要导入相关的jar包 1,加载驱动器(非必要,但是建议手动加载养成好习惯)2,创建连接3,创建会话4,执行会话5,关闭会话1,数据......
  • Java数组01:数组概述
    关于数组我们可以把它看作是一个类型的所有数据的一个集合,并用一个数组下标来区分或指定每一个数,例如一个足球队通常会有几十个人,但是我们来认识他们的时候首先会把他们看作是某某对的成员,然后再利用他们的号码来区分每一个队员,这时候,球队就是一个数组,而号码就是数组的下标,当我们......
  • 基于springboot的美食推荐菜谱教程管理系统-开题免费【论文、源码】
      博主介绍:......
  • 基于springboot的大学生个人财务收入支出管理系统-JAVA.VUE【全套源码论文】
     博主介绍:......
  • Java超市收银系统(六、商品增加和修改)
    引言    当选择1时,从键盘依次录入商品信息,格式为“商品条形码,商品名称,单价,供应商”,如:“100002,笔记本电脑,3400,HP公司”,当输入的条形码在数据库中已经存在时,显示“条形码不能重复,请重新输入”,输入完毕后将该信息增加到数据库中,并显示“增加成功”,返回子菜单。输入时要对......