由于我们有可读的辅助配置,我们正面临 REDO 队列波动的问题。
根据我对 SQL Server 较新版本的理解,重做线程是并行的。当前版本是在具有 64 个内核的 VM 上运行的 SQL Server 2017。
当在运行 AG 线程的同一个 cpu/调度程序上运行辅助选择查询时,我看到了问题。我假设 AG 线程产生它的调度程序并退居二线让其他查询运行。我相信这是问题所在,因为进来的查询似乎在 AG 线程正在执行重做工作的地方遇到相同的 cpu_id。
下面的示例:spid 91 是对 cpu_id 6 的选择查询,同时 spid 123 和 144 正在为 AG 运行线程,如从 sys.dm_exec_requests dmv 中找到的。当 91 出现时,REDO 队列开始建立。
我不知道是否有任何进程使您的查询转到不同的内核,而不是 AG 线程可能正在运行的内核。
我们可以控制它以使查询命中其他调度程序而不是 AG 工作的调度程序吗?
当 AG 线程挂起时在辅助节点上运行查询时,我看到 PARALLEL_REDO_TRAN_TURN 上有很多等待。可以跟踪此处提到的标志帮助
可能还有许多其他可用的调度程序。我无法理解为什么某些进程卡在 Numa 的插槽中。我想较新的版本启用了所有软 numa,因此可以制作 8 个软 numa 桶。8*8 调度器,64 可用。在这里禁用软 numa 是个好主意吗?
数据库隔离是 RCSI,但我认为这并不重要,因为在内部它已根据可读辅助节点的设计更改为快照。
虽然这可能不是您正在寻找的答案,因为它最终需要迁移,但您可以尝试在 SQL Server 2019 上运行您的工作负载,以便能够使用“ SQL Server 2019 Intelligent Performance -Worker Migration ”或通常称为 Worker偷窃。
资源
如同一来源中所述,并行重做有资格进行工作人员迁移:
迁移到 SQL Server 2019 时,此功能默认启用。
添加
如果无法调整辅助节点上运行的查询(例如,辅助节点上长时间运行的查询时间减少),则该跟踪标志可以提供好处。但可能还有其他原因,例如频繁的页面拆分。
查看运行重做线程序列是否对您的设置有益的一种方法是查看
PARALLEL_REDO_TRAN_TURN
等待统计信息,但您应该始终将这些信息与其他信息进行比较,例如辅助重做队列大小的增加/减少。请注意启用此跟踪标志,因为重做性能可能会因串行而不是并行而受到影响。