你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
SQL 超大规模服务层级性能故障排除诊断
适用于:Azure SQL 数据库
若要排查“超大规模”数据库中的性能问题,一般 SQL 性能优化方法 是任何性能调查的起点。 但是,由于超大规模数据库采用分布式体系结构,可能需要考虑其他诊断数据。 本文将描述超大规模数据库特定的诊断数据。
缩短了日志速率等待
Azure SQL 数据库中的每个数据库和弹性池通过 日志速率治理管理日志生成率。 在“超大规模”中,无论计算大小如何,日志速率治理限制都设置为 105 MB/秒。 此值在 primary_max_log_rate
的 列中公开。
有时,必须减少主计算副本上的日志生成速率,以保持可恢复性 SLA。 例如,在应用日志服务中的新日志记录后,很久才出现页面服务器或其他计算副本,则会发生此情况。 如果没有超大规模组件,则日志速率治理机制允许日志生成速率达到 100 MB/秒。 这是所有超大规模计算大小中有效的最大日志生成速率。
注意
150 MB/s 的日志生成速率作为选择加入预览功能提供。 如需了解详细信息和选择加入 150 MB/s,请参阅博客:2024 年 11 月超大规模增强功能。
当日志写入速率下降时,以下等待类型会出现在 sys.dm_os_wait_stats 中:
等待类型 | 原因 |
---|---|
RBIO_RG_STORAGE |
页面服务器延迟了日志消耗 |
RBIO_RG_DESTAGE |
长期日志存储延迟了日志消耗 |
RBIO_RG_REPLICA |
HA 次要副本或命名副本延迟了日志消耗 |
RBIO_RG_GEOREPLICA |
地理辅助副本延迟了日志消耗 |
RBIO_RG_DESTAGE |
日志服务延迟了日志消耗 |
RBIO_RG_LOCALDESTAGE |
日志服务延迟了日志消耗 |
RBIO_RG_STORAGE_CHECKPOINT |
由于数据库检查点缓慢,页面服务器延迟了日志消耗 |
RBIO_RG_MIGRATION_TARGET |
反向迁移期间,非超大规模数据库延迟了日志消耗 |
sys.dm_hs_database_log_rate() 动态管理函数(DMF)提供了其他详细信息,以帮助你理解日志速率减少的情况(如果有的话)。 例如,它可以指明哪个具体次要副本在应用日志记录方面滞后,以及尚未应用的事务日志的总大小。
页面服务器读取
计算副本不会在本地缓存数据库的完整副本。 计算副本的本地数据存储在缓冲池(内存中)和本地弹性缓冲池扩展(RBPEX)缓存中,其中包含最常访问的数据页的子集。 此本地 SSD 缓存的大小与计算大小成正比。 另一方面,每个页面服务器都有它维护的数据库部分的完整 SSD 缓存。
在计算副本上发出读取 IO 请求时,如果数据不在缓冲池或本地 SSD 缓存中,则从相应的页面服务器获取位于请求的日志序列号 (LSN) 的页面。 从页面服务器进行读取是远程操作,速度比从本地 SSD 缓存读取慢。 排查 I/O 相关的性能问题时,我们需要能够通过相对较慢的页面服务器读取来判断已完成的 IO 数。
多个动态管理视图 (DMV) 和扩展事件包含的列与字段指定了从页面服务器执行的远程读取数,可将其与读取总数进行比较。 查询存储还会在查询运行时统计信息中捕获页面服务器读取。
- 执行 DMV 和目录视图中提供了用于报告页面服务器读取操作的列:
- 页面服务器读取字段位于以下扩展事件中:
sql_statement_completed
sp_statement_completed
sql_batch_completed
rpc_completed
scan_stopped
query_store_begin_persist_runtime_stat
query_store_execution_runtime_info
ActualPageServerReads
/ActualPageServerReadAheads
属性存在于包含运行时统计信息的计划查询计划 XML 中。 例如:<RunTimeCountersPerThread Thread="8" ActualRows="90466461" [...] ActualPageServerReads="0" ActualPageServerReadAheads="5687297" ActualLobPageServerReads="0" ActualLobPageServerReadAheads="0" />
提示
若要在查询计划属性窗口中查看这些属性,需要安装 SSMS 18.3 或更高版本。
虚拟文件统计信息和 IO 记帐
在 Azure SQL 数据库中,sys.dm_io_virtual_file_stats() DMF 是监视数据库 I/O 统计信息(例如 IOPS、吞吐量和延迟)的一种方法。 “超大规模”采用分布式体系结构,因此其 I/O 特征有所不同。 本部分重点介绍此 DMF 中所示的读取和写入 I/O。 在“超大规模”中,此 DMF 中显示的每个数据文件对应于页面服务器。 DMF 还为计算副本和事务日志上的本地 SSD 缓存提供 I/O 统计信息。
本地 SSD 缓存使用情况
由于本地 SSD 缓存存在于数据库引擎正在处理查询的同一计算副本上,因此针对此缓存的 I/O 比针对页面服务器的 I/O 更快。 在超大规模数据库或弹性池中,sys.dm_io_virtual_file_stats()
具有用于报告本地 SSD 缓存 I/O 统计信息的特殊行。 对于 database_id
和 file_id
列,此行的值均为 0
。 例如,下面的查询返回自数据库启动以来的本地 SSD 缓存 I/O 统计信息。
SELECT *
FROM sys.dm_io_virtual_file_stats(0, NULL);
从本地 SSD 缓存到来自所有其他数据文件的聚合读取的比率是本地 SSD 缓存命中率。 此指标由 sys.dm_os_performance_counters DMV 中提供的 RBPEX cache hit ratio
和 RBPEX cache hit ratio base
性能计数器提供。
数据读取
- 当数据库引擎在计算副本上发出读取请求时,它们可能由本地SSD缓存或页面服务器提供服务,或者在读取多个页面时由两者组合提供服务。
- 当计算副本从特定数据文件(例如,具有
file_id
1 的文件)读取某些页面时,如果此数据仅驻留在本地 SSD 缓存中,则此读取的所有 IO 将计入file_id
0。 如果该数据的某些部分位于本地SSD缓存中,而另一些部分位于页面服务器上,那么来自本地SSD缓存的IO操作将计入file_id
0,而来自页面服务器的IO操作将计入它们各自的文件。 - 当计算副本从页面服务器请求位于特定 LSN 的页面时,如果页面服务器尚未捕获到请求的 LSN,则计算副本上的读取操作将会等待,直到页面服务器捕获到该 LSN,然后会返回页面。 对于从计算副本上的页面服务器执行的任何读取,如果该操作正在等待该 IO,则会出现
PAGEIOLATCH_*
等待类型。 在“超大规模”中,此等待时间包括捕获到页面服务器上位于所需 LSN 处的请求页面的时间,以及将该页面从页面服务器传输到计算副本所需的时间。 - 大型读取(例如预读)通常是使用“分散/集中”读取完成的。 这样就可在一次读取 IO 中读取高达 4 MB 内容。 但是,当读取的数据位于本地 SSD 缓存中时,这些读取被视为多个单独的 8 KB 读取,因为缓冲池和本地 SSD 缓存始终使用 8 KB 页。 因此,针对本地 SSD 缓存看到的读取 IO 数可能大于引擎执行的实际 IO 数。
数据写入
- 主计算副本不会直接写入页面服务器, 而是在相应的页面服务器上重播日志服务中的日志记录。
- 计算副本上的写入主要是写入本地 SSD 缓存 (
file_id
0)。 对于大于 8 KB 的写入,(即使用集中写入完成的写入),每个写入操作都会转换为对本地 SSD 缓存的多个单独 8-KB 写入,因为缓冲池和本地 SSD 缓存始终使用 8-KB 页面。 因此,针对本地 SSD 缓存看到的写入 IO 数可能大于引擎执行的实际 IO 数。 file_id
0 以外的对应于页面服务器的数据文件可能也会显示写入。 在“超大规模”中,这些写入是模拟的,因为计算副本永远不会直接写入页面服务器。 I/O 统计信息在出现在计算副本上时会被记录。file_id
0 以外的数据文件的计算副本上显示的 IOPS、吞吐量和延迟并不反映页面服务器上发生的写入的实际 I/O 统计信息。
日志写入
- 在主计算副本中,日志写入被记录在
file_id
2 下的sys.dm_io_virtual_file_stats()
中。 - 与在 AlwaysOn 可用性组中不同,在主计算副本上提交事务时,日志记录不会在辅助副本上进行强化。 在“超大规模”中,日志在日志服务中强化,并异步应用于辅助副本。 由于日志写入实际上不会发生在辅助副本上,因此不应将辅助副本上
sys.dm_io_virtual_file_stats()
中的日志 IO 的任何计帐用作事务日志 I/O 统计数据。
资源利用率统计信息中的数据 IO
在非超大规模数据库中,有关相对于资源管理数据 IOPS 限制的针对数据文件的组合读取和写入 IOPS,可查看 列中的 sys.dm_db_resource_stats 和 avg_data_io_percent
视图。 弹性池的相应 DMV 是 sys.dm_elastic_pool_resource_stats 和 sys.elastic_pool_resource_stats。 相同的值会被报告为数据库和弹性池的“数据 IO 百分比”Azure Monitor 指标。
在超大规模数据库中,这些列和指标报告数据 IOPS 利用率(相对于仅限计算副本上的本地 SSD 存储的限制),包含针对本地 SSD 缓存和 tempdb
数据库中的 I/O。 此列中的值 100% 表示资源管理限制了本地存储 IOPS。 如果这与性能问题相关,请优化工作负载以生成较少的 IO,或者增加计算大小以提高资源管理“最大数据 IOPS”限制。 对于本地 SSD 缓存读取和写入的资源管理,系统会对单个 8 KB IO 进行计数,而不是计算可能由数据库引擎发出的较大 IO。
如上所述,针对页面服务器的数据 IO 不会在资源利用率视图中或通过 Azure Monitor 指标中报告,但会在 sys.dm_io_virtual_file_stats()
中报告。
相关内容
- 有关“超大规模”单一数据库的 vCore 资源限制,请参阅超大规模服务层级的 vCore 限制
- 若要监视 Azure SQL 数据库,请启用数据库观察程序
- 有关如何优化 Azure SQL 数据库性能,请参阅 Azure SQL 数据库中的查询性能
- 有关如何使用查询存储优化性能,请参阅使用查询存储进行性能监视
- 有关 DMV 监视脚本,请参阅使用动态管理视图监视 Azure SQL 数据库的性能