【巡检问题分析与最佳实践】RDS SQL Server 磁盘IO吞吐高问题

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 实例的磁盘IO负载是RDS SQL Server用户日常应重点关注的监控项之一,如果磁盘IO压力过大,很容易导致数据库性能问题。

往期分享

RDS MySQL

RDS MySQL 实例空间问题

RDS MySQL 内存使用问题

RDS MySQL 活跃线程数高问题

RDS MySQL 慢SQL问题

RDS MySQL 实例IO高问题

RDS MySQL 小版本升级最佳实践

RDS PostgreSQL

RDS PostgreSQL 实例IO高问题

RDS PostgreSQL 慢SQL问题

RDS PostgreSQL CPU高问题

概述

实例的磁盘IO负载是RDS SQL Server用户日常应重点关注的监控项之一,如果磁盘IO压力过大,很容易导致数据库性能问题。根据实例计算规格的不同及其使用的磁盘的类型和容量大小不同,实例的磁盘IO处理能力上限也不同,主要体现在IOPS的限制和IO吞吐量的限制两个方面。由于SQL Server中的IO访问块的大小总体来说是比较大的(大部分都在8KB以上),因此在RDS中,IOPS达到实例上限并成为主要的磁盘性能瓶颈的情况相对比较少,而IO吞吐达到上限的情况相对出现的就比较多一些。

磁盘IO吞吐限制

对于本地盘版的RDS SQL Server 2008 R2实例来说,是采用的同一物理主机上多个实例共享几块本地SSD盘的架构。虽然有对每个实例可以使用的最大磁盘IOPS做限制,但并未在单个实例的磁盘IO吞吐量方面做严格限制,因此实际上单个实例可以使用的最大磁盘IO吞吐量往往可以达到1GB/sec以上,但相应的也就存在着同一主机上多个实例之间竞争磁盘IO资源并相互影响性能的可能性。因此对于需要独享磁盘IO资源的RDS SQL  Server 2008 R2用户来说,应选择独占物理机的规格。

对于云盘版的RDS SQL Server实例来说,是采用的每个实例独立的挂载单块SSD或ESSD云盘的架构,因此在磁盘IO资源方面是完全隔离和独享的。相应的单个RDS实例的磁盘IO吞吐能力上限,就取决于实例的计算规格及使用的SSD或ESSD云盘的规格和容量大小。

  • 目前云盘版的RDS SQL Server实例使用的计算节点主要是ECS 6代规格的实例,包括g6、c6和r6这几个规格族,因此单个RDS实例可以提供的最大IO吞吐量首先会受到对应的ECS规格的单实例最大IO吞吐量限制,具体可参考如下链接:https://help.aliyun.com/document_detail/25378.html#g6

    相应的,常见的几种CPU核数的RDS SQL Server实例在ECS计算节点层面的IO吞吐量上限如下:

CPU核数 IO吞吐量上限(MB/sec)
2 125
4 187.5
8 250
16 375
24 500
32 625
  • 目前云盘版的RDS SQL Server实例使用的云盘有SSD和ESSD两类,其中ESSD云盘又支持PL1、PL2和PL3三个性能等级,因此单个RDS实例可以提供的最大IO吞吐量还受到其使用的云盘的类型和容量大小的限制,具体可参考如下链接:https://help.aliyun.com/document_detail/25382.html

    其中,对于最常见的ESSD PL1云盘来说,其IO吞吐量上限的计算公式为:min{120+0.5*容量, 350}


举例来说,若一个云盘版RDS SQL Server实例的CPU核数为8,使用的云盘存储类型为ESSD PL1(默认类型),存储空间大小为200GB。根据以上规则,实例在ECS层面的IO吞吐量上限为250MB/sec,在云盘层面的IO吞吐量上限为220MB/sec,则实例最终的IO吞吐量上限为220MB/sec。

如果实例的CPU核数不变,而存储空间扩容到500GB,则云盘层面的IO吞吐量上限将增加到350MB/sec,但是受实例的计算规格限制,其IO吞吐量上限仍只能达到250MB/sec。

如果进一步升级实例的CPU核数到16,则ECS层面的IO吞吐量上限将增加到375MB/sec,这时受云盘规格的限制,其IO吞吐量上限就是350MB/sec了。

查看磁盘IO吞吐使用情况

RDS控制台CloudDBA

目前RDS SQL Server控制台的监控与报警部分还没有提供关于实例的磁盘IO吞吐使用量的监控数据,需要在CloudDBA中查看磁盘IO吞吐量的数据。

在RDS控制台的“CloudDBA”->“性能优化”页中的“性能洞察”部分,可以添加查看实例的磁盘IO吞吐量相关的性能指标:

1.png

其中IO_Throughput_Read_Kb和IO_Throughput_Write_Kb分别对应实例的每秒磁盘读IO吞吐量和每秒磁盘写IO吞吐量,IO_Throughput_Total_Kb则为二者之和,即每秒磁盘读写IO吞吐总量。示例如下:

2.png

从上图中可以看到,这个实例的IO吞吐中读IO占了大部分,写IO的比例要小的多。其中8-22点这段时间是IO负载相对比较平稳的时段,另外1-3点和22-0点各有一个明显的IO吞吐高峰。

如果实例的磁盘IO吞吐负载经常持续达到磁盘IO吞吐上限的70-80%以上,就说明实例在磁盘IO吞吐方面有比较明显的性能瓶颈,并应进行相应的原因分析和优化。对于不同类型的数据库IO操作造成的实例磁盘IO吞吐高问题,其原理和优化途径也各自不同。

磁盘IO吞吐负载分析与优化

SQL Server中的磁盘IO负载由数据文件的读、写及事务日志文件的读、写几类请求组成,其中数据文件的读IO负载主要有查询请求产生的数据页读取和数据库备份操作产生的数据页读取两类,而日志文件除了在做备份时会有较多的读IO负载,其他情况下基本主要都是写IO负载。因此,当发现实例的磁盘IO吞吐使用量较高时,我们可以进一步通过以下性能指标分析是哪一类负载导致了较高的IO吞吐:

3.png4.png

性能指标

IO类型

含义

Page_Reads

每秒由于未命中缓存从数据文件中读取的数据页的个数

Page_Write

每秒向数据文件中写入的数据页的个数

Log_Bytes_Flushed/sec

每秒向日志文件中写入的字节数

Backup_Restore_Throughput/sec

每秒由备份或还原操作产生的数据和日志文件读写的字节数

其中每个数据页的大小为8KB。

延续前面的示例,在同样的连续24小时时段内,可以获得以上性能指标的监控数据如下:

5.png

6.png

7.png

从图1中可以看到,1点左右的IO吞吐量突增主要是数据页的读取造成的,其峰值达到了50000页左右,即400MB/sec。

从图1、2、3中可以看到,2-3点左右的IO吞吐高峰由数据页读取(峰值约40MB/sec)、数据页写入(峰值也为接近40MB/sec)、日志文件写入(峰值约30MB/sec)和日志备份(峰值约50MB/sec)几类负载共同组成,累积的IO吞吐峰值约达到150MB/sec。

从图1、2中可以看到,8-22点期间的IO吞吐中大部分是数据页的读取,平均值大约在80-100MB/sec;其次是数据页的写入,平均值大约在30MB/sec;再次是日志文件的写入,平均值不到5MB/sec。

从图3中可以看到,22-0点的IO吞吐高峰完全是由备份造成的,持续达到了220MB/sec以上。

数据页读取IO吞吐高

数据页读取(Page Reads)IO吞吐高是导致RDS SQL Server实例磁盘IO吞吐高的原因中最常见的一类,其主要原因通常为实例的缓存相对不足,从而导致查询请求在执行过程中经常由于数据缓存无法命中(cache miss)而需要从磁盘中读取大量的数据页。

与缓存瓶颈诊断相关的另外一个常用的性能计数器指标是Page Life Expentancy(页生命周期),它的含义是平均每个缓存的数据页可以在内存中驻留的时间(秒),这个值越小就意味着实例的缓存压力越大(已缓存的数据页在较短的时间内就要被清除掉以容纳新读取的数据页)。

monitor_ple.png

页生命周期

Page_Life-Expectancy

8.png

一般来说Page Life Expentancy建议的阈值应至少不低于300,而实例的内存规格越高的话,这个阈值也应越大,具体可参考如下链接中推荐的阈值参考公式:

https://www.sqlshack.com/page-life-expectancy-ple-in-sql-server/

PLE (Page Life Expectancy) threshold = ((Buffer Memory Allocation (GB)) / 4 ) * 300

例如对一个16GB内存规格的RDS SQL Server实例来说,通常buffer memory实际可以使用的内存不超过12GB,按照以上公式,则Page Life Expentancy的值建议应不低于900,否则就说明实例的缓存压力较大。

对于数据页读取高导致的磁盘IO吞吐负载过高的情况,首先应考虑的优化措施是升级实例的内存规格,而不是提升实例的磁盘性能等级。磁盘性能等级的提升虽然可以缓解IO吞吐使用率过高导致的磁盘页读取性能瓶颈的问题,但相比内存页的读写,磁盘页读写的平均相应时间和CPU资源开销都是更高的,因此升级内存通常是解决此类性能问题的最佳选择。

另外在数据库层面也有很多可以通过减少数据页总量来降低缓存压力和磁盘数据页读取负载的手段,例如历史数据的归档/清理、在表上启用数据压缩、去除表上的低价值索引、索引碎片整理等,这些就需要结合具体的表和索引结构来进行深入分析和优化了。

数据页写入/日志文件写入IO吞吐高

对于数据页写入或日志文件写入导致IO吞吐高的情况,首先可利用CloudDBA中的性能洞察功能检查一下,写IO吞吐高期间是否有频繁的DML类的写入操作(INSERT/DELETE/UPDATE/MERGE等),或是主要为DDL类的写入操作(CREATE INDEX/ALTER INDEX等)。

如果主要的写负载为DML操作,可首先评估一下是否为常规的业务行为。如果不是的话(例如为临时性的数据处理或归档操作),那么尽量将此类操作错开到非业务高峰期执行通常即可。如果是的话,那意味着业务负载本身确实需要产生大量的数据/日志写入,这时如果磁盘IO吞吐达到瓶颈的话,就应考虑升级实例的磁盘性能等级了,例如从ESSD PL1到PL2。另外对表上的索引结构进行优化,尤其是去除一些不必要的非聚集索引,往往也是降低表上的数据写入操作过程中产生的数据和日志写入IO量的有效手段。

如果主要的写负载为DDL操作,那么通常都是数据维护类或临时性的行为,一般也是尽量避免在业务高峰期执行即可。另外对于索引创建/重建等操作,还可以通过在SQL语句中使用MAXDOP提示来限制任务执行的并行度,从而降低其执行过程中的磁盘IO吞吐峰值,但这也意味着DDL操作执行的时间会更长。

备份IO吞吐高

目前RDS SQL Server仅支持在主实例上进行数据库备份,而不支持在从实例上做备份。数据库备份操作导致主实例的磁盘IO吞吐高也是一种较常见的情况,其中主要是数据备份(尤其是全量备份)操作的影响,而日志备份的影响通常较小。

由于备份操作是保障RDS数据安全和可靠性所必不可少的,因此对于备份产生的磁盘IO性能影响,主要还是通过优化备份时间的设置来进行规避。

9.png

用户可在RDS控制台的数据备份历史记录中查看到近期一次全量备份执行的耗时,然后结合实例的整体负载变化情况,选择合适的备份时间窗口。

例如一次全量备份大约需要6小时,每天9点至21点是数据库常规业务负载较高的时段,22点至1点间有后台数据处理任务执行的话,那么就可以把备份(开始)时间设为01:00-02:00,这样基本上8点之前全量备份就可以完成了。而备份周期可以保持默认的每天备份的设置,这样当需要通过备份进行数据还原时,还原操作执行的效率也是相对较高的。

而如果一次全量备份大约需要15小时,每周一至周五9点至21点是数据库常规业务负载较高的时段的话,那么在周一至周五期间任何时间开始执行全量备份都可能和常规业务负载高峰时段发生冲突。在这种情况下,可以考虑将备份周期设为仅周六和周日,备份时间设为01:00-02:00。由于RDS SQL Server每3天才会做一次全量备份,其他日期是做差异备份,这样设置的结果就是每周六1点至2点间会开始执行一次全量备份、每周日1点至2点间会开始执行一次差异备份,也就是可以避免全量备份操作在业务高峰期被执行。但以上设置带来的一个影响,就是将来如果要通过备份进行指定时间点的数据还原时,还原操作执行的耗时有可能会相对较长。

而如果通过备份时间的调整无法避免全量备份操作和数据库常规业务负载高峰期的冲突的话,那么就要考虑升级实例的磁盘性能等级了。或是考虑对实例上的数据进行拆分,通过减少单个实例上的数据量大小来缩短全量备份操作所需的时间。




相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
6
分享
相关文章
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
18 2
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
126 12
突破T-SQL限制:利用CLR集成扩展RDS SQL Server的功能边界
CLR集成为SQL Server提供了强大的扩展能力,突破了T-SQL的限制,极大地拓展了SQL 的应用场景,如:复杂字符串处理、高性能计算、图像处理、机器学习集成、自定义加密解密等,使开发人员能够利用 .NET Framework的丰富功能来处理复杂的数据库任务。
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
68 4
数据库空间之谜:彻底解决RDS for SQL Server的空间难题
【8月更文挑战第16天】在管理阿里云RDS for SQL Server时,合理排查与解决空间问题是确保数据库性能稳定的关键。常见问题包括数据文件增长、日志文件膨胀及索引碎片累积。利用SQL Server的动态管理视图(DMV)可有效监测文件使用情况、日志空间及索引碎片化程度。例如,使用`sp_spaceused`检查文件使用量,`sys.dm_db_log_space_usage`监控日志空间,`sys.dm_db_index_physical_stats`识别索引碎片。同时,合理的备份策略和文件组设置也有助于优化空间使用,确保数据库高效运行。
180 2
“震撼揭秘!Flink CDC如何轻松实现SQL Server到MySQL的实时数据同步?一招在手,数据无忧!”
【8月更文挑战第7天】随着大数据技术的发展,实时数据同步变得至关重要。Apache Flink作为高性能流处理框架,在实时数据处理领域扮演着核心角色。Flink CDC(Change Data Capture)组件的加入,使得数据同步更为高效。本文介绍如何使用Flink CDC实现从SQL Server到MySQL的实时数据同步,并提供示例代码。首先确保SQL Server启用了CDC功能,接着在Flink环境中引入相关连接器。通过定义源表与目标表,并执行简单的`INSERT INTO SELECT`语句,即可完成数据同步。
656 1
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
138 0
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
826 0
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
762 0
PolarDB产品使用问题之将RDS切换到PolarDB-X 2.0时,代码层的SQL该如何改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等