Arthas协助MQ消费性能优化
背景
项目中使用AWS的SQS消息队列进行异步处理,QA通过压测发现单机TPS在23左右,目标性能在500TPS,所以需要对消费逻辑进行优化,提升消费速度。
目标
消费TPS从23提升到500
优化流程
优化的思路是先分析定位性能瓶颈,再针瓶颈进行优化。
性能定位
要定位性能,先要准确评估每秒处理的消费数量,以及处理每个消息过程中,每一步操作的耗时,发现耗时大头在哪里。
准确评估消费速度(TPS)
消费消息的入口是AwsConsumer#doUpdateCoin,所以可以通过Arthas的monitor命令监控方法的执行TPS和RT。
> monitor -c 1 AwsConsumer doUpdateCoin -n 1000
这个命令会统计doUpdateCoin的调用信息,每1秒打印一次结果,总共打印1000次。通过它能定量分析消费的TPS,命令会返回以下信息。
| 监控项 | 说明 |
|---|---|
| timestamp | 时间戳 |
| class | Java 类 |
| method | 方法(构造方法、普通方法) |
| total | 调用次数 |
| success | 成功次数 |
| fail | 失败次数 |
| rt | 平均 RT |
| fail-rate | 失败率 |
这是一次调用的结果:


可以看到方法每秒执行26次,平均执行时间是179.44秒。从这里我们能得出两个结论:
- TPS是26,的确不高
- AVT-RT在179.44ms,那么一个线程TPS约等于5。
因为RT比较高,猜测在RT上还有优化的空间,下面从每条消息消费的过程,继续看是否存在瓶颈。
查看每次处理的明细
要看每次请求的信息,可以通过tt命令,它会采集方法每次执行的耗时、成功还是失败。
> tt -t AwsConsumer doUpdateCoin -n 1000
| 表格字段 | 字段解释 |
|---|---|
| INDEX | 时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。 |
| TIMESTAMP | 方法执行的本机时间,记录了这个时间片段所发生的本机时间 |
| COST(ms) | 方法执行的耗时 |
| IS-RET | 方法是否以正常返回的形式结束 |
| IS-EXP | 方法是否以抛异常的形式结束 |
| OBJECT | 执行对象的hashCode(),注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体 |
| CLASS | 执行的类名 |
| METHOD | 执行的方法名 |
这是一次调用的结果:


从这里可以看出,消息处理耗时有的大,有的小,说明处理性能不稳定。需要再深入看RT较大的消息耗时在哪里。
处理一条消息的内部耗时
要看单次处理过程中,每个步骤的耗时,一般我们会通过在代码前后记录时间,再用日志打印出来。例如:long s = System.currentTimeMillis();
这种方式效率很低,需要不断加日志,并重新部署服务。Arthas有一个trace命令,可以查看方法的调用栈信息,包括调用的方法和方法执行的耗时。
> trace AwsConsumer doUpdateCoin '#cost > 100' -n 1
这是一次调用的结果:


这个命令会打印doUpdateCoin耗时大于100ms的请求调用栈信息,可以看到doUpdateCoin方法执行了323ms,其中99.62%的耗时集中在PlayerService:loadByOpenId()方法调用。然后我们就会想看一下loadByOpenId方法到底什么地方耗时。
trace命令不能直接指定调用栈的层级,可以通过动态trace的方式,再创建一个listener去监听loadByOpenId方法,这样会把第二个listener的结果打印在前面的trace结果上。
> trace PlayerService loadByOpenId --listenerId 9


可以看到,在原来的结果上多了loadByOpenId方法调用的明细。也发现了loadByOpenId方法耗时集中在load方法上,这是ORM框架提供的方法,直接去查询数据库。所以基本可以断定,本次处理慢是由于这个查询引起的。后面就是看查询条件是没有命中索引导致了慢,还是数据库本身性能存在问题。
总结
因为本次压测是在测试数据库,所以数据库本身不稳定,虽然定位到了这个性能瓶颈,对消费逻辑优化帮助不大,需要更精准的评估线上数据库的性能。但是通过monitor命令长时间观察doUpdateCoin方法的执行情况,发现大部分时间平均RT其实是比较低的,所以不应该是单次请求慢而降低了总体的消费TPS。可能是因为SQS消息拉取阶段存在瓶颈,所以尝试加大了消费的线程数、将单条拉取改成批量拉取。重新压测后,消费TPS从23提升到了342。

相关文章:
Arthas协助MQ消费性能优化
背景 项目中使用AWS的SQS消息队列进行异步处理,QA通过压测发现单机TPS在23左右,目标性能在500TPS,所以需要对消费逻辑进行优化,提升消费速度。 目标 消费TPS从23提升到500 优化流程 优化的思路是先分析定位性能瓶颈ÿ…...
【Linux】【docker】安装sonarQube免费社区版9.9
文章目录 ⛺sonarQube 镜像容器⛺Linux 安装镜像🍁出现 Permission denied的异常🍁安装sonarQube 中文包🍁重启服务 ⛺代码上传到sonarQube扫描🍁java语言配置🍁配置 JS TS Php Go Python⛏️出现异常sonar-scanner.ba…...
C/C++实现librosa音频处理库melspectrogram和mfcc
C/C实现librosa音频处理库melspectrogram和mfcc 目录 C/C实现librosa音频处理库melspectrogram和mfcc 1.项目结构 2.依赖环境 3.C librosa音频处理库实现 (1) 对齐读取音频文件 (2) 对齐melspectrogram (3) 对齐MFCC 4.Demo运行 5.librosa库C源码下载 深度学习语音处…...
浪潮服务器硬盘指示灯显示黄色的服务器数据恢复案例
服务器数据恢复环境: 宁夏某市某单位的一台浪潮服务器,该服务器中有一组由6块SAS硬盘组建的RAID5阵列。 服务器上存放的是Oracle数据库文件,操作系统层面划分了1个卷。 服务器故障&初检: 服务器在运行过程中有两块磁盘的指示灯…...
宋浩概率论笔记(三)随机向量/二维随机变量
第三更:本章的内容最重要的在于概念的理解与抽象,二重积分通常情况下不会考得很难。此外,本次暂且忽略【二维连续型随机变量函数的分布】这一章节,非常抽象且难度较高,之后有时间再更新。...
附件展示 点击下载
效果图 实现代码 <el-table-column prop"attachment" label"合同附件" width"250" show-overflow-tooltip><template slot-scope"scope"><div v-if"scope.row.cceedcAppendixInfoList &&scope.row.ccee…...
HotSpot虚拟机之Class文件及字节码指令
目录 一、javac编译 1. 编译过程 2. 语法糖 二、Class文件 1. 文件格式 2. 常量池项目 3. 属性类型 三、Class文件实例 1. 源代码 2. javap分析Class文件 四、字节码指令 五、参考资料 一、javac编译 1. 编译过程 javac命令由Java语言编写,目的将Ja…...
关于盐雾试验
盐雾实验一般被称为盐雾试验,是一种主要利用盐雾试验设备所创造的人工模拟盐雾环境条件来考核产品或金属材料耐腐蚀性能的环境试验。 盐雾实验的主要目的是考核产品或金属材料的耐盐雾腐蚀性能,盐雾试验结果也是对产品质量的判定,是正确衡量…...
windows美化任务栏,不使用软件
1.任务栏透明: 效果图: (1).winr打开命令行 输入regedit回车打开注册表 regedit (2).在注册表中打开 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 这个路径 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explore…...
24考研数据结构-并查集
目录 5.5.2 并查集(双亲表示法)1. 并查集的存储结构2. 并查集的代码实现初始化并查时间复杂度union操作的优化(不要瘦高的树)并查集的进一步优化(find的优化,压缩路径)优化总结 数据结构&#x…...
Redis 和 Mysql 如何保证数据一致性
项目场景: 一般情况下,Redis 用来实现应用和数据库之间读操作的缓存层,主要目的是减少数据库 IO,还可以提升数据的 IO 性能。 如下图所示,这是它的整体架构。 当应用程序需要去读取某个数据的时候,首先会先…...
WSL1升级为WSL2
首先需要启用组件 使用管理员打开Powershell并运行 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform启用后会要求重启计算机 从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi获取WSL2 Linux内核更新包,…...
力扣 1049. 最后一块石头的重量 II
题目来源:https://leetcode.cn/problems/last-stone-weight-ii/description/ C题解(思路来源代码随想录):本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 …...
【广州华锐视点】葡萄种植VR虚拟仿真实训平台
随着虚拟现实(VR)技术的不断发展,越来越多的教育领域开始尝试将VR技术应用于教学中。在葡萄栽培这一专业领域,我们开发了一款创新的VR实训课件,旨在为学生提供沉浸式的互动学习体验。本篇文案将为您介绍葡萄种植VR虚拟仿真实训平台所提供的互…...
PBR材质理解整理
PBR Material 草履虫都能看懂的PBR讲解(迫真) 先前看了很多遍类似的了,结合《Unity Shader 入门精要》中的内容整理了下便于以后理解,以后有补充再添加。 光与材质相交会发生散射和吸收,散射改变光的方向,…...
从c++的角度来看ffmpeg 的架构
------------------------------------------------------------------------- author: hjjdebug date: 2023年 08月 01日 星期二 11:26:40 CST descriptor: 从c的角度来看ffmpeg 的架构 ------------------------------------------------------------------------…...
Ubuntu安装JDK与IntelliJ IDEA
目录 前言 Ubuntu 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Ubuntu安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 APT(Advanced Package Tool&…...
【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...
一个完整的http请求响应过程
一、 HTTP请求和响应步骤 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系…...
Unity通过代码切换材质
效果展示 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class MaterialSwitcher : MonoBehaviour {public Material newMaterial; // 新材质private Material oldMaterial; // 旧材质private Renderer renderer; // 渲染器组件…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...
