SQL Server 如何支持 NUMA

SQL Server 2005 引入了下列关键更改以利用非一致性内存访问 (NUMA) 体系结构。

公共 CPU 的分组

SQL Server 对计划程序进行分组,以根据 Windows 所显示的硬件 NUMA 边界将这些计划程序映射到 CPU 的分组。例如,16 路逻辑单元有 4 个 NUMA 节点,每个节点有 4 个 CPU。这使得在节点上处理任务时,该组计划程序具有更多的本地内存。使用 SQL Server,您可以进一步将与硬件 NUMA 节点关联的 CPU 细分为多个 CPU 节点。这称为软件 NUMA。通常,您将细分 CPU 以跨 CPU 节点对工作进行分区。有关软件 NUMA 的详细信息,请参阅了解非一致性内存访问

当特定硬件 NUMA 节点上运行的线程分配内存时,SQL Server 的内存管理器将尝试从与 NUMA 节点关联的内存分配内存以进行本地引用。同样,缓冲池页将跨硬件 NUMA 节点进行分布。线程从分配到本地内存的缓冲区页访问内存比从外部内存进行访问效率更高。有关详细信息,请参阅使用 NUMA 扩展和收缩缓冲池

每个 NUMA 节点(硬件 NUMA 或软件 NUMA)都有一个用于处理网络 I/O 的相关 I/O 完成端口,这有助于跨多个端口分布网络 I/O 处理。当某个客户端连接到 SQL Server 时,将绑定到其中一个节点。此客户端的所有批处理请求都将在该节点上处理。

每次在 NUMA 环境中启动 SQL Server 实例时,SQL 错误日志都包含说明 NUMA 配置的信息性消息。

SQL Server 如何将软件 NUMA 节点映射到硬件 NUMA 节点

软件 NUMA 针对计算机中的所有 SQL Server 实例定义一次,因此,多个数据库引擎实例都能看到同样的软件 NUMA 节点。然后,每个数据库引擎实例都使用 affinity mask 选项选择相应的 CPU。接着,每个实例都使用与这些 CPU 关联的任何软件 NUMA 节点。

Windows 在启动后,从硬件 NODE 0 为操作系统分配内存。因此,硬件 NODE 0 可用于其他应用程序的本地内存少于其他节点。当需要缓存一个大型文件时,此问题尤为突出。当 SQL Server 在具有多个 NUMA 节点的计算机中启动时,它将尝试在 NODE 0 以外的 NUMA 节点上启动,这样,其整体结构即可分配到本地内存上。若要配置软件 NUMA,请参阅如何将 SQL Server 配置为使用软件 NUMA

如何将连接分配到 NUMA 节点

TCP 和 VIA 都可以将连接关联到一个或多个特定 NUMA 节点。当未进行关联,或使用 Named Pipes 或 Shared Memory 进行连接时,连接将采用循环方式分布到 NUMA 节点。在 NUMA 节点内,连接按照该节点上负载最小的计划程序运行。由于新连接的分配具有循环性,因此,当某个节点空闲时,另一个节点中的所有 CPU 可能都处于繁忙状态。如果您的 CPU 非常少(如 2 个),并且看到由于具有长时间运行的批处理(如大容量加载)而导致庞大的计划不均衡,则在这种情况下,关闭 NUMA 可能会提高性能。有关详细信息,请参阅如何将 TCP/IP 端口映射到 NUMA 节点

SQL Server 版本限制

从 SQL Server 2000 到 Service Pack 3,都不包括对 NUMA 的特别支持;但是,Service Pack 4 有一些有限的 NUMA 优化。SQL Server 2005 有了大量重要的改进,因此,我们极力鼓励 NUMA 用户升级到 SQL Server 2005 以充分利用 NUMA 体系结构。