好的,所以我有一系列 AWS VM,主要使用内置 SQL Server 2019 的z1d.3xlarge服务器类,这些服务器每个都包含一个不同大小的 NVMe。(不足为奇)我将我的 SQL Server TempDB 驱动器放在这个驱动器上,运行良好,没问题。
现在我正在尝试在 Azure 上做完全相同的事情,在这种情况下,我使用的是“标准 E4bds v5”类和 SQL Server 2022 开发许可证,同样的交易,附加的 NVMe,高性能(由“atto”验证对它进行基准测试,它实际上预制得更好),应该工作正常,除了它不......
例如,我有一个查询在任何一台服务器上运行时都会产生大量 TempDB 溢出(在两台服务器上生成相同的查询计划):
蔚蓝
AWS(完全相同的计划)
相同的查询、相同的计划、相同的 tempDB 溢出,在 AWS 服务器上,3 分钟,在 Azure 服务器上,11 分钟。为什么?很好地分配了各种等待统计和 perfmon,当 TempDB 溢出发生在 Azure 服务器上时,它会以每秒 25MB 的速度排序站点:
如果你在 AWS 服务器上运行同样的东西,你会看到高达每秒 900MB 的峰值。看看这个,我相信导致 TempDB 驱动器 IO 性能降低的任何因素也会导致运行时间延长。我研究了以下因素:
CPU:两台服务器上的 CPU 通常都很低,大部分时间低于 10%
内存:这个查询只导致 SQL Server 占用大约 1GB 左右,它使用的内存非常少,服务器上只使用了 12% 的内存,我禁用了分页并启用了锁定内存,没有效果
其他磁盘 IO:一切都是高级 SSD,基准测试很棒,在 Perfmon 中看起来不错,我可以在资源监视器中看到大部分使用都集中在“D”驱动器(tempDB)上:
活动监视器:运行时只显示一堆读取,少量 BufferIO 等待:
这种性能不佳的最可能原因是什么,TempDB 速度的瓶颈是什么(在这种情况下但不是在其他查询中),我将如何确定导致查询速度差异的两台服务器之间的差异?
更新 1
根据 JD 的要求,我已在每台服务器上的 TempDB 驱动器的 CrystalMark 基准测试下方发布
AWS 临时驱动器性能:
Azure 临时驱动器性能:
出于某种原因,该基准测试显示 Azure 驱动器的性能比 AWS 驱动器的性能差(这与显示相反结果的 ATTO 基准测试结果不同)。也许这就是正在发生的事情,到目前为止我一直专注于“ Ebsv5 系列”,我将尝试获得更大的服务器,理论上应该在所有驱动器上为我提供更多的“IOPS/MBps”(不是确定这是否会影响 NVMe 的...)。
我还将对更大的服务器进行基准测试,看看它的性能是否更好,我将在此处发布结果。
更新 2
是的,JD 是对的,“Standard_E16-8ads_v5”更好看:
该
RND4K
指标将与常规 (OLTP) 查询性能最相关。结果是 AWS 服务器速度的 1/10 的事实说明了这一点。此外,您为 Azure 选择的服务器实际上比 AWS 慢得多(CPU 和内存的 1/3):
我确定您的查询中的瓶颈不仅仅是磁盘限制,而且可能也是 CPU 和内存限制。如果您通过粘贴计划添加了实际的执行计划,则可能会确认这一点。
同样,这些问题从根本上与查询本身和/或您的数据库的构建方式有关(因为您提到这是一个反复出现的问题)。解决数据库架构的软件问题可能会让您的查询即使在您选择的硬件配置较低的 Azure 服务器上也能正常运行。