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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

背景介绍:

某客户目前正在将本地的业务系统迁移上云,测试过程中发现后台运营系统,在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. 硬件问题是此次问题没有想到的一个点,所以当性能出现问题后,不仅要对比软件配置,同时也需要关注硬件上的配置是否一致。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
43 25
|
5天前
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
6天前
|
SQL 弹性计算 安全
【上云基础系列04】基于标准架构的数据库升级
本文回顾了业务上云从基础到进阶的理念,涵盖基础版和全栈版架构。在“入门级:上云标准弹性架构基础版”的基础上,本文针对数据库升级,重点介绍了高可用数据库架构的升级方案,确保数据安全和业务连续性。最后,附有详细的“上云标准弹性架构”演进说明,帮助用户选择合适的架构方案。
|
30天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
254 0
|
1月前
|
运维 关系型数据库 MySQL
体验领礼啦!体验自建数据库迁移到阿里云数据库RDS,领取桌面置物架!
「技术解决方案【Cloud Up 挑战赛】」上线!本方案介绍如何将自建数据库平滑迁移至云数据库RDS,解决业务增长带来的运维难题。通过使用RDS MySQL,您可获得稳定、可靠和安全的企业级数据库服务,专注于核心业务发展。完成任务即可领取桌面置物架,每个工作日限量50个,先到先得。
|
2月前
|
弹性计算 关系型数据库 数据库
从自建到云端,数据库迁移全攻略
本文详细介绍了将自建数据库迁移至阿里云RDS的全过程,涵盖WordPress网站安装、数据库迁移配置及验证等步骤。通过DTS数据传输服务,实现库表结构、全量和增量数据的无缝迁移,确保业务连续性和数据一致性。方案具备零成本维护、高可用性(最高99.99%)、性能优化及全面的数据安全保障等核心优势。此外,提供了详细的图文教程,帮助用户快速上手并完成迁移操作,确保业务稳定运行。点击文末“阅读原文”了解更多详情及参与活动赢取精美礼品。
170 13
|
2月前
|
弹性计算 关系型数据库 数据库
自建数据库迁移到云数据库实操
本课程详细介绍了自建数据库迁移到阿里云RDS的实操步骤。主要内容包括:创建实例资源、安全设置、配置自建的MySQL数据库、数据库的迁移、从自建数据库切换到RDS以及清理资源。通过这些步骤,学员可以掌握如何将自建数据库安全、高效地迁移到云端,并确保应用的正常运行。
170 26
|
2月前
|
运维 关系型数据库 MySQL
自建数据库迁移到云数据库RDS
本次课程由阿里云数据库团队的凡珂分享,主题为自建数据库迁移至云数据库RDS MySQL版。课程分为四部分:1) 传统数据库部署方案及痛点;2) 选择云数据库RDS MySQL的原因;3) 数据库迁移方案和产品选型;4) 线上活动与权益。通过对比自建数据库的局限性,介绍了RDS MySQL在可靠性、安全性、性价比等方面的优势,并详细讲解了使用DTS(数据传输服务)进行平滑迁移的步骤。此外,还提供了多种优惠活动信息,帮助用户降低成本并享受云数据库带来的便利。
104 6
|
2月前
|
安全 关系型数据库 MySQL
体验自建数据库迁移到云数据库RDS,领取桌面置物架!
「技术解决方案【Cloud Up 挑战赛】」正式开启!本方案旨在帮助用户将自建数据库平滑迁移至阿里云RDS MySQL,享受稳定、高效、安全的数据库服务,助力业务快速发展。完成指定任务即可赢取桌面置物架等奖励,限量供应,先到先得。活动时间:2024年12月3日至12月31日16点。
|
2月前
|
弹性计算 安全 关系型数据库
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。

热门文章

最新文章