async-profiler的使用与RocketMQ性能优化案例

使用 async-profiler 进行 Java 程序性能调优 async-profiler 是一款高性能的 Java 性能分析工具,它可以用于分析 Java 应用程序的 CPU 和内存性能。通过生成火焰图(Flame Graph),async-profiler 可以直观地展示函数调用栈的性能数据,帮助开发者快速识别性能瓶颈和优化目标。async-profiler 是一款强大的 Java 性能分析工具,通过生成火焰图,可以帮助开发者直观地识别性能瓶颈和优化目标。 阅读详情

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 andreturn 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
                    andthen 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 脚本

$ ./producer.sh -n xxxx(nameServer address:port)
  1. 在两台部署了Broker的机器中任意一台启动内存分配监控生成火焰图,命令如下:

$ ./profiler.sh -d 120 -e alloc -f alloc.html $JVM_PID
  1. 等待步骤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 方法:

@OverridepublicsynchronizedintinSyncReplicasNums(finallong masterPutWhere){
        return syncStateSet.size();
    }

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

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

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

3. 常用工具对比

【Linux】async-profiler async-profiler 本文涉及的图片取自Profiling JVM Applications in Production async-profiler是一个对系统性能影响很少的Java采样分析器,不会存在安全点偏差问题. 它具有特定于HotSpot的API,以收集堆栈跟踪并跟踪内存分配。探查器可与基于HotSpot JVM的OpenJDK,Oracle JDK和其他Java运行时一起使用。... 阅读详情

相关推荐

性能测试与优化实战:从JMeter压测到瓶颈定位与系统调优

性能测试与优化是保障软件系统稳定高效运行的核心工程实践。其核心原理在于通过模拟真实用户负载,对系统进行压力测试,以评估其在高并发下的表现,并识别性能瓶颈。这项技术的价值在于,它能提前暴露系统潜在风险,避免线上故障,提升用户体验和资源利用率。在应用场景上,无论是电商秒杀、金融交易还是企业级后台系统,性能都是关键考量。本文聚焦于性能工程全流程,深入探讨了如何使用JMeter等工具进行有效的压力测试,并结合实战案例,系统讲解了从网络、应用、数据库到代码层的瓶颈定位与优化策略,例如针对数据库慢查询的索引优化和应对高

weixin_33755557的博客 449

async-profiler--基础--02--命令说明

此时,可以使用-b N来增加buffer的容量。指定采样的间隔,以纳秒为单位。例如,-i 1000000 表示每1,000,000纳秒(即1毫秒)进行一次采样。用于指定要包含在或排除在采样之外的方法或类。这对于过滤掉不感兴趣的部分或专注于特定部分很有用。在生成的火焰图中折叠或隐藏某些函数。你可以通过指定线程ID或线程名称来实现这一点。可以选择其他类型的事件,如内存分配(-e alloc)。为生成的火焰图或结果文件设置标题。指定采样的持续时间,以秒为单位。该参数将结果写入指定的文件中。指定输出文件的名称。

zhou920786312的博客 1720

跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88

PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性

Lucas1211的博客 9534

async-profiler 使用教程

async-profiler 是一款针对 Java 应用的低开销性能分析工具,它能够采集 CPU 和堆内存的使用情况,并且生成火焰图(Flame Graphs)来帮助开发者直观地分析性能瓶颈。该工具利用了 HotSpot 虚拟机的特定 API 和 Linux 的 perf_events 机制,能够在不引入安全点偏差(Safepoint bias problem)的情况下进行性能分析。 ## 项目

gitblog_00720的博客 1254

基于yolo11的BGA图像目标检测

15.YOLOv8的n/s版本(如YOLOv8n-1280),或通过TensorRT量化压缩模型。3.使用自适应batch_size(如根据GPU显存动态调整),推荐16-32。为采集分辨率整数倍(如原图2592×1944,训练时缩放为640×480),保持宽高比。14.采用余弦退火学习率(cos_lr)和早停(patience=50),防止过拟合。1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验。13.部署模型后持续收集困难样本(如模棱两可的预测结果),定期迭代更新模型。

qq_47798402的博客 1205

【FPGA】Verilog代码实现温湿度传感器DHT11

#今天也是咸鱼的一天~ 因为参加Robei 杯 是要做一个机器人,先不说这个机器人具体怎么机器法,但是和外界互通的传感器肯定少不了,通过获取外界环境数据,进行处理,然后做出各种各样的功能。 先来讲个简单的模块,温湿度传感器DHT11。 DHT11介绍 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器。它具有超小体积、极低功耗的特点。它使用单根总线与单片机进行双向的串行数据传输,信号传...

Ninquelote的博客 9162

RocketMQ面试核心知识点与性能优化实战

消息队列作为分布式系统解耦的关键组件,其核心原理基于生产者-消费者模型实现异步通信。RocketMQ作为阿里开源的分布式消息中间件,采用CommitLog顺序写入和ConsumeQueue索引分离的存储设计,在保证高吞吐的同时实现消息可靠传递。在电商秒杀、金融交易等高并发场景中,通过主从架构和自动故障转移机制确保服务可用性。针对面试高频考点,需要重点掌握消息顺序性保障、延时消息时间轮算法等实现原理,同时结合实际生产经验优化sendMsgTimeout等关键参数。本文结合大厂实战案例,详解如何通过调整pull

weixin_34189116的博客 327

【人工智能的数学基础】最优传输(Optimal Transport)问题与Wasserstein距离

代表两堆石子,则问题等价于如何移动一堆石子,通过最小的累积移动距离把它堆成另外一堆石子。的不同位置分配的值。为离散型概率分布,则该优化问题可以表示为矩阵形式。表示寻找总运输成本最小的方案。放大后的上确界不会小于原来的上确界,因此不妨取。具有相同的概率分布。是概率分布,因此积分可以写作采样形式。描述了一种可行的运输方案,表示应该从位置。则最优传输问题的目标函数可以用列向量。对于一个线性规划问题,总可以写出其。的所有可能联合分布的集合,下确界。其中矩阵的每一行代表概率分布。表示寻找使得目标函数最大的。

AI天才研究院 6328

软件性能优化实战:破解功能增多导致系统变慢的瓶颈与解决方案

在软件工程中,性能优化是一个核心议题,它涉及从底层原理到上层架构的完整技术链条。其基本原理在于通过合理分配计算、内存、I/O等系统资源,减少不必要的开销,从而提升软件响应速度与吞吐量。这项技术的价值在于,它直接关系到用户体验、系统稳定性和运营成本,是构建高可用、可扩展应用系统的基石。常见的应用场景包括高并发Web服务、数据密集型应用以及实时交互系统。本文聚焦于一个普遍痛点:随着功能迭代,软件为何会变慢,并深入剖析其背后的关键瓶颈,如数据库查询、缓存策略失效等,进而提供从架构设计到代码实现的全链路性能提升方案

ciya3282的博客 363

java项目反编译工具记录,共计6个工具

java项目反编译工具记录,共计6个工具

橙-极纪元-JJYCheng 1801

BUCK-BOOST升降压电路Multisim电路仿真分析

本文分析了三极管型BUCK-BOOST升降压开关电源的工作原理。该电路结合了BUCK降压和BOOST升压拓扑,通过控制三极管Q1的高频通断,使电感L1周期性储能和释能,实现输出电压可高于或低于输入电压且极性相反。详细阐述了Q1导通和关断阶段的工作过程,推导了输出电压与占空比的关系式Vo=-D/(1-D)*Vi,并分析了不同占空比下的工作模式(降压、升压)。通过Multisim仿真验证了理论分析,当D=25%时输出降压至1.6V,D=60%时输出升压至7.5V。电路具有升降压灵活、极性反转、效率高等特点,适用

XU157303764的博客 1436

Java大厂面试全攻略:核心知识点与实战技巧

Java技术面试是开发者职业发展的重要关卡,尤其在大厂面试中,考察点往往涵盖从语言基础到分布式系统的全栈能力。理解JVM内存模型、并发编程原理等底层机制是构建技术深度的基础,而分布式事务、缓存设计等实战场景则考验工程实践能力。在系统设计中,高并发场景下的架构决策如秒杀系统、Feed流设计等高频考点,需要结合Redis、Kafka等技术组件进行方案优化。面试准备应注重源码级理解,比如ConcurrentHashMap的演进或Spring循环依赖解决机制,同时通过真实性能优化案例展示问题解决能力。掌握这些核心知

weixin_33937913的博客 437

【专栏必读】王道考研408操作系统+Linux系统编程万字笔记使用说明及章节导航

王道408考研操作系统)第一章计算机系统概述-第一节1、2:操作系统概念、概念和特征1:理解fork的作用prinf("还没有执行fork函数的本进程为:%d\n" , getpid());//其返回值是pid类型的 sleep(1);if(ret > 0) //父进程返回的是子进程ID {printf("我是父进程,我的id是:%d,我的孩子id是%d\n" , getpid() , ret);sleep(1);} } else if(ret == 0) //子进程fork返回值是0 {.........

快乐江湖的博客 3万+

Unity3D动态场景节点管理:架构设计与性能优化实战

在游戏开发与实时交互应用领域,动态内容调度与资源管理是核心技术挑战,尤其在大场景、开放世界等复杂项目中。其核心原理是通过空间分区与状态机逻辑,将场景划分为可动态加载卸载的逻辑单元(节点),实现按需加载与内存优化。这项技术的核心价值在于提升运行时性能、支持无缝大世界体验,并增强项目的可维护性与扩展性。其典型应用场景包括开放世界游戏、大地图应用、关卡编辑器以及需要运行时动态加载大量内容的3D项目。本文结合“Unity3D视频流”对实时内容调度的需求,以及“边缘节点去重算法”所体现的高效数据处理思想,深入探讨了在

weixin_33681778的博客 404

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Alibaba Dragonwell17 架构深度解析:云原生场景下40%性能提升的Java运行时优化实践

作为阿里巴巴基于OpenJDK深度优化的企业级Java运行时,Alibaba Dragonwell17在云原生架构中实现了显著的性能突破。经过阿里巴巴内部百万级服务器验证,该发行版在高并发微服务场景下可带来高达40%的吞吐量提升和30%的延迟降低,成为企业级Java应用的技术底座首选。 ## 架构设计原理:云原生环境下的JVM深度优化 Dragonwell17的核心架构创新在于对容器化环境的原

gitblog_00435的博客 165

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

从超时到硬核优化:全链路性能诊断与实战调优指南

在软件工程实践中,性能优化是提升系统响应能力和用户体验的核心环节。其原理在于通过系统化的方法识别和消除瓶颈,涉及算法效率、资源管理和架构设计等多个层面。优化的技术价值在于能够显著降低延迟、提高吞吐量,并增强系统的可扩展性与稳定性。常见的应用场景包括高并发接口、大数据量处理以及实时系统等。本次探讨聚焦于立体化性能诊断,运用APM工具与Profiler进行深度剖析,并结合JVM调优与缓存策略,系统解决从数据库访问到内存管理的复合型性能问题,实现从被动修复到主动优化的思维跃迁。

weixin_30323631的博客 300

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

2026年Java程序员核心技能与面试指南

分布式系统与云原生技术正在重塑Java开发者的技能图谱。从基础原理来看,分布式架构设计需要掌握数据分片、最终一致性等核心概念,而中间件深度应用则涉及Kafka、Redis等组件的性能调优。这些技术通过提升系统吞吐量和稳定性,在电商秒杀、金融交易等高并发场景中发挥关键作用。随着企业研发效能要求的提高,JVM调优和CI/CD实践也成为Java高级开发的必备技能。当前大厂面试特别关注候选人在分布式事务、ZGC垃圾回收器等领域的实战经验,建议开发者通过金字塔学习法系统构建知识体系。

weixin_33831196的博客 281

Java直接内存原理与实战:从零拷贝到Netty性能优化

零拷贝(Zero-Copy)是提升I/O性能的核心技术之一,它通过减少数据在用户态和内核态之间的复制次数来降低CPU开销和内存带宽消耗。其实现原理依赖于操作系统提供的直接内存访问机制,允许应用程序绕过传统的缓冲区复制流程。在Java生态中,这一技术价值通过NIO的DirectByteBuffer得以体现,它创建的直接内存区域可以被操作系统内核直接访问,从而实现高效的数据传输。在高并发、低延迟的应用场景下,如网络通信、文件读写和大数据处理,合理使用直接内存能够显著提升吞吐量。然而,直接内存的管理也带来了新的挑

weixin_30568591的博客 376

Unity脚本开发入门:从C#基础到游戏与XR应用实战

在游戏开发与XR内容创作领域,脚本编程是实现交互逻辑的核心技术。其本质是通过编写代码来定义虚拟对象的行为规则,驱动整个应用世界的运转。从基础概念上讲,脚本作为附着在游戏对象上的逻辑指令集,通常使用C#语言编写,是连接美术资源与程序功能的桥梁。理解其工作原理,关键在于掌握Unity特有的生命周期函数(如Start、Update)与组件化架构,这决定了代码的执行时机与对象间的通信方式。这项技术的核心价值在于,它使开发者能够突破预制功能的限制,灵活实现从角色控制、物理模拟到网络通信等一切自定义需求,是创造独特游戏

weixin_30684743的博客 286

高效阅读开源代码的黄金四步法与工具链配置

源码阅读是开发者深入理解技术原理的重要途径,其本质是通过逆向工程还原设计思想。掌握正确的源码分析方法能快速定位核心逻辑,常见技术包括依赖关系分析、动态调试和流程图解构。在Java生态中,Spring框架的IoC容器和MyBatis的SQL映射机制都是典型研究目标,通过单元测试切入和线程模型分析可以显著提升理解效率。现代IDE提供的调用链追踪和内存快照功能,配合PlantUML等可视化工具,能有效解决大型项目如Netty或Kafka的代码迷航问题。良好的源码阅读习惯应当包含知识沉淀体系,结合Git历史分析和性

weixin_34184158的博客 359

2026年Java技术栈趋势与高频面试题解析

Java技术栈在云原生和分布式系统的推动下持续演进,理解JVM底层机制和并发编程原理成为开发者必备技能。云原生场景中,容器化部署要求精准的JVM参数优化,例如通过-XX:MaxRAMPercentage适配K8s内存限制,避免OOMKilled。分布式系统设计更关注事务补偿机制和缓存一致性,采用Caffeine+Redis二级缓存可提升百万QPS场景性能。JVM调优方面,ZGC的STW问题需结合ConcGCThreads和SoftMaxHeapSize参数解决。这些技术不仅提升系统稳定性,也广泛应用于电商、

weixin_30613433的博客 442

2024年Java程序员求职趋势与技能升级指南

Java作为企业级开发的主流语言,其技术生态持续演进。从JVM调优到分布式架构,Java开发者需要深入理解底层原理才能应对高并发场景。随着云原生技术的普及,Kubernetes和Spring Cloud Alibaba等技术栈成为新的能力标配。在性能优化方面,JVM内存模型和MySQL索引优化仍是面试高频考点。当前就业市场呈现两极分化,基础CRUD岗位减少,而具备云原生和高并发经验的开发者更具竞争力。掌握全栈技能和DevOps实践能显著提升职业竞争力,特别是在金融科技和AI工程化等新兴领域。

weixin_30530339的博客 328
上一篇: 自阿里P8爆出1031道java面试题后,我在boss直聘狂拿千份Offer
下一篇: 疫情后的新世界,你必须知道的趋势。晋升,跳槽必备的知识和认知!
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值