1. async-profiler是什么?

async-profiler是一种低开销的Java采样分析器,不会受Safepoint偏差问题的影响。它具有专门为HotSpot设计的API,用于收集堆栈跟踪信息并跟踪内存分配。分析器可以与OpenJDK、Oracle JDK和其他基于HotSpot JVM的Java运行时一起使用。

async-profiler可以跟踪以下类型的事件:

  • CPU周期

  • 硬件和软件性能计数器,例如缓存丢失、分支丢失、页错误、上下文切换等

  • Java堆中的分配

  • 内容锁定尝试,包括Java对象监视器和可重入锁

总结接一下就是能够用来对Java项目进行调优通过分析上述的一些指标。从指标中找出项目中可能存在的优化点。

1.1 如何安装

直接从github的项目地址下载对应的平台的安装包。然后将其解压到目录中即可:

安装的过程即将安装包下载解压即可完成无需复杂的步骤。

1.2 如何使用

用如下命令查看使用帮助:

$ ./profiler.sh -h Usage: ./profiler.sh [action] [options] <pid> Actions: start start profiling and return immediately resume resume profiling without resetting collected data stop stop profiling dump dump collected data without stopping profiling session check check if the specified profiling event is available status print profiling status meminfo print profiler memory stats list list profiling events supported by the target JVM collect collect profile for the specified period of time and then stop (default action) Options: -e event profiling event: cpu|alloc|lock|cache-misses etc. -d duration run profiling for <duration> seconds -f filename dump output to <filename> -i interval sampling interval in nanoseconds -j jstackdepth maximum Java stack depth -t profile different threads separately -s simple class names instead of FQN -g print method signatures -a annotate Java methods -l prepend library names -o fmt output format: flat|traces|collapsed|flamegraph|tree|jfr -I include output only stack traces containing the specified pattern -X exclude exclude stack traces with the specified pattern -v, --version display version string --title string FlameGraph title --minwidth pct skip frames smaller than pct% --reverse generate stack-reversed FlameGraph / Call tree --loop time run profiler in a loop --alloc bytes allocation profiling interval in bytes --live build allocation profile from live objects only --lock duration lock profiling threshold in nanoseconds --total accumulate the total value (time, bytes, etc.) --all-user only include user-mode events --sched group threads by scheduling policy --cstack mode how to traverse C stack: fp|dwarf|lbr|no --begin function begin profiling when function is executed --end function end profiling when function is executed --ttsp time-to-safepoint profiling --jfrsync config synchronize profiler with JFR recording --lib path full path to libasyncProfiler.so in the container --fdtransfer use fdtransfer to serve perf requests from the non-privileged target <pid> is a numeric process ID of the target JVM or 'jps' keyword to find running JVM automatically or the application's name as it would appear in the jps tool Example: ./profiler.sh -d 30 -f profile.html 3456 ./profiler.sh start -i 999000 jps ./profiler.sh stop -o flat jps ./profiler.sh -d 5 -e alloc MyAppName 复制代码

了解了大致如何使用接下来用这个工具来给RocketMQ进行性能优化。

2. async-profiler的使用和RocketMQ性能优化

在使用async-profiler给RocketMQ做性能优化之前我们首先要搭建一套MQ的运行环境:

  • 一台机器部署NameServer

  • 三台机器部署Controller

  • 两台机器部署Broker

  • 两台机器用来测试

笔者这里的机器是由他人提供的也主要是用来做RocketMQ的Controller的高可用模式测试的,如果是自己只需要搭建一个最基本的即可。

2.1 内存分配情况与RocketMQ性能优化

这里我主要是对两台Broker的机器内存分配情况做了分析生成了火焰图。具体操作如下:

  1. 在测试机器启动生产的benchmark里面的 producer.sh 脚本

  2. $ ./producer.sh -n xxxx(nameServer address:port) 复制代码

  3. 在两台部署了Broker的机器中任意一台启动内存分配监控生成火焰图,命令如下:

  4. $ ./profiler.sh -d 120 -e alloc -f alloc.html $JVM_PID 复制代码

  5. 等待步骤2的命令结束生成alloc.html

看到这里有人就会想了这个如何去做性能的优化,观察火焰图的顶部如果顶部是平顶说明有大概率存在问题,另外就是根据经验例如:

  • 数组的扩容

  • HashMap的扩容

  • Set的扩容

以上这些都是对性能有很大的影响。根据这些直接搜索:HashMap.resize

上图中的那些红色被框出来的地方就是调用了扩容的地方。找一处查看验证:

RocketMQ 优化案例 ISSUE-5802以及对应的PR-5803

2.2 锁的监控和RocketMQ锁优化

整体的步骤和上面一样,但是这次是获取lock事件。运行Broker的命令如下:

$ ./profiler.sh -d 120 -e lock -f output.jfr $JVM_PID 复制代码

生成output.jfr文件,将文件下载到本地用工具打开:

通过使用JMC工具打开找到 Lock Instances 这里发现了一个熟悉的Monitor class: AutoSwitchHAService 。

打开output.jfr笔者使用的是 JDK Mission Control

通过调用堆栈发现是调用 AutoSwitchHAService#inSyncReplicasNums 方法:

@Override public synchronized int inSyncReplicasNums(final long masterPutWhere) { return syncStateSet.size(); } 复制代码

通过分析可以知道这个方法在高可用的情况下被调用的频率极高,而使用synchronized关键字在 syncStateSet.size() 多数情况下不会改变性能会相对比较低。(此处为什么需要大家可以执行去研究一下RocketMQ 5最新的Controller模式也就是A-HA模式,笔者这里就不展开讲了)。既然发现了问题那么就针对问题进行解决,解决方案:

使用读写锁来解决这里并发的问题

RocketMQ 优化案例 ISSUE-5809以及对应的PR-5810

3. 常用工具对比

async-profiler的使用与RocketMQ性能优化案例相关推荐

  1. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  2. MySQL第12天:MySQL索引优化分析之性能优化案例实践

    MySQL索引优化分析之性能优化案例实践 执行计划中各select_type含义可以看:MySQL第11天:MySQL索引优化分析之性能分析 https://weibo01.blog.csdn.net ...

  3. Android 性能优化案例

    2019独角兽企业重金招聘Python工程师标准>>>         之前看到一篇关于优化Android性能的文章,写的很不错.但由于一直没有使用过,最近恰好优化Performan ...

  4. 【中亦安图】清算/报表/日终跑批程序之性能优化案例(5)

    第一章 技术人生系列 · 我和数据中心的故事(第五期)-清算/报表/日终跑批程序之性能优化案例(一) 中亦安图 | 2016-02-18 21:40 前言 不知不觉,技术人生系列·我和数据中心的故事来 ...

  5. Spark的性能优化案例分析(下)

    前言 Spark的性能优化案例分析(上),介绍了软件性能优化必须经过进行性能测试,并在了解软件架构和技术的基础上进行.今天,我们通过几个 Spark 性能优化的案例,看一看所讲的性能优化原则如何落地. ...

  6. AntDB 落地某省电信大数据中心项目的性能优化案例分享

    亚信科技AntDB 落地某省电信大数据中心项目的性能优化案例分享 某省电信大数据中心项目采购了一套亚信科技AntDB 3.1分布式数据库,2018年8月初开始建设,建设周期一个月.9月份投入运行后,至 ...

  7. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  8. Android性能优化案例研究(上)

    为什么80%的码农都做不了架构师?>>>    英文原文:Android Performance Case Study  编译:ImportNew - 孙立 译 者前言: 这是Goo ...

  9. AMD OpenCL大学课程(12) 性能优化案例NBody

    本节主要介绍NBody算法的OpenCL性能优化. 1.NBody NBody系统主要用来通过粒子之间的物理作用力来模拟星系系统.每个粒子表示一个星星,多个粒子之间的相互作用,就呈现出星系的效果. 上 ...

最新文章

  1. 关于学习Python的一点学习总结(33->继承中内置方法及多继承)
  2. linux——shell 中的运算
  3. ACL 2016 | CopyNet 和 Pointer Softmax
  4. Angular Light 指令用法
  5. BZOJ 2648 SJY摆棋子(KD-Tree)
  6. Java提高篇——JVM加载class文件的原理机制
  7. php debug 打印变量_PHP_Debug显示所有变量
  8. 数据挖掘十大经典算法(转载)
  9. python将一行作为字段_Python 变量代入,指定某一行截取输出字段怎么办?
  10. strchr,wcschr 及strrchr, wcsrchr,_tcschr,_tcsrchr函数
  11. 用PHP生成随机数的函数
  12. Chrome默认开启flash
  13. protues 快捷键和元件
  14. Python 的切片为什么不会索引越界?
  15. (总结1)多机器人系统动态任务分配
  16. 数据库 SQL :数据库三大泛式简谈
  17. 游泳馆会员管理系统功能图
  18. 大学生考华为认证HCIP需要做那些准备?
  19. 华为私有云的搭建方案_Kali linux 搭建私有云
  20. 校招c语言笔试题数组,华为校园招聘考试C语言C笔试题

热门文章

  1. shp文件格式说明(二)
  2. 知识:什么是进销存软件系统?
  3. 产品销售份额数据统计流程图模板分享
  4. Microsoft Edge浏览器网页改为纯黑色(将浏览器网页底色改为黑色)
  5. html怎么画正方形的斜线,html – 斜线的样式
  6. 乐观中谨慎 招聘调薪现贫富差距
  7. java8学习整理二
  8. mybatis一个怪异的问题: Invalid bound statement not found 作者及来源: babyblue - 博客园 收藏到→_→: 摘要: mybatis一个怪异
  9. Express响应方法
  10. WCF实现双工通讯及客户端调用