问题症状
RDS数据库经常收到CPU使用率高的监控报警,找不到具体的原因,只能重启RDS实例来解决。
问题原因
要彻底解决监控报警问题,需要找到问题的根源,CPU使用率高的原因,一般情况下导致CPU使用率有以下几个原因:
- 系统执行应用提交查询(包括数据修改操作)时需要大量的逻辑读
- 实例的 QPS(每秒执行的查询次数)高
- 查询执行成本(查询访问表数据行数 avg_lgc_io)高
解决方案
- 生成诊断报告,查看诊断报告提供的优化建议进行SQL优化
- 对于由应用负载高导致的 CPU 使用率高的状况,使用 SQL 查询进行优化的余地不大,建议从应用架构、实例规格等方面来解决,例如:
- 升级实例规格,增加 CPU 资源。
- 增加只读实例,将对数据一致性不敏感的查询(比如商品种类查询、列车车次查询)转移到只读实例上,分担主实例压力。
- 使用阿里云 DRDS 产品,自动进行分库分表,将查询压力分担到多个 RDS 实例上。
- 使用阿里云 Memcache 或者云 Redis 产品,尽量从缓存中获取常用的查询结果,减轻 RDS 实例的压力。
- 对于查询数据比较静态、查询重复度高、查询结果集小于 1 MB 的应用,考虑开启查询缓存(Query Cache)。
- 定期归档历史数据、采用分库分表或者分区的方式减小查询访问的数据量。
- 尽量优化查询,减少查询的执行成本(逻辑 IO,执行需要访问的表数据行数),提高应用可扩展性。
- 针对avg_lgc_io的情况解决办法是定位效率低的查询、优化查询的执行效率、降低查询执行的成本