RDS/MSSQL CPU持续飙高问题分析

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 在使用RDS/MSSQL中遇到一个持续好几个月的诡异性能问题迟迟没能得到正确解决,在一个月明风清的晚上困扰我们的疑团终于被揭开。
一:背景介绍
公司数据库使用的是阿里云RDS服务,有SQL Server和MySQL两种数据库;本次事故是其中一个核心也业务产品线使用的SQL Server数据库。
相关参数如下(逼格不算低贵司不差钱14.gif):
  • 规格代码: rds.mssql.c2.xlp2
  • 数据库版本:SQL Server 2008 R2
  • 数据库架构:Mirror
  • 配置:16 核 /96GB/连接数:24000 IOPS:16000 
  • 数据量:120GB
二:问题描述
2016/6 /18日周六早上相关部门反映前端做单缓慢,查看数据库监控发现数据库CPU持续飙高,从监控中看到其实从从6/17日晚17点开始CPU飙高到60%持 续到做单结束23点,因为不是订单高峰期,所以没有被发现;6/18日早上09:50继续飙高到60%-80%直到晚上20:30。
认真分析这两天的监控数据发现, 其他指标如全表扫描数,数据库连接数,网络流量流入流出,每秒登录次数和平均每秒SQL语句执行次数都没有大的波动,都很正常;但平均每秒事务数相当异常, 最高达到了近40000次/秒(平时1000左右,近40倍) 。
后来时不时,但不是很频繁(每两三个礼拜)都会发生类似的事情,导致大家都很紧张,幸运的是导致业务做单慢,但没有卡死(寻求小小的自我安慰50.gif)。
相关监控截图(10月份的):
CPU
65c8eb3ac2ca7a150c1c8ee10d1a4a7c8b593bba
平均每秒事务数:
6fda99db87c2457bb0aa0a30e199ac0670007ed4
10/17 日两个小时内IOPS 监控,很有规律,2-3 分钟会有峰值
f47338f007aafddc2118042cfa15722856c18a06
三:处理过程
通 过脚本和阿里DMS控制台并没有发现有任何阻塞,SQL处理速度正常(手动刷的35.gif其实这是一种幻觉,问题就埋在此处)。发现有一个IX锁,是技术支持客户端登录 产生的,但他是只读权限,在线下模拟只读权限下IX锁并不会影响事务操作,不会锁表;后来有联系该技术支持把电脑关闭,IX锁在20:30左右消失,但这个点TPS也恢复了正常(牛头对上了马嘴后来才知是干扰线索)。
初步怀疑是因为这个 IX锁影响到RDS后端,导致执行一些事务(于是想这个锅要阿里来背了27.gif)。找不到原因,业务单量没有变化,为什么每秒事务数会莫名的高出30-40倍呢?只能怀疑一切怀疑阿里了,但跟阿里工单和电话沟通确认后,他们否认是这个原因;因线上没有开启profile审计(RDS是不开放此权限的),所以他们也无法判断是什么引起。后来有请阿里临时开通账号的profile权限,下次问题重现时可以通过profile定位具体的事务。 问题没有根治,但第二天又诡异的恢复正常了;于是就更加云里雾里,当时总结如下:
  1. 把技术支持跳板机空闲时间设定15分钟不活动即log off,强行个人用户超过空闲时间就断开数据库连接。
  2. 有确认业务慢对应到的物理表,一个2000W+,一个近1000W,找到研发负责人进行优化。
  3. 优化慢查询,对超多100ms以上的慢SQL格杀勿论,跟研发的同学配合优化
  4. 线上出现问题后可以通过阿里后台提升权限来排查问题

但后面时不时的又来了,持续一两天又消失的无影无踪(真是来无影去无踪),搞得大家鸡犬不宁的;后来出问题时有请阿里开启profile也没有定位到具体原因; 就 这样持续了三四个月;在四个月后的10/19日下午中午找到了元凶,在分析做单业务时有找到一个物理表,数量很小(个位数)用于存放客服人员提交的Job 请求,该请求数据被查询后会随即删除,所以高峰期也不会超过100的量,所以之前维护索引时根本没有在意,想着根本不会有性能问题,建索引意义也不大;把 查询这张表的SQL取出来到离线环境(T+1)测试,竟然需要消耗在80~90ms(没有在我们定义的慢查询范围内,前面提到的手动刷或执行命令根本抓不到),奇怪的是为什么几行的数据要花费这么久,于是SET STATISTICS IO/TIME ON,并打开实际执行计划,执行后一下惊呆了,逻辑读竟然达到了近10000页,10000*8kb=80MB的数据;跟研发确认得知这个表的写/读/删的频率很高,有200+个客服人员同时操作,所以每秒的并发就可想而知了。因为这个表吞吐量产生瓶颈,所以做Job的事务被拖长了,事务数也持续增高, 这样就可以解释通了。
至于MSSQL表很小但查询为什么会有那么大的逻辑读请参照以下解释:
1、删除表数据实际上不是物理删除,记标志位,记录数据是否使用(删除后数据文件并不会变小);
2、新的数据进来后会复用被标记删除的页空间;
3、表的空间没有被回收执行SQL时仍需要遍历所有页面,导致实际的逻辑读要比理论上大的多,并发上来后响应就慢下来了;
道原因处理起来就很简单了,最快的办法是把表rebuild下,再执行查询就是0-1ms了;再观察数据库CPU是嗖嗖嗖的降下来了,对症下药终于解决 可以安心的睡觉了。然后排个任务半个小时执行下,长远来看的话要求研发添加缓存(典型的缓存场景,技术债啊),数据存取到redis不需要存储在持久层。
四:事后总结
历时3~4个月问题总算得以解决,也对生产做单产生了一定影响,最大的感触是DBA了解业务是多么的重要;但还有一些疑惑点,为什么CPU不是一直飙高,而是偶尔出现一两天然后消失?因为有设置SQL Server维护计划每天凌晨执行,更新统计信息、rebuild或reorgnize索引碎片率高的索引,估计就是这个Job回收了表空间后恢复正常了,累积一段时间后又爆发了。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
缓存 关系型数据库 分布式数据库
PolarDB常见问题之数据库cpu突然飙高如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
SQL 监控 关系型数据库
Postgresql CPU 资源占用过高问题
Postgresql CPU 资源占用过高问题
1183 0
Postgresql CPU 资源占用过高问题
|
3月前
|
监控 Java Linux
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
|
4月前
|
SQL Oracle 关系型数据库
选择适合您网站的 SQL 托管:MS SQL Server、Oracle、MySQL 和 MS Ac
如果您希望您的网站能够存储和检索数据,您的Web服务器应该能够访问使用SQL语言的数据库系统。以下是一些常见的SQL托管选项:
51 1
|
4月前
|
SQL Oracle 关系型数据库
选择适合您网站的 SQL 托管:MS SQL Server、Oracle、MySQL
如果您希望您的网站能够存储和检索数据,您的Web服务器应该能够访问使用SQL语言的数据库系统。以下是一些常见的SQL托管选项:
56 2
|
7月前
|
Java 调度
CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
面试过程中,场景类的问题更容易检测出一个开发人员的基本能力。这不,有一位小伙伴去阿里面试,第一面就遇到了关于“CPU 飙高系统反应慢怎么排查”的问题?当时这位小伙伴不知从何下手。 今天,我给大家分享一下我的解决思路。
110 0
|
9月前
|
缓存 监控 数据库连接
CPU飙高排查方案与思路
当CPU飙高时,可能是由于程序中存在一些性能问题或者死循环导致的。以下是一些排查CPU飙高的方案和思路
567 0
|
12月前
|
消息中间件 JavaScript 小程序
记一次 Nacos 导致的 CPU 飙高问题 !
记一次 Nacos 导致的 CPU 飙高问题 !
|
12月前
|
移动开发 监控 JavaScript
记一次 JVM CPU 使用率飙高问题的排查过程
记一次 JVM CPU 使用率飙高问题的排查过程
|
SQL 监控 关系型数据库
一次数据库CPU飙高问题排查与解决
### 问题发现 最近,经常收到一些数据库的报警,提示我们的数据库的CPU有异常飙高的情况,通过该监控发现,确实间歇性的有一些CPU飙高的情况,经常把CPU打满了。 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/a1786489-1f44-4c39-bea4-85ca25a45433.png) ### 问题排
456 0
一次数据库CPU飙高问题排查与解决