阿里数据库性能诊断的利器——SQL全量性能数据

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 在业务数据库调优过程中,如果数据库能记录执行过的每个SQL的性能信息,那对应用诊断性能异常问题会很有帮助。传统商业数据库在这方面做了一些探索。 阿里数据库内核产品能输出全量SQL执行性能数据,数据库的PaaS平台在这些数据基础上可以开发自动化数据库性能诊断产品。

概述

在业务数据库调优过程中,如果数据库能记录执行过的每个SQL的性能信息,那对应用诊断性能异常问题会很有帮助。传统商业数据库在这方面做了一些探索。

如ORACLE的AWR或ASH视图里记录的SQL都是参数化的SQL,并且还有去重。所以不能准确关联到有问题的业务SQL上。ORACLE的诊断思路是如果SQL性能不好,就执行计划上找原因,相应的解决方案就是调整索引、收集统计信息或者用大纲(OUTLINE)修改或固定执行计划。

MySQL没有这样的SQL历史视图,有慢日志(Slow Log)可以收集执行时间超过指定阈值(long_query_time)的SQL记录在慢日志里。MySQL的思路是只关注执行慢的SQL。不过这个记录的性能数据信息并不是很多。此外记录的SQL也只是业务SQL的很小部分。此外MySQL有查询日志(Query Log),默认是关闭的。如果打开,MySQL的性能会下降50%以上,所以生产环境基本不敢用。

在生产中,有时会碰到这种情形就是并不复杂的业务SQL突然变得很慢,其执行计划也并没有走错。单独跑这个SQL又很快。这个就让人很困惑。要分析这个问题需要认识到两点:

  1. 业务SQL在数据库的响应时间 等于SQL排队等被调度过程中的等待时间加上SQL的执行时间。当SQL请求非常高的时候,SQL工作线程非常繁忙时会引起排队。
  2. 我们从客户端监控到的SQL响应时间多是平均响应时间,只是一个时间段内全部SQL执行时间的统计值。对于具体的每个SQL,其响应时间可能在这个均值之下或者之上。或者说全部SQL的响应时间实际呈现一个类似正太分布的。

所以,如果数据库内核能记录每个SQL详细的执行信息,就能观察到上面两点。如总的时间、等待IO时间、锁等待时间和服务时间、逻辑读、物理读信息等,甚至更多。有了这些基础信息后,数据库性能诊断可以自动化,不再单纯依赖DBA的精力和能力。

阿里数据库内核的SQL全量功能

AliSQL的SQL全量日志

AliSQL是阿里巴巴数据库内核团队曾经维护的一个开源MySQL的分支,针对MySQL内核做了很多加强和优化。其中一个独特的功能就是SQL全量信息。
AliSQL的内核会在SQL执行结束时拿到执行性能信息后就答复客户端。然后异步的将SQL文本和执行性能信息以字符流形式写入一个SQL日志缓冲区。然后一个单独的日志线程循环读取该SQL日志缓冲区内容并写入到磁盘上一个管道文件。管道文件每个MySQL实例一个(实例监听端口不一样),格式为:/u01/my$port/run/mysql.fifo。这个管道文件很特殊,如果写满了需要有其他客户端连接到这个管道并消费(读取)数据。否则,内核会停止输出(写入)SQL全量性能信息。这个设计很巧妙,不用担心SQL全量日志会占用空间(管道文件的大小很小)。它需要有客户端不停的读取这个管道文件。这个客户端就是MySQL的运维平台的监控客户端。

SQL全量输出的信息格式如下:

#time:1464861208504797
#user@host:root[root] @ [127.0.0.1]
#db:chuck
#table_name:tt
select * from tt;
#query_time:0.000232
#lock_time:0.000000
#rows_sent:0
#rows_examined:0
#rows_affected:0
#innodb_pages_read:0
#innodb_pages_io_read:0
#id:342

SQL全量输出通过参数log_sql_info控制。默认是false,开启就设置为true。开启后要先保证监控客户端在读取管道文件。通过命令show Sql_log_info_status 可以查看SQL全量日志输出状态。即使在天猫双11大促期间,这个功能也是开启的,对性能的影响在2%以内,完全可以接受。

OceanBase的SQL全量日志

OceanBase是阿里巴巴和蚂蚁金服完全自主研发的通用的分布式关系型数据库,其在SQL执行和性能诊断方面的逻辑大量参考了ORACLE的设计思路。所以在OceanBase里也有执行计划、硬解析和软解析,以及类似AWR设计的性能视图等。同时OceanBase还有自己的创新就是提供了一个SQL审计的功能。

OceanBase的视图(v$sql_audit)会以类似队列形式缓存当前集群内运行的所有SQL的执行性能信息,并且包括那些执行报错的SQL(报错原因很多如内部执行超时、锁等待超时、违反约束等各种原因)。这部份数据全部在内存里,内存大小由参数控制(sql_audit_memory_limit),默认是3G。超出这个大小的SQL审计信息就遵循先入先出原则,并不会保存在磁盘文件里。当然有人可能会说如果OceanBase集群挂了这个数据不就丢失了吗?实际上由于OceanBase独特的高可用特性,不是那么容易挂掉的。此外,OceanBase运维平台(OCP)也会部署监控客户端定时拉取这个性能数据用作后面分析。
OceanBase的SQL审计功能由参数(enable_sql_audit)控制,可以针对每个节点设置是否开启。默认值是开启的(true)。同样即使在蚂蚁双11大促期间,这个参数也可以不关闭,由此可见开启这个对性能并没有什么影响。
15566305474279

OceanBase的SQL审计包含了SQL文本以及执行的详细信息,如执行节点、总耗时、等待时间、服务时间、逻辑读、影响行数、等待事件及其参数和其他信息,内容非常丰富。如下图

15566303584288
15566303765575
15566303930326

下面是查询某个节点上某个租户的某个用户的的最近的 100条SQL执行信息

SELECT /*+ read_consistency(weak) ob_querytimeout(100000000) */ substr(usec_to_time(request_time),1,19) request_time_, s.svr_ip, s.client_Ip, s.sid,s.tenant_id, s.tenant_name, s.user_name, s.db_name, s.query_sql, s.affected_rows, s.return_rows, s.ret_code, s.event, s.elapsed_time, s.queue_time, s.execute_time, round(s.request_memory_used/1024/1024,2) req_mem_mb, is_executor_rpc, is_inner_sql
FROM gv$sql_audit s
WHERE  s.tenant_id=1001 and user_name='testuser'  and svr_ip in ('11.166.84.78')
ORDER BY request_time DESC
LIMIT 100;

15566309266473

SQL全量日志的用处

数据库诊断引擎 CloudDBA

在电商有上万的AliSQL实例,上千的数据库菜鸟开发,上百个高流量敏感的核心业务。然后支持业务的DBA团队只有十几个人,其中还不乏兼职的运维平台开发人员。数据库的性能问题不能再依赖DBA去一一分析,更别提提前发现预防性能问题。当AliSQL的运维平台收集了所有实例7*24小时的SQL全量执行信息后,接入到一个数据库智能诊断平台中,就能依据一定的规则和机器学习算法去识别性能异常并告警给开发。同时平台自动读出该SQL的详细性能数据、执行计划甚至给出优化建议(如调整索引等)给到开发。极大的降低了研发同学做数据库诊断的技术门槛。在电商,这个产品叫CloudDBA,在阿里云数据库上也有一个类似的产品,思路是一样的。

下面是CloudDBA曾经某个版本的一个功能示意图。能看到全部SQL的QPS和RT,以及每个SQL在不同区间的分布状况。
15566327282811

进一步点击SQL前面的id值,显示该SQL的不同时间段的执行时间RT分布。

15566323871662

蓝色的是链接,还可以进一步做性能下钻分析。

CloudDBA的价值在于降低了业务研发做数据库诊断的技术门槛,同时解放了业务DBA的人力,专心去做更难的事情。不过也不能过度夸大其作用。作为一个大规模的性能诊断平台,无论是基于规则(DBA的经验)还是基于机器学习(计算机的经验),都是基于统计的,都可能存在”不命中“或者”误判“的情形。

OceanBase数据库云平台 OCP

同样,OCP采集了各个OceanBase集群的SQL审计信息后也提供页面可以查看TOP SQL信息,并提供SQL性能分析下钻功能。

15566345914112

点击 蓝色序号链接,可以查看SQL明细
15566346314681

这些还只是的简单的展示。在SQL审计日志信息上也可以继续发展自动诊断,定位问题SQL,并给出优化建议。

参考

更多分享,欢迎关注微信公众号:obpilot
0_5

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
1天前
|
SQL 数据库
SQL数据库基础语法-查询语句
SQL数据库基础语法-查询语句
|
1天前
|
SQL 存储 数据库
SQL数据库基础语法-增删改
SQL数据库基础语法-增删改
SQL数据库基础语法-增删改
|
1天前
|
SQL 存储 数据库
SQL数据库查询优化技巧
【5月更文挑战第6天】本文介绍了7个SQL数据库查询优化技巧,包括选择合适索引、避免`SELECT *`、使用JOIN代替子查询、优化WHERE子句、使用LIMIT、分析查询计划和定期维护数据库。通过这些方法,开发者可以提升查询效率,改善系统性能。
|
3天前
|
SQL 数据库 Windows
sql数据库安装过程,SQL数据库的安装过
本文概述了安装SQL Server数据库的步骤:准备硬件和软件环境,运行安装程序,选择安装类型,接受许可协议,设定安装路径和组件,配置实例和服务账户,选择身份验证模式,配置其他设置,然后安装并完成。安装后需检查验证SQL Server是否正常工作。确保遵循步骤以顺利完成安装。
41 3
|
7天前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结
|
8天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
818 0
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
|
13天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
14天前
|
SQL 运维 数据库
sql数据库引擎失败
sql数据库引擎失败
|
15天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询