延迟写入性能问题

K09*_*K09 3 performance sql-server

我的 SQL Server 有时会报告大量的延迟写入。例如“每秒延迟写入为 119 次写入/秒”

  • 我应该检查什么以找出为什么它很高?
  • 什么是潜在原因?

小智 19

懒惰的写入过程与检查点密切相关,所以我先从这个开始

从缓冲区读取页面时,可实现最佳 SQL Server 性能。为了在缓冲区中提供足够的可用空间,页面从缓冲区移动到磁盘。这些页面通常在检查点移动,可以是:

  • 自动(自动发生以满足恢复间隔请求)
  • 间接(自动发生以满足数据库目标恢复时间)
  • 手动(在执行 CHECKPOINT 命令时发生)
  • 内部(与一些服务器级操作一起发生,例如备份创建)

在检查点,所有脏页都刷新到磁盘,缓冲区缓存中的页被标记为覆盖

“出于性能原因,数据库引擎对内存中的数据库页面(在缓冲区缓存中)执行修改,并且不会在每次更改后将这些页面写入磁盘。相反,数据库引擎会定期在每个数据库上发出检查点。检查点将当前内存中的修改页(称为脏页)和事务日志信息从内存写入磁盘,同时记录有关事务日志的信息。”

数据库检查点 (SQL Server)

惰性写入器进程会定期检查缓冲区缓存中两个检查点之间的可用空间。如果缓冲区中的脏数据页(读取和/或修改的页)有一段时间没有使用,惰性写入器会将其刷新到磁盘,然后在缓冲区缓存中标记为空闲

如果 SQL Server 需要更多内存并且缓冲区缓存大小低于为 SQL Server 实例设置的最大服务器内存参数值,则惰性写入器将占用更多内存

如果 SQL Server 处于内存压力之下,惰性编写器将忙于尝试释放足够的内部内存页面,并将大量刷新页面。密集的惰性写入器活动会导致额外的物理磁盘 I/O 活动和使用更多 CPU 资源,从而影响其他资源

要确保服务器处于内存压力之下,请检查Page Life Expectancy。如果它的值很低(低于 300 秒),这就是内存压力的明确指示。还要检查Free List Stalls/sec值。如果高于2,考虑给服务器增加内存