我们有一个 SQL Server 2008R2 标准版,其中包含多个数据库,属于 16 核服务器上的不同应用程序。
最近推出的一个应用程序定期执行导致 100% CPU 使用率的昂贵查询。当然,其他应用程序正在报告性能问题。
资源管理器似乎是控制流氓应用程序的合适工具,不幸的是它仅在企业版中可用。
由于其他应用程序都比较简单,我试图通过降低实例的“最大并行度”来控制问题,这样单个查询就不能搞定所有事情。虽然这成功地将 CPU 负载保持在 50%,但令人惊讶的是,它并没有阻止其他应用程序陷入困境。
现在我们决定将新应用程序的数据库移至专用实例,但该实例的最佳配置是什么?我应该保留 MAXDOP 设置、使用 CPU 关联掩码还是有其他选项来限制我不知道的 CPU 使用率?
您可以使用 Windows 系统资源管理器 (WSRM),它是 Windows Server 中的一项功能(不确定最低版本,但肯定是 2008 R2+)。
这将允许您控制进程使用的 CPU 数量,因此,如果您还没有将恶意应用程序分离到它自己的 SQL Server 实例中,那么无论如何您都必须这样做。
此时您可以设置任何
MAXDOP
您想要的,因为该过程永远不会超过您在 WSRM 中设置的最大限制。设置 CPU 关联掩码是一个选项。您希望将应用程序完全隔离到它自己的一组内核上以消除争用(注意:注意您的 NUMA 节点)。如果您有这些额外的内核可用,那就去吧,但我更喜欢 WSRM 解决方案,因为当该应用程序空闲时,所有CPU 都可以被其他应用程序使用。
如果您将 MAXDOP 设置为内核的一半,并且其他查询仍然被搁置,您可能正在处理内存或磁盘 I/O 的争用。服务器中有多少 RAM,应用程序数据库有多大?
当性能急剧下降时,查看这些性能计数器,您可以了解服务器是否需要更多内存或更快的磁盘子系统:
SQLServer:缓冲区管理器
如果 Page reads/sec 飙升,而其他两个显着下降,那么麻烦的查询可能会破坏您的缓冲池并导致大量磁盘 I/O。然后,您可以调整查询,或者投入更多硬件(更多 RAM,更快的磁盘)。