一次数据库上云迁移性能下降的排查

简介:

背景介绍:

某客户目前正在将本地的业务系统迁移上云,测试过程中发现后台运营系统,在rds上运行时间明显要比线下PC上自建数据库运行时间要慢1倍,导致客户系统割接延期的风险。用户线下一台PC服务器的性能居然还比顶配的RDS跑的快,这让用户对RDS的性能产生了质疑,需要立刻调查原因。

问题分析:

通常SQL的执行时间在同等数据量的情况下发生变化主要有以下一些场景,其主要原因是由于优化器生成的执行计划发生了改变,这样则会导致SQL的执行时间发生较大的变化,当然可能变慢,也有可能变快,变慢是我们不想看到的场景:

1、  数据库跨平台迁移(PG->MySQL、ORALCE->MySQL)

多次遇到数据库从Oracle迁移到MySQL后,由于MySQL的优化器在低版本(5.6以下版本)对子查询的优化较差,导致系统迁移到MySQL后,系统中大量的子查询SQL堆积一直没有返回,导致数据库连接数跑满,数据库的CPU 100%。

2、  跨版本升级(MySQL:5.1->5.5、5.5->5.6)

也曾经遇到由于数据库在版本(5.5->5.6)升级后原先正常执行的SQL变得奇慢务必,导致整个升级迁移不得不回退,其主要原因高版本(5.6)的优化器策略与低版本(5.5)不同,导致了SQL执行计划发生变化,进而导致了sql的性能急剧下降;

问题排查:

1.确定优化器版本:

先确认用户本地的数据库版本和RDS的版本是否是一致的:用户本地的版本5.6.25,RDS的版本5.6.16,所以在大版本上没有太大的区别;由于在小版本上有一些差异,需要确认一下优化器中支持的优化类型是否一致,发现优化类型没有区别:

OPTIMIZER_SWITCH:

index_merge=on,index_merge_union=on,index_merge_sort_union=on,

index_merge_intersection=on,engine_condition_pushdown=on,

index_condition_pushdown=on,mrr=on,mrr_cost_based=on,

block_nested_loop=on,batched_key_access=off,materialization=on,

semijoin=on,loosescan=on,firstmatch=on,

subquery_materialization_cost_based=on,use_index_extensions=on

2.确定SQL执行计划:

既然优化器的版本是一致的,所以接下来在确认以下SQL的执行计划是否一致,由于这些SQL都是后台运行统计分析使用,所以都非常的复杂,有可能某些表的统计信息不准确,则可能导致执行计划发生变化。对比用户和RDS两边的SQL执行计划,并没有发现执行计划发生了特别大的变化,一些小表的执行顺序发生了一些变化,不过没有太大的影响,因为执行计划的所涉及总rows没有太大的变化:rows=39900*1*1*140*285*1*1*1*1*1*1*1;

3.确定参数配置:

在优化器以及SQL执行计划上没有太多的进展后,我们又开始关注用户的数据库参数配置与RDS是否有差异,因为RDS的一些性能参数是保持官方默认的配置,是否在这里出了问题,所以将用户本地数据库的配置文件拉出来进行了对比,发现了重大线索,用户的参数文件中特意调大很多会话级别的内存参数,而在RDS这些参数都是默认的配置:

用户配置:

join_buffer_size = 128M

read_rnd_buffer_size = 128M

tmp_table_size = 128M

RDS配置

join_buffer_size = 1M

read_buffer_size = 1M

tmp_table_size =256K

可以看到用户调整的这些会话级别的内存参数,可以帮助每一个查询的中间计算结果尽可能的在内存中完成,避免查询的中间结果落盘导致性能的下降,但由于这些参数都是会话级别的参数,一个查询就会分配对应大小的内存,则会导致数据库的内存消耗非常快,可能会导致数据库出现OOM,当然如果是一些后台执行不是很频繁的查询,通过调整相关的参数,确实可以提升SQL的执行性能。在调整了上述参数后,尤其是tmp_table_size与用户配置一致后大部分的SQL性能与用户本地的持平,该参数用于决定内部内存临时表的最大值,每个线程都要分配(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值),如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。如果需要的话并且你有很多group by语句,并且你有很多内存,增大tmp_table_size(和max_heap_table_size)的值。

4.确定硬件配置:

在解决了大部分查询性能后,还发现还有一些SQL的执时间还是存在一些差异,所以在软件配置上没有太大的斩获后,我们的思路想到了是否是硬件配置出现了问题。由于数据库的内存配置都是比较大的,我们自然而然的想到了CPU的配置是否是一致,对比发现用户本地的PC服务器的CPU主频配置比RDS的CPU主频配置高出了20%,同时使用纯CPU计算的SQL在两边的环境进行压测,压测中也发现用户环境SQL的执行时间是RDS的一倍,所以解决办法就是升级主机的CPU主频配置,或者从业务或者数据库层面对SQL进行优化。

总结:

  1. 本次排查问题的过程中,在SQL执行计划上耗费了较多时间,可以对比执行计划中消耗的rows来判断执行计划是否存在较多的问题;
  2. 参数的不一致是导致此次问题的重要原因,由于有一些SQL不会受限于这些参数的影响,导致没有对这些参数进行深入的测试;
  3. 硬件问题是此次问题没有想到的一个点,所以当性能出现问题后,不仅要对比软件配置,同时也需要关注硬件上的配置是否一致。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
12月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
654 158
|
12月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
12月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
767 156
|
12月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
826 161
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
1850 1
|
存储 关系型数据库 数据挖掘
【瑶池数据库动手活动及话题本周精选(体验ADB、 SelectDB,参与 RDS 迁移训练营)】(4.21-4.27)
本文为 “瑶池数据库动手活动及话题精选” 系列第一期,聚焦 SelectDB 日志分析、AnalyticDB Zero-ETL 集成、RDS 迁移训练营三大实战,设积分、实物等多重奖励,同步开启话题互动。点击链接参与,每周解锁数据库实战新场景。
|
关系型数据库 MySQL 数据库
MySQL数据库上云迁移
本文介绍了将数据库迁移到RDS for Mysql的两种主要方法:停服迁移和不停服迁移。停服迁移适合可短暂中断服务的场景,通过mysqldump或DTS完成;不停服迁移适用于需保持业务连续性的场景,推荐使用DTS实现结构、全量及增量数据迁移。文中详细列出了每种方法的具体操作步骤,帮助企业根据需求选择合适的迁移方案。
465 1
MySQL数据库上云迁移

热门文章

最新文章