我有一个正在运行的 RDS 实例,它的平均 CPU 利用率为 20-30%。昨晚几分钟内,它飙升至 80%,我正在试图找出原因。错误日志没有显示任何内容,而且我没有设置任何其他类型的登录参数组(只是默认)。我尝试运行
show full processlist;
但我不知道在峰值出现时是否触发了某些特定的过程。
答案1
没有审计日志会大大降低取证分析的可能性,而且这个问题非常普遍,没有任何经验法则可以提供帮助。在这种情况下,您唯一的选择是评估其他可用的 RDS 指标,并将信息与使用数据库实例的应用程序关联起来。
首先,您应该尝试将事件与您的应用程序的使用情况或交互式人类用户的活动相匹配。通常,此类事件是由于客户端应用程序负载激增或用户在未充分了解其影响的情况下执行操作而引起的。
您在事件发生期间是否遇到过 DBConnections 峰值?如果是这样,那么这种连接峰值是否来自意外流量(假设您的数据库是公开的 Web 应用程序的数据源)?如果是这样,那么您的问题肯定与前端层的安全性有关,而不是与数据库本身有关。
事件发生期间,读取或写入 IO 是否增加?如果是,则可能意味着内存资源不足以在某些条件下处理您的应用程序负载。此外,这可能意味着您缺少索引或查询效率低下,导致实例不必要地加载。MySQL EXPLAIN 命令应该可以提供帮助。
我建议您确保 performance_schema 已启用并部署 sys 模式以启用 MySQL Workbench 性能工具,这对于检测模式和查询瓶颈大有帮助。
此外,通过 RDS OptionGroups 提供的审计日志并将其传递到 Cloudwatch Logs(具有适当的保留期)可以在将来帮助您调查您的应用程序(或用户)到底对数据库做了什么。“show processlist”仅在事件发生时使用时有用,因为它是一个运行时工具。