皮之不存 毛将焉附。一个内容如此残缺的数据库已经没法谈检索的功能、界面和效果了。你从他的首页的界面、内容、广告等,和CNKI、万方对比来看,维普已经从单纯学术期刊数据库的内容服务,有向门户性质的学术网站转型的趋势。
因此,个人感觉CNKI和万方可能更具有可比性,一点浅见,以上。
如何应对数据库CPU打满?最优解在这里...阿里云数据库
2020-04-26 16:48·字数:4996·阅读:129
如何用好数据库,调校数据库使其发挥最优的性能?
如何快速诊断和应对各种原因导致的突发数据库性能问题?
如何以最低资源成本满足业务需求?
......
这些复杂的运维难题最优解到底是什么?
今天(4月22日)15:00数据库自治服务DAS重磅发布会
现场为你揭晓答案!
数据库自动驾驶时代一触即发点击这里
即可预约直播
今天提前为大家揭秘数据库自治服务DAS的一个创新功能 —— AutoScale,基于数据库实例的实时性能数据作为输入,由DAS完成流量异常发现、合理数据库规格建议和合理磁盘容量建议,使数据库服务具备自动扩展存储和计算资源的能力。
01背 景
为业务应用选择一个合适的数据库规格,是每个数据库运维同学都会经常面临的一个问题。若规格选的过大,会产生资源浪费;若规格选的过小,计算性能不足会影响业务。
通常情况下,运维同学会采用业务平稳运行状态下,CPU可处于合理水位(例如50%以下)的一个规格(如4核CPU配8G内存)并配一个相对富余的磁盘规格(如200G)。
然而在数据库应用运维同学的日常生活里,线上应用流量突增导致数据库资源打满的情况时有发生,而引发这类问题的场景可能多种多样:
1、新业务上线,对业务流量预估不足,导致资源打满,如新上线的应用接入了大量的引流,或基础流量比较大的平台上线了一个新特性功能。
2、不可预知的流量,如突发的舆论热点带来的临时流量,或某个网红引发的限时抢购、即兴话题等。
3、一些平时运行频次不高,但又偶发集中式访问,如每日一次的上班打卡场景,或每周执行几次的财务核算业务。这类业务场景平时业务压力不高,虽已知会存在访问高峰,但为节省资源而通常不会分配较高的规格。
当上述业务场景突发计算资源不足状况时,通常会让运维同学措手不及,严重影响业务,如何应对“数据库资源打满”是运维同学常常被挑战的问题之一。
在数据库场景下,资源打满可分为计算资源和存储资源两大类,其主要表现:
1、计算资源打满,主要表现为CPU资源利用率达到100%,当前规格下的计算能力不足以应对;
2、存储资源打满,主要表现为磁盘空间使用率达到100%,数据库写入的数据量达到当前规格下的磁盘空间限制,导致业务无法写入新数据;
针对上述两类问题,数据库自治服务 DAS 进行了服务创新,使数据库服务具备自动扩展存储和计算资源的技术能力,应对上述的问题。
DAS AutoScale基于数据库实例的实时性能数据作为输入,由DAS完成流量异常发现、合理数据库规格建议和合理磁盘容量建议,使数据库服务具备自动扩展存储和计算资源的能力。
接下来,本文将对DAS AutoScale服务的架构进行详细的介绍,包括技术挑战、解决方案和关键技术。
02技术挑战
计算节点规格调整是数据库优化的一种常用手段,尽管计算资源规格只涉及到CPU和内存,但在生产环境进行规格变配的影响还是不容忽视,将涉及数据迁移、HA切换、Proxy切换等 *** 作,对业务也会产生影响。
业务有突发流量时,计算资源通常会变得紧张甚至出现CPU达到100%的情况。通常情况下,这种情况会通过扩容数据库规格的方式来解决问题,同时DBA在准备扩容方案时会至少思考如下三个问题:
1.扩容是否能解决资源不足的问题?
2.何时应该进行扩容?
3.如何扩容,规格该如何选择?
解决这三个问题,DAS同样面临如下三个方面挑战:
2.1. 挑战一:如何判别扩容是否能够解决问题?
在数据库场景下,CPU打满只是一个计算资源不足的表征,导致这个现象的根因多样,解法也同样各异。例如业务流量激增,当前规格的资源确实不能够满足计算需求,在合适的时机点,d性扩容是一个好的选择,再如出现了大量的慢SQL,慢SQL堵塞任务队列,且占用了大量的计算资源等,此时资深的数据库管理员首先想到的是紧急SQL限流,而不是扩容。在感知到实例资源不足时,DAS同样需要从错综复杂的问题中抽丝剥茧定位根因,基于根因做出明智的决策,是限流,是扩容,还是其它。
2.2. 挑战二:如何选择合适的扩容时机和扩容方式?
对于应急扩容时机,选择的好坏与紧急情况的判断准确与否密切相关。“紧急”告警发出过于频繁,会导致实例频繁的高规格扩容,产生不必要的费用支出;“紧急”告警发出稍晚,业务受到突发情况影响的时间就会相对较长,对业务会产生影响,甚至引发业务故障。在实时监控的场景下,当我们面临一个突发的异常点时,很难预判下一时刻是否还会异常。因此,是否需要应急告警变得比较难以决断。
对于扩容方式,通常有两种方式,分别是通过增加只读节点的水平扩容,以及通过改变实例自身规格的垂直扩容。
其中,水平扩容适用于读流量较多,而写流量较少的场景,但传统数据库需要搬迁数据来搭建只读节点,而搬迁过程中主节点新产生的数据还存在增量同步更新的问题,会导致创建新节点比较慢。
垂直扩容则是在现有规格基础上进行升级,其一般流程为先对备库做升级,然后主备切换,再对新备库做规格升级,通过这样的流程来降低对业务的影响,但是备库升级后切换主库时依然存在数据同步和数据延迟的问题。因此,在什么条件下选择哪种扩容方式也需要依据当前实例的具体流量来进行确定。
2.3. 挑战三:如何选择合适的计算规格?
在数据库场景下,实例变更一次规格涉及多项管控运维 *** 作。以物理机部署的数据库变更规格为例,一次规格变更 *** 作通常会涉及数据文件搬迁、cgroup隔离重新分配、流量代理节点切换、主备节点切换等 *** 作步骤;而基于Docker部署的数据库规格变更则更为复杂,会额外增加Docker镜像生成、Ecs机器选择、规格库存等微服务相关的流程。因此,选择合适的规格可有效地避免规格变更的次数,为业务节省宝贵的时间。
当CPU已经是100%的时候,升配一个规格将会面临两种情况:第一种是升配之后,计算资源负载下降并且业务流量平稳;第二种是升配之后,CPU依然是100%,并且流量因为规格提升后计算能力增强而提升。
第一种情况,是比较理想的情况,也是预期扩容后应该出现的效果,但是第二种情况也是非常常见的情形,由于升配之后的规格依然不能承载当前的业务流量容量,而导致资源依然不足,并且仍在影响业务。如何利用数据库运行时的信息选择一个合适的高配规格是将直接影响升配的有效性。
03解决方案
针对上述提到的三项技术挑战,下面从DAS AutoScale服务的产品能力、解决方案、核心技术这三个方面进行解读,其中涉及RDS和PolarDB两种数据库服务,以及存储自动扩容和规格自动变更两个功能,最后以一个案例进一步具体说明。
3.1. 能力介绍
在产品能力上,目前DAS AutoScale服务针对阿里云RDS数据库和PolarDB数据提供存储自动扩容服务和规格自动变配服务。
其中,针对即将达到用户已购买规格上限的实例,DAS存储自动扩容服务可以进行磁盘空间预扩容,避免出现因数据库磁盘满而影响用户业务的发生。在该服务中,用户可自主配置扩容的阈值比例,也可以采用DAS服务预先提供的90%规格上界的阈值配置,当触发磁盘空间自动扩容事件后,DAS会对该实例的磁盘进行扩容;
针对需要变更实例规格的数据库实例,DAS规格自动变配服务可进行计算资源的调整,用更符合用户业务负载的计算资源来处理应用请求,在该服务中,用户可自主配置业务负载流量的突发程度和持续时间,并可以指定规格变配的最大配置以及变配之后是否回缩到原始规格。
在用户交互层面,DAS AutoScale主要采用消息通知的方式展示具体的进度以及任务状态,其中主要包括异常触发事件、规格建议和管控任务状态三部分。异常触发事件用于通知用户触发变配任务,规格建议将针对存储扩容和规格变配的原始规格和目标值进行说明,而管控任务状态则将反馈AutoScale任务的具体进展和执行状态。
3.2 方案介绍
为了实现上面介绍的具体能力,DAS AutoScale实现了一套完整的数据闭环,如图1:
图1 DAS AutoScale数据闭环
在该闭环中,包含性能采集模块、决策中心、算法模型、规格建议模块、管控执行模块和任务跟踪模块,各模块的具体功能如下:
性能采集模块负责对实例进行实时性能数据采集,涉及数据库的多项性能指标信息、规格配置信息、实例运行会话信息等;
决策中心模块则会根据当前性能数据、实例会话列表数据等信息进行全局判断,以解决挑战一的问题。例如可通过SQL限流来解决当前计算资源不足的问题则会采取限流处理;若确实为突增的业务流量,则会继续进行AutoScale服务流程;
算法模型是整个DAS AutoScale服务的核心模块,负责对数据库实例的业务负载异常检测和容量规格模型推荐进行计算,进而解决挑战二和挑战三的具体问题;
规格建议校验模块将产出具体建议,并针对数据库实例的部署类型和实际运行环境进行适配,并与当前区域的可售卖规格进行二次校验,确保的建议能够顺利在管控侧进行执行;
管控模块负责按照产出的规格建议进行分发执行;
状态跟踪模块则用于衡量和跟踪规格变更前后数据库实例上的性能变化情况;
接下来,将分别针对DAS AutoScale支持的存储扩容和规格变配两个业务场景进行展开介绍。
!图2 存储扩容方案](https://upload-images.jianshu.io/upload_images/16625435-f448260506c94c56.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "lADPD26eLFb47F_NAW3NBDg_1080_365.jpg_720x720q90g.jpg")
存储扩容的方案见图2,主要有两类触发方式,分别是用户自定义触发和算法预测触发。其中,算法将根据数据库实例过去一段时间内的磁盘使用值结合时序序列预测算法,预测出未来一段时间内的磁盘使用量,若短时间内磁盘使用量将超过用户实例的磁盘规格,则进行自动扩容。每次磁盘扩容将最少扩大5G,最多扩大原实例规格的15%,以确保数据库实例的磁盘空间充足。
目前在磁盘AutoScale的时机方面,主要采用的是阈值和预测相结合的方式。当用户的磁盘数据缓慢增长达到既定阈值(90%)时,将触发扩容 *** 作;如果用户的磁盘数据快速增长,算法预测到其短时间内将会可用空间不足时,也会给出磁盘扩容建议及相应的扩容原因说明。
图3 规格变配方案
规格变配的方案见图3,其具体流程为:首先,异常检测模块将针对业务突发流量从多个维度(qps、tps、active session、iops等指标)进行突发异常识别,经决策中心判别是否需要AutoScale变配规格,然后由规格建议模块产生高规格建议,再由管控组件进行规格变配执行。
待应用的异常流量结束之后,异常检测模块将识别出流量已回归正常,然后再由管控组件根据元数据中存储的原规格信息进行规格回缩。在整个变配流程结束之后,将有效果跟踪模块产出变配期间的性能变化趋势和效果评估。
目前规格的AutoScale触发时机方面,主要是采取对实例的多种性能指标(包括cpu利用率、磁盘iops、实例Logic read等)进行异常检测之后,结合用户设定的观测窗口期长度来实现有效的规格AutoScale触发。
触发AutoScale之后,规格推荐算法模块将基于训练好的模型并结合当前性能数据、规格、历史性能数据进行计算,产出更适合当前流量的实例规格。此外,回缩原始规格的触发时机也是需要结合用户的静默期配置窗口长度和实例的性能数据进行判断,当符合回缩原始规格条件后,将进行原始规格的回缩。
3.3核心技术支撑
DAS AutoScale服务依赖的是阿里云数据库数据链路团队、管控团队和内核团队技术的综合实力,其中主要依赖了如下几项关键技术:
1.全网数据库实例的秒级数据监控技术,目前监控采集链路实现了全网所有数据库实例的秒级采集、监控、展现、诊断,可每秒实时处理超过1000万项监控指标,为数据库服务智能化打下了坚实的数据基础;
2.全网统一的RDS管控任务流技
1、1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。
2、2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。
3、3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。
4、4、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用 *** 作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。
5、5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。
6、6、调整 *** 作系统参数,例如:运行在UNIX *** 作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。
实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。另外,良好的数据库管理工具对于优化数据库性能也是很重要的。
ORACLE数据库性能优化工具
常用的数据库性能优化工具有:
1、1、ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,对于调整数据库性能是很有帮助的。
2、2、 *** 作系统工具,例如UNIX *** 作系统的vmstat,iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现在什么地方有时候很有用。
3、3、SQL语言跟踪工具(SQL TRACE FACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例,使用SQL语句跟踪文件调整应用程序性能。SQL语言跟踪工具将结果输出成一个 *** 作系统的文件,管理员可以使用TKPROF工具查看这些文件。
4、4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。
5、5、EXPLAIN PLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言。
ORACLE数据库的系统性能评估
信息系统的类型不同,需要关注的数据库参数也是不同的。数据库管理员需要根据自己的信息系统的类型着重考虑不同的数据库参数。
1、1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update *** 作,典型的系统包括民航机票发售系统、银行储蓄系统等。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的ORACLE数据库需要主要考虑下述参数:
l l 数据库回滚段是否足够?
l l 是否需要建立ORACLE数据库索引、聚集、散列?
l l 系统全局区(SGA)大小是否足够?
l l SQL语句是否高效?
2、2、数据仓库系统(Data Warehousing),这种信息系统的主要任务是从ORACLE的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的ORACLE数据库着重考虑下述参数:
l l 是否采用B*-索引或者bitmap索引?
l l 是否采用并行SQL查询以提高查询效率?
l l 是否采用PL/SQL函数编写存储过程?
l l 有必要的话,需要建立并行数据库提高数据库的查询效率
SQL语句的调整原则
SQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率是很不相同的。程序员可以使用EXPLAIN PLAN语句来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写SQL语句需要满足考虑如下规则:
1、1、尽量使用索引。试比较下面两条SQL语句:
语句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN
(SELECT deptno FROM emp)
语句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS
(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno)
这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高一些。
2、2、选择联合查询的联合次序。考虑下面的例子:
SELECT stuff FROM taba a, tabb b, tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AMD a.key2 = c.key2
这个SQL例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描,所以主表应该数据量最小,所以例子中表A的acol列的范围应该比表B和表C相应列的范围小。
3、3、在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多。
4、4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。
5、5、可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。
6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间。
CPU参数的调整
CPU是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上。如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源,如果工作高峰时CPU使用率仍然很低,说明服务器CPU资源还比较富余。
使用 *** 作相同命令可以看到CPU的使用情况,一般UNIX *** 作系统的服务器,可以使用sar –u命令查看CPU的使用率,NT *** 作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。
数据库管理员可以通过查看v$sysstat数据字典中“CPU used by this session”统计项得知ORACLE数据库使用的CPU时间,查看“OS User level CPU time”统计项得知 *** 作系统用户态下的CPU时间,查看“OS System call CPU time”统计项得知 *** 作系统系统态下的CPU时间, *** 作系统总的CPU时间就是用户态和系统态时间之和,如果ORACLE数据库使用的CPU时间占 *** 作系统总的CPU时间90%以上,说明服务器CPU基本上被ORACLE数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多,ORACLE数据库无法得到更多的CPU时间。
数据库管理员还可以通过查看v$sesstat数据字典来获得当前连接ORACLE数据库各个会话占用的CPU时间,从而得知什么会话耗用服务器CPU比较多。
出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。
1、数据库管理员可以执行下述语句来查看SQL语句的解析情况:
SELECT * FROM V$SYSSTAT
WHERE NAME IN
('parse time cpu', 'parse time elapsed', 'parse count (hard)')
这里parse time cpu是系统服务时间,parse time elapsed是响应时间,用户等待时间
waite time = parse time elapsed – parse time cpu
由此可以得到用户SQL语句平均解析等待时间=waite time / parse count。这个平均等待时间应该接近于0,如果平均解析等待时间过长,数据库管理员可以通过下述语句
SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA
ORDER BY PARSE_CALLS
来发现是什么SQL语句解析效率比较低。程序员可以优化这些语句,或者增加ORACLE参数SESSION_CACHED_CURSORS的值。
2、数据库管理员还可以通过下述语句:
SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA
查看低效率的SQL语句,优化这些语句也有助于提高CPU的利用率。
3、3、数据库管理员可以通过v$system_event数据字典中的“latch free”统计项查看ORACLE数据库的冲突情况,如果没有冲突的话,latch free查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。
内存参数的调整
内存参数的调整主要是指ORACLE数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。
1、 1、 共享池由两部分构成:共享SQL区和数据字典缓冲区,共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。数据库管理员通过执行下述语句:
select (sum(pins - reloads)) / sum(pins) "Lib Cache" from v$librarycache
来查看共享SQL区的使用率。这个使用率应该在90%以上,否则需要增加共享池的大小。数据库管理员还可以执行下述语句:
select (sum(gets - getmisses - usage - fixed)) / sum(gets) "Row Cache" from v$rowcache
查看数据字典缓冲区的使用率,这个使用率也应该在90%以上,否则需要增加共享池的大小。
2、 2、 数据缓冲区。数据库管理员可以通过下述语句:
SELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets','physical reads')
来查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。
这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。
3、 3、 日志缓冲区。数据库管理员可以通过执行下述语句:
select name,value from v$sysstat where name in ('redo entries','redo log space requests')查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率:
申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)