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时间戳
classJava 类
method方法(构造方法、普通方法)
total调用次数
success成功次数
fail失败次数
rt平均 RT
fail-rate失败率

这是一次调用的结果:

可以看到方法每秒执行26次,平均执行时间是179.44秒。从这里我们能得出两个结论:

  1. TPS是26,的确不高
  2. 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。

 

 

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

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

相关文章

AD21 PCB设计的高级应用(九)3D PDF的输出

(九)3D PDF的输出 1.3D PDF的输出2.制作PCB 3D视频 1.3D PDF的输出 Altium Designer 19 带有 3D输出功能,能够直接将 PCB 的 3D效果输出到 PDF 中。 ’(1)打开带有 3D 模型的 PCB 文件,执行菜单栏中“文件”→“导出”→“PDF3D”命令,选择…

“我,在腾讯月薪5万,离职后才明白:人越努力,只会越平庸”

那天看瑞达利欧说,他今年已经60岁了,可以说是阅人无数,但没有一个成功人士天赋异禀。 真的如他所说吗? 那张一鸣呢? 字节做到这么大,赚了这么多钱,不靠天赋,靠的是什么&#xff1…

PoseFormer:基于视频的2D-to-3D单人姿态估计

3D Human Pose Estimation with Spatial and Temporal Transformers论文解析 摘要1. 简介2. Related Works2.1 2D-to-3D Lifting HPE2.2 GNNs in 3D HPE2.3 Vision Transformers 3. Method3.1 Temporal Transformer Baseline3.2 PoseFormer: Spatial-Temporal TransformerSpati…

Grafana集成prometheus(2.Grafana安装)

查找镜像 docker search grafana下载指定版本 docker pull grafana/grafana:10.0.1启动容器脚本 docker run -d -p 3000:3000 --namegrafana grafana/grafana:10.0.1查看是否启动 docker ps防火墙开启 检查防火墙3000端口是否开启 默认用户及密码 admin/admin 登录 ht…

Python实现GA遗传算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世…

【0805作业】Linux中 AB终端通过两根有名管道进行通信聊天(半双工)(全双工)

作业一:打开两个终端,要求实现AB进程对话【两根管道】 打开两个终端,要求实现AB进程对话 A进程先发送一句话给B进程,B进程接收后打印B进程再回复一句话给A进程,A进程接收后打印重复1.2步骤,当收到quit后&am…

【Docker】DockerFile

目录 一、镜像原理 二、如何制作镜像 1、容器转镜像 2、DockerFile 三、DockerFile关键字​编辑 四、案例:部署SpringBoot项目 一、镜像原理 docker镜像是由一个特殊的文件系统叠加而成的,他的最低端是bootfs,并使用宿主机的bootfs&…

FPGA优质开源项目 – PCIE通信

本文介绍一个FPGA开源项目:PCIE通信。该工程围绕Vivado软件中提供的PCIE通信IP核XDMA IP建立。Xilinx提供了XDMA的开源驱动程序,可在Windows系统或者Linux系统下使用,因此采用XDMA IP进行PCIE通信是比较简单直接的。 本文主要介绍一下XDMA I…

继承(Inheritance)

Odoo的一个强大方面是它的模块化。模块专用于业务需求,但模块也可以相互交互。这对于扩展现有模块的功能非常有用。例如,在我们的房地产场景中,我们希望在常规用户视图中直接显示销售人员的财产列表。 在介绍特定的Odoo模块继承之前&#xf…

卸载本机已安装的node.js(v.16.13.0版本)

因为要用多版本的node,准备安装一个nvm管理,所以需要先卸载掉原来安装的v.16.13.0版本。 记录一下卸载过程 1、在系统设置-应用里卸载node 妈蛋这样卸载报错。。找了下根本没有这个路径 那就只能最简单的方法了,全部删掉 1、删除node的安装…

pygame贪吃蛇游戏

pygame贪吃蛇游戏 贪吃蛇游戏通过enter键启动,贪吃蛇通过WSAD进行上下左右移动,每次在游戏区域中随机生成一个食物,每次吃完食物后,蛇变长并且获得积分;按空格键暂停。 贪吃蛇 import random, sys, time, pygame from …

[CKA]考试之PersistentVolumeClaims

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 创建一个名字为pv-volume的pvc,指定storageClass为csi-hostpath-…

大模型使用——超算上部署LLAMA-2-70B-Chat

大模型使用——超算上部署LLAMA-2-70B-Chat 前言 1、本机为Inspiron 5005,为64位,所用操作系统为Windos 10。超算的操作系统为基于Centos的linux,GPU配置为A100,所使用开发环境为Anaconda。 2、本教程主要实现了在超算上部署LLAM…

MySQL — InnoDB事务

文章目录 事务定义事务特性事务隔离级别READ UNCOMMITTEDREPEATABLE READREAD COMMITTEDSERIALIZABLE 事务存在的问题脏读(Dirty Read)不可重复读(Non-repeatable Read)幻读(Phantom Read) 事务定义 数据库…

零代码爬虫平台SpiderFlow的安装

什么是 Spider Flow ? Spider Flow 是一个高度灵活可配置的爬虫平台,用户无需编写代码,以流程图的方式,即可实现爬虫。该工具支持多数据源、自动保存至数据库、任务监控、抓取 JS 动态渲染页面、插件扩展(OCR 识别、邮…

Windows下安装Scala(以Scala 2.11.12为例)

Windows下安装Scala(以Scala 2.11.12为例) 一、Scala2.11.12官网下载二、Scala2.11.12网盘下载三、Scala各版本下载地址四、Scala安装4.1、点击 scala-2.11.12.msi 文件安装4.2、设置环境变量 %SCALA_HOME%4.3、环境变量Path添加条目%SCALA_HOME%\bin 四…

【云原生】使用kubeadm搭建K8S

目录 一、Kubeadm搭建K8S1.1环境准备1.2所有节点安装docker1.3所有节点安装kubeadm,kubelet和kubectl1.4部署K8S集群1.5所有节点部署网络插件flannel 二、部署 Dashboard 一、Kubeadm搭建K8S 1.1环境准备 服务器IP配置master(2C/4G,cpu核心…

Vue系列第八篇:echarts绘制柱状图和折线图

本篇将使用echarts框架进行柱状图和折线图绘制。 目录 1.绘制效果 2.安装echarts 3.前端代码 4.后端代码 1.绘制效果 2.安装echarts // 安装echarts版本4 npm i -D echarts4 3.前端代码 src/api/api.js //业务服务调用接口封装import service from ../service.js //npm …

Jenkins触发器时间、次数设定

触发器触发条件介绍 触发器触发条件公式:由5颗星组成 * * * * * 分别代表:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6) 企业项目中常用场景介绍 场景1:接口脚本部分测试通过,部分还在进行,回归测试脚本执行…

数学知识(三)

一、容斥原理 #include<iostream> #include<algorithm>using namespace std;const int N 20;typedef long long LL; int n,m; int p[N];int main() {cin>>n>>m;for(int i 0;i < m;i ) cin>>p[i];int res 0;//从1枚举到2^m(位运算)for(int …