mysql - 亚马逊 RDS - max_connections

标签 mysql amazon-web-services

我的简单问题: 如何增加我的 Amazon RDS 数据库的可能连接数? 我在我设置的地方使用了一个参数组

max_connections = 30000

这似乎是第一手的工作,因为

SHOW VARIABLES LIKE 'max_connections';

返回预期。 但是当我运行压力测试时,监控指标始终显示最大连接数为 1200。 所以显然必须有其他限制因素,我只是不知道。 任何帮助将不胜感激。

我的测试设置: 1 个负载均衡器 8 个胖 EC2 实例 (m4.4xlarge)(尺寸有点大,但我仍在测试) 1 DB:r3.4xlarge,具有 140 GB 内存、1 TB 存储和 10.000 预配置 IOPS

测试:30.000 个虚拟用户在 10 分钟内每个发出 4 个请求(2 个读取数据库,1 个写入数据库,1 个不使用数据库)。 由于错误太多(由数据库超时引起),大约两分钟后失败。

关于硬件,此设置应该能够处理测试请求,不是吗? 所以我希望我只是错过了明显的东西,并且有一个参数必须进行调整才能使一切正常工作。

最佳答案

我强烈建议第一个问题不是服务器的配置,而是您的测试方法和对所见内容的解释。

达到 max_connections 最初不会导致“数据库超时”。它会导致连接错误,因为服务器主动拒绝过多的连接尝试,并拒绝进一步协商。这与超时不同。

超时发生在什么时候,在什么操作期间?初始连接阶段?这不会与 max_connections 相关,至少不会直接相关。

您观察到的最大连接数似乎是一个可疑的整数,甚至可能可以从您的测试参数中推导出来...您提到了 30000 个用户和 10 分钟以及 4 个请求...并且 30000 × 4 ÷ 10 ÷ 10 = 1200。是的,除了 1200 似乎非常可疑之外,我没有特别原因两次投入“10”。我想知道,如果您使用 15000 个用户,这个数字是否会从 1200 下降到 600。这值得研究。

重要的是,要为 30000 个并发用户提供服务,您的应用程序不需要 30000 个数据库连接。如果是这样,它写得非常非常糟糕。我不知道你是如何测试这个的,但只有在给定指定参数的情况下,一个天真的实现才会假设应该建立 30000 个连接。

同样重要的是,无论大小如何,与单个 MySQL 服务器的 30000 个连接似乎完全脱离现实,除非可能使用线程池,这在 RDS 中使用的 MySQL 版本中不可用。如果您要在冷服务器上或没有大量线程缓存的服务器上成功创建那么多连接已经预热,操作系统可能需要几分钟才能允许 MySQL 创建那么多新线程。您确实会在此处看到超时,因为操作系统不会让服务器跟上传入的需求,但这与 max_connections 无关。

此时您最有可能的路径似乎不是假设 max_connections 实际上未设置为它声明的值,而是缩小您的测试参数,查看行为如何变化并从那里开始努力了解实际发生的事情。您的测试参数还需要与您尝试测试的实际工作负载相关。

关于mysql - 亚马逊 RDS - max_connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978218/

相关文章:

mysql - 可以在 MySQL 中选择最后 100 条记录,然后在一次查询中从这些结果中随机选择 10 条记录吗?

php - MySQLi 准备好的语句和 REPLACE INTO

mysql - 可怕的多重连接需要将结果限制为 144

amazon-web-services - Terraform AWS S3 - 拒绝除特定用户以外的所有人

amazon-web-services - AWS 上的 Boto 和 Python

mysql - 最好在表列中存储多个值,还是创建新表?

mysql - ORACLE SQL查询-如何使用select查询获取所有数据并将 "(null)"值替换为 '~'

amazon-web-services - AWS lambda 捕获 IoT 注册事件

swift - 无法在 Swift 3 中设置 AWSAPIGatewayClient 配置?

amazon-web-services - 是否可以使用 !Sub 将一个环境变量与 AWS 的 SAM CLI 模板中的另一个环境变量连接起来?