AWS RDS MySQL 性能问题

AWS RDS MySQL 性能问题

我们正在将数据库从 MSSQL Server AWS RDS 实例迁移到 AWS MySQL 8.0.17 RDS 实例

我们的 Web 应用程序使用 ORM/hibernate 进行数据库交互,每个应用程序绑定一个数据库

数据库服务器当前包含 172 个数据库,每个数据库大约有 260 个表(总共 44,479 个表),设置了 1 个可以访问所有数据库的用户(从“select * from mysql.user”返回的只有 4 个其他系统/aws 用户)

启动应用程序的过程需要 ORM 检查 information_schema

不幸的是,目前启动一个 Web 应用程序需要超过 10 分钟,因为 MySQL 数据库似乎在访问 information_schema 时遇到了困难,通常会停留在“检查权限”状态长达 5 秒钟,而且每个数据库似乎要执行数百次这样的查找

在我们的临时服务器上,同一个 Web 应用程序在一分钟内启动,因为只有 8 个数据库,而不是 172 个

我们通过向临时服务器添加额外的 164 个数据库,重新创建了相同的缓慢问题,这表明问题在于服务器上的数据库/表的数量

我们已经应用了以下设置,但这并没有提高性能:

innodb_stats_on_metadata=0 innodb_stats_persistent=0

有谁对我们如何进一步优化 MySQL 以获得所需的性能有任何想法。

非常感谢任何帮助/建议以加快我们的模式查询

- - 更多信息 - -

感谢您的回复。根据要求,以下是 Pastebin URL,以获取更多信息

全球状态 - pastebin.com/Je40S48C 显示变量 - pastebin.com/FaN66Zrn

就 RAM 而言,以上数据取自临时服务器,它是一个 RDS 实例 (db.t3.small),因此只有 2GB RAM 和 2 个 vCPU。不过,我只尝试连接到 2 个数据库,其余数据库都是虚拟的,以模拟实时表数。我们最初在 db.r5.4xlarge 上注意到了这一点,它有 128 GB RAM 和 16 个 vCPU,因此我相信内存或 CPU 不是问题。一旦我们的应用程序启动并运行

答案1

每秒速率 = RPS

针对您的暂存服务器 AWS RDS 参数组 [mysqld] 部分需要考虑的建议

innodb_change_buffer_max_size=2  # from 25 (percent) set aside from buffer pool.
innodb_buffer_pool_instances=1  # from 64 - you only have 2GB RAM, to save CPU cycles
innodb_adaptive_max_sleep_delay=20000  # from 150000 for limit of 2 second delay
innodb_io_capacity=1900  # from 200 to use more of SSD IOPS capacity
read_rnd_buffer_size=128K  # from 512K to reduce handler_read_rnd_next RPS of 146,131
read_buffer_size=512K  # from 128K to reduce handler_read_next RPS of 129,135
innodb_open_files=4000  # from 300 to be paired with table_open_cache of 4000
innodb_page_cleaners=2  # from 64 since you will be running with 1 instance
innodb_parallel_read_threads=2  # from 4 for no more than # cores

您应该发现这些变化将显著减少 CPU BUSY。

您将在我们的实用脚本页面上找到可免费下载的脚本 - 特别是 findfragtables.sql 和 find-redundant-indexes.sql,它们将有助于提高性能。

答案2

我已经阅读了这篇文章并强烈建议尝试解决这个已知的错误。

Shane Bester 在我的错误报告上提出了一条建议,解释说这是一个已知错误,将在下一版本中解决。更重要的是,我尝试了一种解决方法,并取得了巨大的成功。谢谢 Shane,无论你在哪里!

internal_tmp_mem_storage_engine=内存

Shane 说道:

感谢测试数据。在 8.0.20 上找到了一种提高速度的解决方法:

SET GLOBAL internal_tmp_mem_storage_engine=MEMORY; 看来这个错误是内部提交的重复:

错误 30562964:8.0.18:SELECT DISTINCT 中的性能回归,该问题在 8.0.18 中引入,并在 8.0.21 中修复。

链接是这个 https://stackoverflow.com/questions/62469293/database-performance-drop-after-upgrade-to-mysql-8-0-20

相关内容