我有一个运行 SQL Server 2016(4 个 vcore)的虚拟服务器,其中大多数时候处理器队列长度为 4(有时它会上升到 15),但 CPU 平均使用 25%。大约有3000批次/秒。
使用SQLSkills.com 上 Glenn Berry 的一篇文章中的查询,我发现有avg_task_count
15 个和avg_runnable_task_count
2 个(但不是经常):
SELECT AVG(current_tasks_count) AS [Avg Task Count],
AVG(work_queue_count) AS [Avg Work Queue Count],
AVG(runnable_tasks_count) AS [Avg Runnable Task Count],
AVG(pending_disk_io_count) AS [Avg Pending DiskIO Count]
FROM sys.dm_os_schedulers WITH (NOLOCK)
WHERE scheduler_id < 255 OPTION (RECOMPILE);
说处理器队列长度和avg_task_count
表示有很多请求并且服务器在处理它们时遇到问题是否正确?但我不明白的是为什么cpu使用率不高?
物理主机有 25% 的 CPU 使用率,没有内存预留,但主机上没有内存过度使用。
虽然下面的建议可能不会专门将 4-CPU VM 上的处理器队列长度减少到 4 以下,但它们将有助于提高整体性能,这大概就是您提出问题的原因。
VMware 和 Microsoft 发布的最佳实践明确建议您应该为任何运行 SQL Server 的 VM 设置 CPU 预留和内存预留。
有关如何使 SQL Server 以最佳性能可靠运行的所有详细信息,请参阅VMware在 vSphere 上构建 Microsoft SQL Server - 最佳实践指南。
我知道您没有使用 Microsoft 的 Hyper-V 产品,但是对于可能会看到这篇文章的未来用户,请参阅使用 Hyper-V 动态内存运行 SQL Server 以获得他们的建议。
从 SQL Server 中获得最佳性能的具体建议包括:
将“最大服务器内存”配置为对您的环境有意义的设置。 这篇文章可以帮助您确定应该设置什么。
确保将“最小服务器内存”设置为有意义的值。对于生产 SQL Server,“典型”是将其设置为与“最大服务器内存”相同的值,或者设置为比最大服务器内存低 1 或 2 GB 的值,以防 O/S 遇到极大的内存压力。
使用“Lock Pages in Memory”权限配置 SQL Server 使用的服务帐户。有关详细信息,请参阅此帖子。
确保您至少为 VM 配置了 2 个内核。您可能需要多于 2 个,但使用单核设置 VM 会导致灾难。对于生产 SQL Server 安装,我建议至少8 个内核。
在 Hyper-V 中,将 VM 配置为支持 NUMA,并禁用“动态内存”。许多服务器人员会拒绝这个建议,因为它减少了可以在任何单个主机服务器上运行的 VM 数量;但是,对于始终需要大量内存的任何服务(例如数据库管理系统)而言,这对于良好的性能至关重要。在 VMWare 中,为 VM 配置与分配给 VM 的内存总量相匹配的内存预留。这可以防止 VMware气球驱动程序消耗 VM 中的内存,这反过来会减少 SQL Server 可用的内存,从而降低性能。
确保使用高队列 SCSI 接口和网络接口配置 VM - 阅读上面链接的最佳实践文档以获取具体建议。
正如@SqlWorldWide 在对您的问题的评论中提到的那样,您应该看看这个。取自该新闻组的帖子: