SQL Server NUMA 的建议 MAXDOP 设置

我有一个在SQL 2008 R2企业版上运行的OLTP SQL数据库,可能在投入生产后的几个月内非常繁忙(每秒5000批次)。在查看服务器配置时,我对设置MAXDOP有疑问,然而现在作为这个论坛的常规读者,我发现普遍共识是将服务器范围的MAXDOP设置为0,用于需要并行操作的任务(例如索引重建),并将并行操作的成本阈值设置为更高的数字(15或20,而不是默认的5)。 然而,这台服务器有NUMA节点,根据这些微软支持文章 http://support.microsoft.com/kb/329204

http://support.microsoft.com/kb/2023536

为了防止昂贵的外部内存访问,建议将MAXDOP设置为物理处理器中的核心数。 该服务器有2个物理处理器,每个插槽上有16个逻辑(8个物理)核心。那个MS支持KB提出的指导方针仍然有效吗? 我知道一切都需要尝试和测试,但我的目标是将MAXDOP设置为最佳理论值,并在需要时进行调整。根据这个,我应该将MAXDOP设置为8吗?

3在我看来,这些知识库文章非常详尽和具体,所以我建议您从那些推荐开始阅读。 - Jon Seigel
1个回答

通常我建议我的客户不要去动MAXDOP。SQL Server是NUMA感知的,所以它知道处理器在哪个NUMA节点,内存在哪个NUMA节点,并且会尽力将工作分配给正确的NUMA节点上的调度程序,以获取您所需的数据。 研究这类问题还需要了解您有多少个NUMA节点。每个物理处理器是否位于自己的NUMA节点中,还是它们位于同一个NUMA节点中?

通过查看sys.dm_os_nodes,我发现有两个节点,因此每个物理进程都在其自己的NUMA节点上。 - SQL Learner
你有节点0和1还是节点0和64? - mrdenny
我有节点0、节点1和节点ID 64用于DAC。Denny,我认为你关于MAXDOP=0的建议可能不太好,因为我在书籍或Cindy Gross的博客中从未读到过设置MAXDOP超过8的内容。现在使用MAXDOP=0可以可能使用所有32个调度程序。 - SQL Learner
1这完全取决于您系统的工作负荷。当阅读辛迪的博客(或者任何CAT团队的成员)时,他们处理的是最大最复杂的系统,他们的建议通常基于此。我有64个核心、4个NUMA节点、73个调度器和maxdop设置为0的客户,一切都运行得很好。这完全取决于系统的工作方式,并且请记住,这些设置没有硬性规定。每个系统都是不同的。找一个起点,在真实的工作负荷下进行测试。 - mrdenny
谢谢Denny先生。几年前您为DBAs PASS峰会做的存储基础知识演讲非常棒。感谢您。 - SQL Learner