我有一个预配置的单主 RDS 数据库 (5.6.mysql_aurora.1.23.0),带有一个写入器和一个读取器。客户端是一堆码头应用程序,每个应用程序池最多有 250 个连接。
一段时间以来,我一直在与间歇性问题作斗争:连接尝试开始超时,主要是。它似乎与高负载相关,我已经开始information_schema.processlist
定期将整个复制到日志表(显然带有时间戳),当连接数达到 2000 时,问题似乎变得最明显。它永远不会接近max_connections
或max_user_connections
:
mysql> show variables like "%max%conn%";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| aurora_max_connections_limit | 16000 |
| max_connect_errors | 100 |
| max_connections | 3000 |
| max_user_connections | 0 |
+------------------------------+-------+
4 rows in set (0.03 sec)
那么,为了解决这个问题,我应该关注哪些参数?我没有发现任何可能的东西,这解释了为什么 2000 个连接似乎会导致这种情况;当然,出现这样的整数可能只是巧合。
这很可能是内存耗尽的结果。每个到数据库的连接都需要一点内存,如果每个连接需要 1MB(一个小数字),您可能会看到大约 2GB 的内存仅用于连接。
此 SQL 查询将让您知道任何单个连接可以使用的最大内存量:
检查这个数字是否太高(这是一个基于特定数据库经验的主观数字)。如果数据库定期耗尽内存,那么您可能需要内存优化实例或对每个连接可能消耗的资源数量进行更严格的限制。