繁体   English   中英

如何诊断极慢的 AWS RDS MySQL 性能?

[英]How to diagnose extremely slow AWS RDS MySQL Performance?

我的数据库有大约 15 个表,每个表有 40 列,每个表有 10.000 行。 其中大部分带有 VARCHAR、一些索引和外键。

有时我需要重建我的数据库(设计缺陷,正在处理它),这在本地大约需要 40 秒。 现在我正在尝试对 AWS RDS MySQL 5.75 实例执行相同的操作,但这需要很长时间,大约需要 40-50 分钟。 上一次我不得不做同样的过程不超过 5 分钟,仍然比本地的 40 秒多,但我很满意。

我的互联网速度约为 35 Mbps 下载 / 5 Mbps 上传。 我知道它并不快,但它是一致的,并且自从我上次重建以来它没有改变。

我启用了常规日志,但我只能看到 INSERT 查询,偶尔会看到一些“SELECT 1”。 我确实有相同的空间来改进我的代码,但是从 00:40:00 到 50:00:00,似乎还有其他事情发生。

关于如何诊断和找到瓶颈的任何想法? 谢谢

--

附加相关信息:它是来自 AWS 的 Micro 实例,所有相关监控指标基本持平:CPU 在 4%,Free Storage Space 在 20.000 MB,Freeable Memory 在 200 MB,写入 IOPS 在 2,5 左右,服务器运行 5.7.25 MySQL、1vCPU、1Gb RAM 和 20GB SSD。 这与 3 个月前我上次重建数据库时的情况相同。

SHOW GLOBAL STATUS : https://pastebin.com/jSrAzYZP SHOW GLOBAL VARIABLES : https://pastebin.com/YxD7dVhR SHOW ENGINE INNODB STATUS : https://pastebin.com/r5wffB5t SHOW PROCESS LIST : https://pastebin. com/kWwiyGwf SELECT * FROM information_schema... : https://pastebin.com/eXGBmetP

除了启用日志、最大化max_allowed_packets并将日志保存到文件之外,我没有对服务器配置进行任何重大更改。

In my backend I have a Flask app running, when it receives the API call, it takes a bunch of pickled objects and adds them all to the database (appending the Flask SQLAlchemy class to a list) and then running db.session.add_all(entries) ,尝试运行批量操作。 localhost和我的远程服务器的代码都是相同的。

在三个特定表中它确实变慢了,其中大多数都有 VARCHAR 列,但与我上次插入的没有什么不同 - 问题似乎是数据,或者代码的结构方式,或者至少看起来不合理这将导致 20 秒(本地主机)到 40 分钟(托管服务器)的时间,特别是当表的 rest 的工作方式基本相同时。

启用慢日志,设置 long_query_time=0,运行您的代码,然后将生成的日志放入 mysqldumpslow。

确定哪些查询对速度的影响最大,并从那里获取。

比较旧服务器和新服务器之间的配置。

另外,它们是否与 MySQL 版本相同? 5.6、5.7 和 8.0 可以产生非常不同的执行计划(如果它们不同,5.6 通常会提出合理的计划)。

每秒速率 = RPS

为您的 AWS RDS 参数组考虑的建议

thread_cache_size=24  # from 8 to reduce threads_created count
innodb_io_capacity=1900  # from 200 to enable more use of SSD IOPS capacity
read_rnd_buffer_size=128K  # from 512K to reduce handler_read_rnd_next RPS of 21
query_cache_size=0  # from 1M since you have QC turned off with query_cache_typ=OFF

确定 com_flush 每小时运行 13 次的原因并将其停止以避免表打开抖动。

我发现迁移到 RDS 后,我所有的数据库索引都消失了。 它们没有与架构和数据一起迁移。 确保你的索引在那里,也。 MySQL 查询缓存在 RDS 中默认是关闭的,这对初始查询的性能没有帮助。 但总的来说,它可能会加快速度。 您可以将query_cache_type设置为 1 并为query_cache_size定义一个值。 我还将thread_cache_size从 8 更改为 24 并将innodb_io_capacity从 200 更改为 1900 不知道它是否对您有帮助。 此外,创建 AWS 数据库参数组对我配置和调整数据库变量也有很大帮助。 在这里您可以阅读更多信息: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM