我的 AWS 控制台中有一个相当复杂的设置。
- 我在区域 A 中有一个 EC2 实例,其中安装了 LAMP,我将其称为 CRM。
- 我在同一个区域 A 中有一个用于 CRM 的 RDS,其中包含我拥有的订单/客户的信息。
- 我在区域 B 中有一个安装了 LAMP 的 EC2 实例,我将其称为“购物车”
- 我在同一个区域 B 中有一个 RDS,其中有我的购物车的数据库。
- 一些小细节(我认为):我在区域 C 和 D 中还有另外两个安装了 LAMP 的 EC2 实例,它们是辅助“购物车”。它们也有自己的 RDS 实例。
两个主 EC2 服务器通过 CURL 调用相互连接。因此,当我的 EC2 服务器 B 收到订单时,就会对我的 EC2 服务器 A 进行 curl 调用以插入订单、添加客户信息等。此外,我的服务器 A 可以对我的服务器 B 进行 CURL 调用以更新价格等。服务器 B 可以对服务器 A 进行 CURL 调用以获取到某个城市的当前运费。
现在我遇到的问题是,昨天凌晨 4 点左右,我的 RDS B 实例开始充斥着连接,并将其同时连接数限制提高到 50 个。因此,我将 t2.small 升级到 t2.medium,现在我有 90 个同时连接,但问题仍然存在,每隔几分钟到半小时就会不断达到 90 个连接的限制。
我还升级了我的 EC2 A 实例,但这同样没有任何变化。当我在 RDS B 实例上运行以下命令时,我通常会获得 6-10 个线程,但偶尔会开始激增,并且通常会在一两分钟内达到 90 个连接。
显示状态类似'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 6 |
+-------------------+-------+
1 row in set (0.01 sec)
在我的 RDS B 实例上运行以下命令时,显示当我达到 90 个同时连接限制时它正在断开连接:
显示状态如‘Conn%’;
+-----------------------------------+--------+
| Variable_name | Value |
+-----------------------------------+--------+
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 6856 |
| Connection_errors_peer_address | 0 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 123258 |
+-----------------------------------+--------+
7 rows in set (0.03 sec)
每当我在 RDS B 上获得 90 个连接时,我的 EC2 A 实例就会变得非常慢,而 RDS A 实例上的连接数会激增。我的 EC2 B 实例会发送 HTTP 500 错误,因为连接数过多导致 mysqli 连接失败。
最后,如果我在 RDS A 或 RDS B 实例上运行以下命令,我会看到很多休眠命令,但几乎没有任何查询:
显示完整流程清单;
我想到的临时“解决方案”是在 EC2 A 实例上重新启动 Apache 服务。一旦我这样做,RDS A 和 B 上的所有进程都会在几秒钟内清除。
我不明白这种情况怎么会突然发生,甚至在提升实例的性能后,这种情况怎么还会继续发生。我不知道下一步该怎么做。据我所知,我遇到的唯一“问题”是我的 RDS 连接数已达到上限。EC2 平均负载非常好(目前为 0.02)。据我所知,过去一周我没有更改任何代码。
答案1
经过大约 8 小时的搜索,我终于找到了这个问题。我的一个网站被一名自由职业者引入了一些恶意代码,导致无法关闭 mysql 连接。
希望这能帮助其他人。如果您遇到类似情况,请使用以下命令检查服务器中最近修改的文件:
find . -type f -mtime -$n
其中$n
是一个整数,表示您开始遇到问题的天数。在您预计可能发生更改的目录中运行该命令。