写点什么

应用 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:001651

评论 1 条评论

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

Github上标星250k的阿里Java面试复盘手册,看完竟如此的无敌?

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

2021预备秋招:Java面试必看的1000道面试解析,助你通过大厂面试

Java 程序员 架构 面试 后端

Github惊现神作,这份算法宝典让你横扫各大厂算法面试题

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

牛皮了!华为世界顶级Linux大牛总结出了3788页进阶笔记

Java~~~

Java Linux 架构 面试 运维

在GitHub发布秒获百万访问!就凭这份Java程序性能优化实战笔记?

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

封笔之作!阿里P8手写的Java高手是怎样练成的原理方法与实践笔记

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

八家知名大厂联合手写的Java面试手册刚上线!竟就到达巅峰?

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

良心!鹅厂强推的SpringCloud、Nginx高并发编程

Java~~~

Java nginx spring 架构 面试

Python代码阅读(第22篇):从源字典映射出新字典

Felix

Python 编程 Code Programing 阅读代码

阿里内部流传的JDK源码剖析手册!GitHub已获上千万的访问量

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

千金难求!火遍GitHub的这份阿里Java面试汇总已上热搜

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

啥?阿里DBA团队总监把MySQL 性能调优 金字塔,写进了800页笔记?

Java~~~

Java MySQL 数据库 架构 面试

阿里被转载上100W次的Java面试题教程!已助我拿下9家大厂offer

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

2W字!详解20道Redis经典面试题!(珍藏版)

Java redis 架构 后端 计算机

MySQL到ClickHouse的高速公路-MaterializeMySQL引擎

华为云数据库小助手

sql GaussDB dba 华为云数据库 DAS

脱钩!打工人都觉得香的Java程序员306道面试秘笈,爆肝

Java~~~

Java spring 架构 面试 微服务

爆料!前华为微服务专家纯手打500页落地架构实战笔记,已开源

Java~~~

Java spring 架构 面试 微服务

阿里五位大佬总结操作系统+程序员必知硬核知识离线版pdf火了

Java~~~

Java 架构 面试 操作系统 网络

反向压力

程序员鱼皮

架构 系统设计 大前端 后端 实时计算

五分钟搞定Docker安装ElasticSearch

咔咔

Docker 死磕Elasticsearch

卧 底 人 类 高 质 量 A I 公 司

白洞计划

IM技术分享:万人群聊消息投递方案的思考和实践

JackJiang

即时通讯 IM 群聊

GitHub惊现!全网首份开源的深入理解JVMG1GC的算法与实现手册

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

Vue进阶(八十五):vue-router Hash模式跳转及懒加载

No Silver Bullet

Vue 路由 8月日更

不愧是阿里内部“SpringCloudAlibaba学习笔记”这细节讲解,神了

Java 程序员 架构 微服务 计算机

技术干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径

蚂蚁集团移动开发平台 mPaaS

压测 网关 移动开发 mPaaS

宇宙级计算机大佬吐血整理出2224页计算机系统文档(离线版)

Java~~~

Java 架构 面试 TCP 操作系统

别再找我给你重启程序啦!让你supervisor帮你搞定

Java 程序员 架构 后端

阿里P8整理出SQL笔记:收获不止SOL优化抓住SQL的本质

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

vivo全球商城时光机 - 大型促销活动保障利器

vivo互联网技术

电商平台 优惠券 亿级架构设计 促销系统

【Google Cloud】「Contact Center AI」引领我们走向高度智能客服的时代

码界西柚

话题王者 8月日更 Contact Center AI Google Cloud

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