写点什么

应用 SQL 性能风险识别与预警,携程金融支付 AppTrace 落地实践

  • 2020-10-28
  • 本文字数:2568 字

    阅读完需:约 8 分钟

应用SQL性能风险识别与预警,携程金融支付AppTrace落地实践

一、应用性能问题

在我们过往的测试及生产问题的分析中,常常可以发现应用执行数据库操作导致出现性能问题的情况。而这些情况中最常见的原因是 SQL 执行时,索引未能恰当的使用,例如未建索引、SQL 条件没有利用索引、索引失效等。这些问题往往占据了性能问题的 60%~80%原因。


为了应用在性能方面能安全上线,通常需要专业的性能测试及分析人员通过冗长的测试过程来进行保障,对测试人员、数据环境、测试时间等多个方面均提出了较高的要求。而组织内部往往缺乏这样的专业人员,同时互联网模式下高速的系统迭代上线也很难为专门的性能测试开展提供充足的时间资源。


为了解决这些问题,我们提出了 AppTrace 这套系统的设计。期望以简单、自动化、高效的手段达成在测试阶段把应用性能的这 60%~80%的问题都解决掉。

二、AppTrace 目标

  • 发现应用性能问题中最主要的原因之一:慢 SQL

  • 以简便的手段获取应用可能存在的 SQL 性能问题点

  • 降低测试人员发现慢 SQL 的技术难度

  • 使应用 SQL 的性能侦测覆盖率达到近乎 100%

  • 侦测分析结果与生产真实情况接近

三、目标实现基本过程


1)功能测试和接口测试时,AppTrace 抓取测试执行过程中的所有 SQL。通过功能和接口测试实现对应用功能的全量覆盖,使得应用中的 SQL 几乎都会被抓取到。


2)AppTrace 将抓取到的 SQL 请求到生产 mirror 库中去获取执行计划,以此获得与生产近似的执行分析结果。


3)对分析结果为疑似存在性能问题的 SQL 进行告警,由人工确认、优化。

四、AppTrace 原理及实现

4.1 AppTrace 结构简介


AppTrace 分为三大组件:


  • CPTrace(CtripPaymentTrace)组件 :该组件基于 BTrace 改造而来,用于抓取应用执行的 SQL 语句,并进行存储。此组件核心为两部分:

  • CPTraceClient:作用为编译通用监控脚本,使得 CPTrace Agent 具备抓取应用 SQL 的能力。

  • CPTraceAgent:功能为抓取应用的 SQL,并将其持久化保存。

  • AppTraceAgent 组件 :该组件用于将 CPTrace 抓取到的 SQL 进行解析,并通讯至 AppTrace Server 供其进行分析(采用 MQ 进行数据传输)。

  • AppTraceServer 组件 :对接收到的 SQL 调用生产 mirror 库的执行计划进行解析,对解析结果按照预设规则进行性能风险判定。

4.2 AppTrace 处理流程


如上图所示,通过这三大组件的协同工作将应用的 SQL 自动捕获并持久化存储,然后交由 AppTrace Server 完成执行计划的分析,根据分析结果并结合风险告警规则进行告警通知。

4.3. AppTrace 的技术方案

1)动态追踪目标系统中的 SQL


使用安全的 JVM 动态追踪工具 Btrace, 按照 Btrace 语法编写追踪的 SQL Java 脚本,指定方式如下:


  • 方法上的注解 @OnMethod


Btrace 使用 @OnMethod 注解定义需要分析的方法入口,在 @OnMethod 注解中,需要指定 class、method 以及 location 等,class 表明需要监控的类,method 表明需要监控的方法。



  • 属性上的注解


TLS 将一个脚本变量与一个 ThreadLocal 变量关联。



将 Btrace 脚本编译成字节码文件,执行命令 btrace <pid>btrace 脚本,Attach API 把代理包动态附加到待监控的 JVM 上去,通过代理包解析 SQL Java 脚本。使用 ASM(Java 字节码操作和分析框架)修改类 java.sql.Connection,java.sql.PreparedStatement,利用 JDK Instrumentation 动态替换类,最后将追踪到的 SQL 以及参数记录到 sqltrace.txt 文件中,追踪的 SQL 如下:



2)分析 SQL 风险逻辑与追踪 SQL 逻辑的隔离


通常情况下,追踪的应用部署成功后自动运行 SQL 追踪插件(apptrace-agent),SQL 追踪插件主要关注的是监控应用 SQL 以及参数,并且进行 SQL 与参数的匹配,最后将 SQL 语句存储在高速读写中间件里。对于分析队列中的 SQL 是否有性能风险以及告知相关负责人优化 SQL,这一部分逻辑,交由 SQL 风险分析系统(apptrace-server)去处理。


3)分析执行计划结果以及推送告警邮件


通过 DB 提供的 explain 接口在生产备库执行 explain sql,根据危险阈值分析执行计划结果确定 SQL 性能风险。对于分析执行计划的危险阈值需要可配置,我们提供了 SQL 风险告警客户端,危险阈值模块支持人工灵活修改。那么对于存在风险的 SQL,采用 soa email 方式推送告警到测试人员以及开发负责人,直到 SQL 优化无风险后终止告警。

4.4 性能分析判定手段简析

对于 SQL 性能是否存在问题的基础判定数据,我们采用了 SQL 的执行计划结果。以此数据结合我们的风险阈值进行判定。


当系统上线后数据库的记录不断增加,之前写的一些 SQL 语句或者一些 ORM 操作效率变得非常低。我们会考虑 SQL 优化,其优化大致的流程包括:


  • 定位执行效率低的 SQL 语句(定位)

  • 分析为什么这段 SQL 执行的效率比较低(分析)

  • 根据第二步分析的结果采取优化措施(解决)


而 EXPLAIN 命令的作用就是帮助我们分析 SQL 的执行情况,属于第二步。说的规范一点就是:EXPLAIN 命令是查看查询优化器如何决定执行查询的主要的方法。学会解释 EXPLAIN 将帮助我们了解 SQL 优化器是如何工作的。执行计划可以告诉我们 SQL 如何使用索引,连接查询的执行顺序,查询的数据行数,所以通过 EXPLAIN 可以反映出 SQL 存在的风险,以及指引我们优化方向。

4.5 SQL 捕获手段简析

AppTrace 系统对 SQL 捕获的核心采用的是 BTrace,根据自身需求对其进行了部分改写。


BTrace 是一个为 Java 平台开发的安全的动态追踪工具,它为用户提供了很多注解。依靠这些注解,我们可以编写 BTrace 脚本(简单的 Java 代码),它可以在不修改原有代码的情况下动态地追踪 java 运行程序,通过 hotswap 技术,动态将跟踪字节码注入到运行类中,而不必深陷于 ASM 对字节码的操作中不可自拔。同时它对运行代码侵入较小,对性能上的影响可以忽略不计,所以通过 Btrace 在不影响应用运行前提下实时追踪程序运行的 SQL,是我们后续分析 SQL 的基础。

五、小结

追踪插件与发布平台系统集成完成,应用发布成功后自动启动插件,无需人工部署插件即可追踪 SQL。目前许多应用接入了追踪插件,AppTrace 确实识别到 SQL 风险并得到了解决,同时我们也发现了些问题。随着接入的应用越来越多,后端服务处理的数据量越来越大,服务需要进一步拓展与迭代,相信在后面的迭代中 AppTrace 识别 SQL 风险能力更精准、更全面。


作者介绍


Sedro,携程资深测试工程师,专注于测试技术探索及测试工具研发。


本文转载自公众号携程技术(ID:ctriptech)。


原文链接


应用SQL性能风险识别与预警,携程金融支付AppTrace落地实践


2020-10-28 14:001505

评论 1 条评论

发布
用户头像
最关键的 SQL 捕获手段简析没说搞什么啊?是解析的binlog还是怎么做的,就这点关键
2020-10-29 10:17
回复
没有更多了
发现更多内容

​洞悉获客之道,林肯汽车开展高端社区精准营销俘获消费者芳心

联营汇聚

什么是AutodeskMaya?为什么要学习它?

Finovy Cloud

3DMAX maya

KubeVela 再升级:交付管理一体化的云原生应用平台

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

CuPL 利用大规模的语言模型,更高效地生成提示

Zilliz

Svelte框架实现表格协同文档

葡萄城技术团队

如何对小程序进行更高效的管理

Onegun

小程序 微信小程序 小程序管理平台

安卓影像飞升时刻:vivo X90 Pro+打通HDR任督二脉

脑极体

Vivo 蔡司影像

Kyligence 成功签约阿斯利康,助力提升商业洞察质量和决策效率

Kyligence

数据分析 指标中台

SQL 嵌套 N 层太长太难写怎么办?

王磊

英特尔CEO帕特·基辛格:五大“超级技术力量”,推动人类社会发展

科技之家

嘉为蓝鲸研运一体化解决方案荣获信通院XOps领域年度明星解决方案

嘉为蓝鲸

自动化运维 嘉为蓝鲸

位运算在数据库中的实际应用

领创集团Advance Intelligence Group

数据库 位计算

揭开华为云CodeArts TestPlan启发式测试设计神秘面纱!

华为云开发者联盟

云计算 后端 华为云 企业号 1 月 PK 榜

标准升级 |《企业数字化成熟度模型IOMM标准》(企业整体视角)发布

信通院IOMM数字化转型团队

数字化转型 IOMM ICT深度观察

如何通过C#和VB.NET合并Excel文档

Geek_249eec

C# Excel VB.NET

网易伏羲预训练模型”玉言“登顶CLUE分类榜单,成绩首次超过人类水平

网易伏羲

人工智能

深度 | 新兴软件研发范式崛起,云计算全面走向 Serverless 化

阿里巴巴云原生

阿里云 Serverless 云原生

叮咚~,这份春节前突击检查应对指南请收好!

嘉为蓝鲸

自动化运维 weops 嘉为蓝鲸

21世纪啤酒与尿布的故事

码文

广告 流媒体 啤酒与尿布

聚焦技术与体验极致提升,阿里云视频云连续5年领跑!

阿里云CloudImagine

阿里云 IDC 视频云

昆仑万维深耕AIGC领域 昆仑天工助力内容创作者创造无限可能

极客天地

阿里云云边一体容器架构创新论文被云计算顶会 ACM SoCC 录用

阿里巴巴云原生

阿里云 容器 云原生

小场景解决大问题|明道云在京东方的落地实践

明道云

还在用Excel和SQL?火山引擎VeDI这款产品帮你更快处理数据

字节跳动数据平台

大数据 数据分析 企业 数据看板

免费下载 | 2023 中国技术成熟度评估曲线发布,共看六大发展趋势

博睿数据

可观测性 智能运维 博睿数据 权威报告

WeOps上新啦 | WeOpsV3.14拓展云平台能力,支持自动发现和监控告警

嘉为蓝鲸

自动化运维 weops 嘉为蓝鲸

MASA Stack 1.0 发布会圆满收官

MASA技术团队

.net 云原生 PaaS dapr MASA

如何利用极狐GitLab 轻松管理NPM依赖发布与更新?

极狐GitLab

node.js DevOps npm 依赖 极狐GitLab

实力领跑 | 旺链科技入选《2022中国区块链技术创新典型企业名录》

旺链科技

区块链 区块链技术 产业区块链

2022Q4消费级AR眼镜市场季度分析:雷鸟创新领跑,华为强势入局

易观分析

市场 消费 AR眼镜

干货 | 企业监控系统体系化建设思路

嘉为蓝鲸

自动化运维 嘉为蓝鲸 企业监控系统

应用SQL性能风险识别与预警,携程金融支付AppTrace落地实践_数据库_Sedro_InfoQ精选文章