了解非一致性内存访问

Microsoft Microsoft SQL Server 能识别非一致性内存访问 (NUMA),无需特殊配置便可在 NUMA 硬件上顺利地执行。随着处理器时钟速度的提高和处理器数量的增加,使用这种额外处理能力所需的内存滞后时间越来越难以减少。为了避开这一问题,硬件供应商提供了大型的 L3 缓存,但这只是一种有限的解决方案。NUMA 体系结构为此问题提供了可扩展的解决方案。SQL Server 已设计为利用基于 NUMA 的计算机而无需更改任何应用程序。

NUMA 概念

硬件已经趋向使用多条系统总线,每条系统总线为一小组处理器提供服务。每组处理器都有自己的内存,并可能有自己的 I/O 通道。但是,每个 CPU 都可以通过一致的方式访问与其他组关联的内存。每个组称为一个“NUMA 节点”。NUMA 节点中的 CPU 数量取决于硬件供应商。访问本地内存比访问与其他 NUMA 节点关联的内存快。这就是“非一致性内存访问体系结构”名称的由来。

在 NUMA 硬件上,有些内存区域与其他区域位于不同的物理总线上。由于 NUMA 同时使用本地内存和外部内存,因此,访问某些内存区域的时间会比访问其他内存区域的要长。“本地内存”和“外部内存”通常用于引用当前正在运行的线程。本地内存是指与当前正在运行线程的 CPU 位于同一节点上的内存。任何不属于当前正在运行的线程所在的节点的内存均为外部内存。外部内存也称为“远程内存”。访问外部内存的开销与访问本地内存的开销比率称为 NUMA 比率。如果 NUMA 比率为 1,则它是对称多处理 (SMP)。比率越高,访问其他节点内存的开销就越大。不支持 NUMA 的 Windows 应用程序(包括 SQL Server 2000 SP3 及更低版本)有时在 NUMA 硬件上的执行效果非常差。

NUMA 的主要优点是伸缩性。NUMA 体系结构在设计上已超越了 SMP 体系结构在伸缩性上的限制。通过 SMP,所有的内存访问都传递到相同的共享内存总线。这种方式非常适用于 CPU 数量相对较少的情况,但不适用于具有几十个甚至几百个 CPU 的情况,因为这些 CPU 会相互竞争对共享内存总线的访问。NUMA 通过限制任何一条内存总线上的 CPU 数量并依靠高速互连来连接各个节点,从而缓解了这些瓶颈状况。

具有 4 个处理器的 NUMA 节点

硬件 NUMA 与软件 NUMA

NUMA 可以通过专用硬件(硬件 NUMA)或通过配置 SQL Server 内存(软件 NUMA),将内存与 CPU 进行匹配。在启动过程中,SQL Server 根据基本的操作系统和硬件配置或软件 NUMA 设置对自身进行配置。对于硬件 NUMA 和软件 NUMA,当 SQL Server 通过 NUMA 配置启动时,SQL Server 日志会记录每个节点以及 CPU 掩码的多模式配置消息。

硬件 NUMA

具有硬件 NUMA 的计算机包含多条系统总线,每条系统总线为一小组处理器提供服务。每组处理器都有自己的内存,并可能有自己的 I/O 通道,但是每个 CPU 都可以通过一致的方式访问与其他组关联的内存。每个组称为一个“NUMA 节点”。NUMA 节点中的 CPU 数量取决于硬件供应商。硬件制造商会告知您计算机是否支持硬件 NUMA。

如果具有硬件 NUMA,则它可能会配置为使用交错内存而不使用 NUMA。在这种情况下,Windows 以及 SQL Server 都无法将其识别为 NUMA。请运行以下查询以查找可用于 SQL Server 的内存节点数:

SELECT DISTINCT memory_node_id
FROM sys.dm_os_memory_clerks

如果 SQL Server 仅返回一个内存节点(节点 0),则表示没有硬件 NUMA,或者该硬件已配置为交错硬件(非 NUMA)。如果您认为硬件 NUMA 配置不正确,则请与硬件供应商联系以启用 NUMA。SQL Server 会在硬件 NUMA 有四个或少于四个 CPU,并且至少一个节点只有一个 CPU 时,忽略 NUMA 配置。

软件 NUMA

SQL Server 允许您将 CPU 分组到称为软件 NUMA 的节点中。如果您有多个 CPU 但没有硬件 NUMA,则通常需要配置软件 NUMA,但是您还可以使用软件 NUMA 将硬件 NUMA 节点再细分为更小的组。只有 SQL Server 计划程序和 SQL Server 网络接口 (SNI) 才支持软件 NUMA。内存节点基于硬件 NUMA 创建,因此,不会受软件 NUMA 的影响。例如,如果具有安装了八个 CPU 的 SMP 计算机,并且创建了分别具有两个 CPU 的四个软件 NUMA 节点,则将只有一个为所有四个 NUMA 节点提供服务的内存节点。软件 NUMA 不提供内存与 CPU 的关联。

软件 NUMA 的优点体现在:缓解了具有多个 CPU 但没有硬件 NUMA 的计算机上 I/O 和惰性编写器的瓶颈作用。每个 NUMA 节点具有一个 I/O 线程和一个惰性编写器线程。根据数据库的使用情况,这些单个线程可能会具有明显的性能瓶颈。如果配置四个软件 NUMA 节点,则可提供四个 I/O 线程和四个惰性编写器线程,从而可以提高性能。

无法创建包含来自不同硬件 NUMA 节点的 CPU 的软件 NUMA。例如,如果硬件具有八个 CPU (0..7) 并且具有两个硬件 NUMA 节点(0-3 和 4-7),则可以通过组合 CPU(0,1) 和 CPU(2,3) 来创建软件 NUMA。无法使用 CPU (1, 5) 创建软件 NUMA,但是可以使用 CPU 关联将 SQL Server 实例与来自不同 NUMA 节点的 CPU 进行关联。因此,在上述示例中,如果 SQL Server 使用 CPU 0-3,则将只有一个 I/O 线程和一个惰性编写器线程。如果在上述示例中,SQL Server 使用 CPU 1、2、5 和 6,则您将访问两个 NUMA 节点并具有两个 I/O 线程和两个惰性编写器线程。

注意注意

有些硬件配置将共享 L3/L4 缓存之类的公共资源。可以按照这些共享资源对处理器进行分组,以创建软件 NUMA 节点。

有关详细信息,请参阅如何将 SQL Server 配置为使用软件 NUMA