几个小时前,我们的一个 AWS EC2 实例的 CPU 使用率飙升至 90 - 100%。
该服务器与其他几台生产服务器一起使用一个主 RDS 实例作为数据库。
访问该 RDS 实例的所有服务器实例均无响应。
这是 AWS 上的 SQL 日志中出现过几次(甚至数百次)的错误:
140908 21:00:28 [ERROR] /rdsdbbin/mysql/bin/mysqld: Sort aborted: Error writing file '/rdsdbdata/tmp/MYrOqeNU' (Errcode: 28)
我研究了错误代码,被告知这意味着存储问题,所以我们检查了监视器,发现它显然一直从 10GB 变为 < 1GB。这对我来说毫无意义,除非出于某种原因,GB 大小的 tmp 文件被弄乱了。
下列 MySQL 命令也显示大约 28 个进程(超过一百个):
show processlist;
我真的不是 DBA,感觉很为难。我会根据要求提供更多信息。
答案1
最终发现,确实是托管 RDS 的实例缺少存储空间。MySQL 抛出的错误代码 28 是准确的由于没有剩余存储空间,SQL 进程一直在备份。我们还发现一个站点正在执行的查询效率很低 - 执行时间超过一分钟。这个查询可能一直在传播整个问题(出于某种我不知道的原因)。
我们没有针对该情况设置任何警报,因此直到所有生产站点都停止后我们才能够调整存储空间。
我们刚刚存储空间增加一倍,并使用“立即应用”选项并等待约 1 到 2 小时。之后,有足够的存储空间让一切继续顺利运行。我们还确保在所有 RDS 实例上设置警报……