[英]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.