• 由一次自建库迁移到阿里云RDS引发的性能问题。


    刚入职一互联网公司,项目正好处于计划上线的时间,由于公司前不久已经购买了rds服务,领导决定尝试一番!

    当然,新事物、云事物还是要谨慎的。安排我先把测试环境数据库迁移上去,这里吐槽一下,往rds迁移一个比较大的

    数据库是比较恶心的。2种方式:

    1、数据迁移功能

    结论:看似很好用,效率极慢,是通过访问你的数据库一点点同步数据的。强烈不推荐

    2、使用rds配套的管理平台

    结论:文件限制一百兆,幸好支持压缩文件。导入233M数据耗时121229,也就是121秒,貌似还可以。但是

    其他功能确实比较鸡肋。

    OK,以上就是插个话而已,重点看后面,总算数据导入了进入,设置了一些参数后,内外成功连接到rds,

    速度测试一番,找到开发让找了一个比较多的页面跑一下,问题就出来了,原来在ecs自建mysql的服务器上

    对应语句执行了2.8秒,rds上却执行了11.28秒,反复测试了很多遍,在RDS后台工具上,远程连接到控制台执行

    时间都是11秒-12秒左右。自建库一直2.6秒左右,发现肯定有问题,立即发起了个工单,描述了问题,就开始漫漫解决指路。

    大概过程就是让我查看explain执行计划,show profile查看执行步骤和耗时,参数优化,对比,版本,最终发现 一个可疑地方:

    那就是show profile中 有2个步骤耗时5秒,合起来占用了11秒,步骤名称为:CreatING sort index

    看图:

    至于什么意思,大家自行百度,看工程师回复:

    反正就是说我的语句不行啦,要优化,这一点我承认,语句确实比较杂乱,但是为了追求问题

    我决定继续跟踪下去,这个地方是怎么引起的。可不可以通过参数优化、废话不多说了,发现问题

    是8月26日,为了追求这个Creating sort index到底为啥会这么高,我就继续追问了下去,ok

    重点来了,又是陪她他们进行各种参数调优,没有任务进展,直至9月22日,近一个月时间,终于今天

    给了答复,看图:

     

    总体的意思呢,我总结下就是说自建库是在ecs,超出sort_buffer_size的内容可以在tmp目录执行,

    而且这个tmp目录是一个很特别的目录,他挂载在内存上,所有速度快。而RDS呢,不好意思,超出

    参数设置的内容是不会去rds物理服务器tmp目录的执行的,因为rds的产品机制是不允许的,所以超出的部分

    就转到了磁盘执行,就跟自建库产生了极大的差别,说白了就是少了一条捷径。

    问题总结:

    当查询及排序内容过多的时候,会使用内存运行,内存不够,就用物理磁盘,两者差别就在于rds本身不会去想物理机申请内存

    而自建库却可以。

    阿里云解决方法:

    1、修改sort_buffer_size 的session值,让更多的内容在内存上执行,但是高并发的环境会造成数据库内容占满,拒绝服务,

    因为这个参数是连接古来申请的时候一次性分配的。所以不宜太高。

    2、继续优化sql语句的涉及到的表的主键、索引和sql语法,这个就不啰嗦了。

    PS:此问题解决了近一个月,多次电话沟通,问题在后台高级dba分析了好久都没什么进展,造成了一个问题脱了一个月,也对我们业务

    上线产生了影响,最后不得已先用ecs建库,另外:顺便问了阿里云Postgresql也存在类似问题。请大家参考,当然说到底还是我们的sql有问题。

  • 相关阅读:
    性能02篇-性能测试工具介绍
    网关协议:CGI和WSGI
    Spring Cloud与微服务构建:Spring Cloud简介
    前端基础:HTTP 状态码详解
    Spring Cloud与微服务构建:微服务简介
    Redis 基础:Redis 事件处理
    Redis 基础:Redis 数据类型
    Redis 基础:Redis 配置
    Django 2.0 学习(22):Django CSRF
    Django 2.0 学习(21):Django Session
  • 原文地址:https://www.cnblogs.com/netsa/p/7575907.html
Copyright © 2020-2023  润新知