我的简单问题: 如何增加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分钟内有30.000个虚拟用户,每个用户发出4个请求(2个读取数据库,1个读取数据,1个不使用数据库)。 由于错误太多(由DB超时引起),大约两分钟后失败。
关于硬件,这个设置应该能够处理测试请求,不应该吗? 所以我希望我只是错过了明显的,并且有一个参数必须进行调整以使一切正常。
答案 0 :(得分:4)
我强烈建议第一个问题不在于服务器的配置,而在于您的测试方法和对所见内容的解释。
点击max_connections最初不会导致“db timeouts”。它会导致连接错误,因为服务器主动拒绝过多的连接尝试,拒绝进一步协商。这与超时不同。
在什么时候,在什么操作中,是否发生了超时?初始连接阶段?这与max_connections没有关系,至少不是直接关联。
您观察到的最大连接数似乎是一个可疑的圆形数字,甚至可能来自您的测试参数......您提到了30000个用户,10分钟和4个请求......以及30000×4÷10÷10 = 1200。是的,我扔了“10”两次没有特别的原因除了1200之外似乎非常可疑。我想知道,如果您使用15000个用户,这个数字是否会从1200下降到600.这值得研究。
重要的是,要为30000个并发用户提供服务,您的应用程序不需要30000个数据库连接。如果确实如此,它的写得非常非常糟糕。我不知道你是如何测试这个,但只有一个天真的实现给定所述参数将假定应该建立30000个连接。
同样重要的是,无论大小如何,与单个MySQL服务器的30000个连接似乎完全脱离现实,除了可能带有线程池,这在RDS中使用的MySQL版本中是不可用的。如果您要成功创建那么多连接,在冷服务器上或没有大量线程缓存的连接已经预热,那么操作系统可能需要几分钟才能允许MySQL创建许多新线程。你确实会在这里看到超时,因为操作系统不会让服务器跟上传入的需求,但它与max_connections无关。
此时您最有可能的路径似乎不是假设max_connections实际上没有设置为它声明的值,并且缩小测试参数,看看行为如何变化并从那里开始努力了解实际发生的事情。您的测试参数也需要与您尝试测试的实际工作负载有关。
答案 1 :(得分:0)
感谢Michael和同事的提示,我终于能够解决这个问题了: 正如迈克尔已经认为的那样,这不是由DB造成的。 答案隐藏在Apache配置中,在DB问题似乎毫无疑问(最终)之后我接受了检查。
我的所有八个EC2实例都受到MaxRequestWorkers = 150( - > 8 * 150 = 1200)的限制。 对于每个假期管理员来说,显而易见的是我一天。 至少现在一切都在工作。