【走进RDS】之SQL Server性能诊断案例分析

客户的困扰

前几天某程序员小王向阿里云咨询他的SQL Server数据库整体负载较高,是否有优化的方法?前几天另外一个工单则是需要阿里云工程师帮忙定位某一个时刻的数据库性能尖刺的问题。

这些都是常见的性能诊断工单,其实数据库性能诊断不仅对其数据库技能要求较高,而且需要大量的前期准备工作,如收集各种性能基线、性能指标和慢SQL日志等,尤其是面对多数据库性能调优时,往往事倍功半。

如何评估数据库负载情况?如何评估数据库

当问到,如何评估数据库负载时,不同角色可能想到不同的方法,例如以下几种:

  • QPS/TPS
  • 资源使用: IOPS CPU 内存
  • SQL执行时间
  • 并发量
  • Application业务反馈

上述每一种评价方法都较为片面且作为对实际调优的参考也较为困难。

通常情况下,我们评价数据库资源负载是一个较为复杂的事情,需要我们对关系数据库有一个较为全面的理解才行,但作为数据库的使用者,大多数人不需要对数据库进行深入学习,因此,我们倾向于简化指标。

比如说,我们会只看CPU、IO、内存等指标看数据库是否存在问题,这些指标适用于监控大多数应用,但对于数据库来说可能并不能够较为正确的反映数据库内发生了什么,以及我们该如何处理。我们还要结合很多数据库特有的指标综合判断,比如各种SQL Server专用的性能计数器、DMV、等待类型、长事务、网络、活动连接等等。但这些信息需要我们对数据库自身有一个高级的了解,这使得评估数据库的负载成为一个较高门槛的工作。

下面我们不妨换一个思路,关系数据库本身是一个同步调用的过程,也就是说,从应用程序发起SQL,到数据库返回结果,是同步的,数据库不完成该请求,那么应用程序无法收到结果,在此期间应用程序与数据库之间的Session就是所谓的“Active”状态,因此我们可以尝试不再从资源使用的角度出发评估数据库负载,而简化为一个简单的指标-AAS(Average Active Session),也就是活跃会话数量。

什么是AAS概念?

设想一下,当你开车去一个目的地时,你更关注的是什么?目的地的距离?路上是否堵车?到目的地是否有停车位置?等等

你会关心汽车状态吗?或许会,但你需要了解发动机原理、汽车的相关原理才能正确判断车的状态是否正常吗?我们只需通过仪表盘几个简单的指标和报警灯做一个简单的判断即可。

数据库也是一样,绝大多数用户的场景并不需要理解数据库引擎底层原理,而是更多关注如何使用数据库,当然发烧友另说。

我们通过使用AAS的概念,提供了一种简单、抽象的评估方法,也就是数据库的活动连接数来衡量数据库的总体负载,以及每种SQL对负载的贡献,把数据库各种metric汇总为一个简单的指标----AAS。

从而使得用户使用该抽象的概念评估数据库负载,用户仅需要对比AAS与CPU核数来评估当前负载是否超出当前实例的能力,这极大的降低了用户需要对数据库技能的要求,用户可以花更多精力在业务逻辑而不是数据库技术细节上。优化器、执行计划、执行引擎,Buffer Pool,这些数据库的技术细节我们都可以减少了解。

一个AAS概念简单的图形示例如图1所示:

图1.简单的性能洞察示例

横轴Time为时间,假设有3个长连接(也就是上图中的User),每个连接根据应用负载向数据库发送SQL请求,当时间为1时,User1连接正在执行SQL,并使用CPU资源,User2正在等待锁资源,User3没有负载,因此时间1的AAS值为2,时间2的AAS值为3,以此类推。

那么AAS的值是2还是3究竟是高还是低?这取决于当前数据库所拥有的CPU Core数量,每一个Core维护一个完整的SQL执行周期,如图2所示:

图2.SQL执行时每个CPU的调度状态

当AAS值<=CPU核数时,通常来讲数据库的负载没有额外等待,当前负载不需要额外等待其他CPU的调度,是AAS比较理想的状态。

设想一个场景,你作为数据库的运维人员,开发或业务方找到你说,嗨,数据库出问题了。通过AAS,你可以简单的根据AAS一个指标,初步缩小排查范围,确定问题是否真正的出在数据库。

一个简单的AAS与实例核数的对比关系如下:

  • AAS ≈0 数据库无明显负载,异常在应用侧
  • AAS < 1 数据库无阻塞
  • AAS< Max CPUs 有空余CPU核,但可能存在单个Session打满或资源(OLAP)
  • AAS> Max CPUs 可能存在性能问题,但存在特殊情况
  • AAS>> Max CPUs 存在严重性能问题,但存在特殊情况

案例解决

通过图3我们可以看到性能洞察功能的UI,该功能的入口如图

图3.性能洞察的一个典型UI

上下两部分,上部分是按时间序列展示每个时间段的AAS负载情况,下部分是按照不同维度由高到底展示不同维度资源所占的负载,默认以SQL维度为主。

上部分可以看到各时间段负载,每种资源所占比例,比如图中蓝色展示的是CPU,其中重要的是当前实例规格的核数(max Vcores: 32),如果AAS值超过实例所拥有的CPU核数,我们就知道当前实例负载处于超标状态,图3所示负载一直处于10左右,低于Max Vcores 32,可以知道数据库整体负载处于健康水位。

那从哪知道这些负载的来源?可以通过图3下面的部分看到对应的SQL,以及每个SQL所贡献的AAS比例,例如图中可以看到第一条SQL全部为橙色,值为1.7056,该值说明在给定时间段内,该语句存在的平均会话是1.7次。而主要是等待Lock资源,这说明该语句的瓶颈在于锁。

因此我们注意到第一个语句AAS贡献最高,且等待瓶颈在于锁,根据图4数据库调优的抽象方法论,就解决了两个问题“缩小范围”和“定位瓶颈”两个问题:

图4.性能调优4个步骤

通俗点说,也就是解决了下面两个问题:

  • 哪些SQL在特定时间对实例的负载影响最大
  • 这些SQL为什么慢

而具体如何实施优化,以及如何验证优化效果,会在后续文章中进行讲述。

USE CASE1:快速优化整体负载情况

80 20法则同样适用于数据库,80%的负载都是由20%的 SQL产生,也就是说只要优化这20%的SQL就已经完成了80%的优化工作,进一步想,如果20%中的20%,也就是4%,优化这部分岂不是就可以完成80%*80%=64%的工作。因此很多场景下,优化头部的几个SQL就能完成绝大多数优化工作。

图5.CPU 100%问题定位

图4我们可以看到,示例CPU使用率一直100%,在发生阻塞时会瞬间跌到个位数。我们观察一个小时的AAS数据,看到下面单个Select的SQL的平均AAS为78,远远超过实例8C的规格,因此只要优化这一个SQL,该实例的问题基本就能够得到解决。

通过图4的SQL“分析”功能,我们能够快速根据执行计划发现常见SQL慢的原因,包括索引缺失、参数类型转换、统计信息不准确等问题。

USE CASE2:找到特定时间段内数据库响应时间变慢的原因

这类场景也是一个经典场景,数据库整体可能较长时间处于健康水平,但在业务高峰或特定时间段,存在数据库负载压力较大,业务侧SQL较慢的场景。通常情况下,大多数数据库仅存在一些指标维度的监控,比如通用的CPU、网络、IO。或者引擎侧的指标,通常通过这些指标我们能猜测出大概范围,但难以定位到具体语句,通过AAS,我们可以通过查看特定时间段的高负载定位到导致特定时间数据库问题的语句,如图6所示:

图6.特定时间负载高

通过图6,我们可以看到在特定2分钟内有性能突发的毛刺,我们通过鼠标拖拽放大该时间范围,得到如图7所示结果

图7.拖拽后明显看到两个导致高AAS的语句

通过图7,我们可以快速定位到两个产生性能毛刺的语句,并且注意到等待类型分别为Lock与Tran Log IO,由此根据图4的调优理论,我们可以初步判断是大量的更新操作产生的日志IO负载,并由于这些语句之间的锁阻塞导致锁等待。这可以极大的降低调优成本。

回顾

通过上面的案例分析,我们最终成功帮助客户解决了问题。

今天数据库早已迈入云时代,借助阿里云RDS for SQL Server Clouddba这一免费工具,可以快速准确地降低阿里云RDS for SQL Server数据库负载优化成本与操作人员技能水平要求,从而达到将更多精力用于实现业务本身的,而不是数据库上实现细节。使用性能洞察,在云上我们可以做到不用任何额外成本,快速查看整体负载,查看负载细节,以及定位不同负载对应的SQL,从而可以帮我们在云上快速解决数据库性能问题、并定期调优整体负载。

作者信息

宋沄剑(沄迹) RDS产品部SQL Server产品线技术专家,负责SQL Server产品相关开发工作,善于分析各类疑难杂症。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题目1335:闯迷宫( BFS在求解最短路径或者最短步数上有很多的应用)

题目描述&#xff1a;sun所在学校每年都要举行电脑节&#xff0c;今年电脑节有一个新的趣味比赛项目叫做闯迷宫。 sun的室友在帮电脑节设计迷宫&#xff0c;所以室友就请sun帮忙计算下走出迷宫的最少步数。 知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的…

用了那么久的 Lombok,你知道它的原理么?

序言 在写Java代码的时候&#xff0c;最烦写setter/getter方法&#xff0c;自从有了Lombok插件不用再写那些方法之后&#xff0c;感觉再也回不去了&#xff0c;那你们是否好奇过Lombok是怎么把setter/getter方法给你加上去的呢&#xff1f;有的同学说我们Java引入Lombok之后会…

Fury:一个基于JIT动态编译的高性能多语言原生序列化框架

Fury是一个基于JIT动态编译的多语言原生序列化框架&#xff0c;支持Java/Python/Golang/C等语言&#xff0c;提供全自动的对象多语言/跨语言序列化能力&#xff0c;以及相比于别的框架最高20~200倍的性能。 引言 过去十多年大数据和分布式系统蓬勃发展&#xff0c;序列化是其…

HDU1181:变形课(DFS)

Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. Harry已经将他所会的所有咒…

阿里云丁宇:以领先的云原生技术,激活应用构建新范式

8 月 11 日&#xff0c;2022 阿里云飞天技术峰会在深圳举行&#xff0c;会上阿里云提出云原生激活应用构建三大范式&#xff0c;并发布最新的产品与解决方案。基于分布式云容器平台 ACK One&#xff0c;实现多地域分布式系统一致管理&#xff1b;发布 ACK FinOps 解决方案&…

inline函数和一般的函数有什么不同

比如 int g(int x) { return x x; } int f() { return g(); } 这样f会调用g&#xff0c;然后g返回x x给f&#xff0c;然后f继续把那个值返回给调用者。 如果g是inline的话。f会被直接编译成。 int f() { return x x; } 相当于把g执行的操作直接融合到f里。这样减少…

操作系统的“冷板凳”要坐多久?万字长文解读16年开源老兵的坚持

想知道内核研发是怎样的体验&#xff1f;操作系统的“冷板凳”得坐多久才有春天&#xff1f;本文对话龙蜥社区理事长马涛&#xff0c;畅所欲言聊开源&#xff0c;一起来看看那些开源润物细无声背后的故事以及龙蜥社区运营的道法术。 高门槛的 Linux 内核研发&#xff0c;如何支…

在阿里做前端程序员,我是这样规划的

前端程序员常问的几个问题 此文来自一次团队内的分享。我是来自大淘宝技术内容前端团队的胤涧&#xff0c;负责内容中台技术。我的习惯是每个新财年初都会进行一次分享《HOW TO BE AN EMINENT ENGINEER》&#xff0c;聊聊目前团队阵型、OKR、业务和技术大图&#xff0c;聊聊我作…

c++堆栈中 top() pop()的具体作用是什么

top()是取栈顶元素pop()是弹出栈顶元素stack<int> a;a.push(1); // 1a.push(2); // 1 2a.push(3); // 1 2 3int c a.top(); // c 3a.pop(); // 1 2a.push(4); // 1 2 4c a.top(); // c 4

如何可视化编写和编排你的 K8s 任务

简介 K8s Job 是 Kubernetes 中的一种资源&#xff0c;用来处理短周期的 Pod&#xff0c;相当于一次性任务&#xff0c;跑完就会把 Pod 销毁&#xff0c;不会一直占用资源&#xff0c;可以节省成本&#xff0c;提高资源利用率。 阿里任务调度 SchedulerX 和云原生结合&#x…

前端智能化实践——可微编程

什么是可微编程 通过动画、动效增加 UI 表现力&#xff0c;作为前端或多或少都做过。这里以弹性阻尼动画的函数为例&#xff1a; 函数在 时是效果最好的。最终&#xff0c;实现成 JavaScript 代码&#xff1a; function damping(x, max) {let y Math.abs(x);// 下面的参数都是…

HDU 1495(非常可乐)

Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情&#xff0c;但是seeyou却不这么认为。因为每次当seeyou买了可乐以后&#xff0c;阿牛就要求和seeyou一起分享这一瓶可乐&#xff0c;而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子&#xff0c…

解析 RocketMQ 业务消息——“事务消息”

引言&#xff1a;在分布式系统调用场景中存在这样一个通用问题&#xff0c;即在执行一个核心业务逻辑的同时&#xff0c;还需要调用多个下游做业务处理&#xff0c;而且要求多个下游业务和当前核心业务必须同时成功或者同时失败&#xff0c;进而避免部分成功和失败的不一致情况…

模型代码联动难? BizWorks 来助力

业务模型设计和沉淀是企业数字化转型过程中非常重要的一个环节, 日趋复杂的业务场景和协作模式给建模的有效性以及模型作为业务资产如何持续发挥价值带来了新的挑战: 设计完成的业务模型是否被合理实现了?经过数月、半年、1年迭代后&#xff0c;模型设计还能否对业务系统的演…

EasyNLP 集成 K-BERT 算法,借助知识图谱实现更优 Finetune

导读 知识图谱&#xff08;Knowledge Graph&#xff09;的概念⾸次出现2012年&#xff0c;由Google提出&#xff0c;它作为⼀种⼤规模语义⽹络&#xff0c; 准确地描述了实体以及实体之间的关系。知识图谱最早应⽤于搜索引擎&#xff0c;⽤于准备返回⽤户所需的知识。随着预训…

一种关于低代码平台(LCDP)建设实践与设计思路

背景 负责菜鸟商业中心CRM系统开发已经有1年多时间&#xff0c;过程中发现有一个痛点&#xff1a;业务线特别多&#xff0c;每个业务线对同一个页面都有个性化布局和不同的字段需求&#xff0c;而我所在的团队就3个人&#xff0c;在资源有限的情况下如何支撑好呢&#xff1f;刚…

(cosψ)的三次方怎么积分

cosψ^3cosψ(1-sinψ^2)cosψ-cosψsinψ^2;之后积分∫&#xff08;cosψ-sinψ^2&#xff09;dψ∫ cosψdψ-∫ cosψsinψ^2dψ&#xff1b;∫ cosψdψsinψ,由分部积分法可得&#xff1a;∫ cosψsinψ^2dψ∫ sinψ^2 d&#xff08;sinψ)&#xff1b;令sinψu,则∫ cos…

Redis 数据类型 list 以及使用场景

数据存储需求&#xff1a;存储多个数据&#xff0c;并对数据进入存储空间的顺序进行区分 需要的存储结构&#xff1a;一个存储空间保存多个数据&#xff0c;且通过数据可以体现进入顺序 list类型&#xff1a;保存多个数据&#xff0c;底层使用双向链表存储结构实现 list 类型数…

TairSearch:加速多列索引查询

互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中。如需缓解数据库访问压力&#xff0c;可引入Redis等缓存系统承担热数据的查询&#xff0c;以此提升查询效能。然而业务场景如果是在数据库上做随意多列组合索引查询或者like模糊匹配查询&#xff0c;使…

qsort函数用法

qsort   功 能: 使用快速排序例程进行排序    用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));    各参数&#xff1a;1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 用于确定排序…