了解非一致性内存访问numa(虽然是关于windows sql的解释,但是原理说的不错)

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

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 线程和两个惰性编写器线程。

 

 

本主题介绍,在使用非一致性内存访问 (NUMA) 时,如何分配缓冲池中的内存页。使用此信息可以了解 SQL Server 使用 NUMA 的方式,并了解如何解释缓冲节点对象计数器。

每个物理 NUMA 节点都有一个 SQL Server 内存节点。内存节点彼此独立地增长,但是会平均划分内存。为了显示 SQL Server 中的本地内存分布与外部内存分布,本主题使用的示例假定计算机的内存大小为 16 GB。包含 Windows 在内的其他应用程序已占用了各个节点上的一些内存,SQL Server 已经为缓冲池外部的进程分配了一些内存,现在,SQL Server 可以为缓冲池分配的内存只有 10 GB。在四个物理 NUMA 节点 N0、N1、N2 和 N3 之间,对缓冲池内存进行了划分,其中每个节点的本地可用内存分别为:

  • N0 – 1 GB
  • N1 – 3 GB
  • N2 – 3 GB
  • N3 – 3 GB

在上述配置中,所有节点最终分配并使用 2.5 GB 内存;但是,节点 N0 将用完它自己的 1.0 GB 内存并使用其他节点上的 1.5 GB 内存。

使用 NUMA 时,即使初始可用内存在节点之间的分布不均匀,SQL Server 也能够以可与非 NUMA 系统比拟的速度从操作系统中接收内存。缓冲池将尝试为每个节点获取尽可能多的本地内存;但是由于 Windows 当前没有从特定节点分配内存的 API,因此很难完成此操作。

当内存分配到 SQL Server 时,您可以观察到某些节点获得了许多来自其他 NUMA 节点的页(称为“外部页 ”)。但是,由于这些外部页可以被频繁地传输到所属节点并变为该节点的本地页,因此,不能在增长过程中使用这些页。当达到 max server memory 值时,一些节点便会拥有外部内存,但是一旦达到内存目标,缓冲池便会同等处理本地内存和外部内存。例如,在内存压力下,缓冲池不会努力尝试在释放本地内存页前释放外部内存页。

如果已将 SQL Server 配置为在可用 NUMA 节点的子集上运行,则不会自动将缓冲池限制为这些节点上的内存。在这种情况下,可以使用 max server memory 选项限制缓冲池。有关 max server memory 的信息,请参阅服务器内存选项

使用 NUMA 时,会在 NUMA 节点之间平均划分 max server memorymin server memory 的值。例如,如果在具有四个节点的系统上将 max server memory 设置为 16 GB,则缓冲池将为每个节点分配 4 GB 内存。如果通过更改 affinity mask 设置使其中一个节点脱机,则将在剩余的节点上重新分布 max server memory 设置。例如,在先前的四个节点示例中,如果使两个节点脱机,则在剩余的节点上均匀分布已释放的 8 GB 内存。因为缓冲池可以使用外部页,所以当剩余节点上的内存不足时,可使用远程内存。如果您希望 SQL Server 不使用它不再在其上运行的节点的内存,则必须在使节点脱机后减小 max server memory 设置。

各节点在很大程度上彼此独立发挥作用。某个节点的所有内存分配和释放均使用与该节点相关的内存完成。但是,如果节点 N1 上运行的工作线程需要访问节点 N2 内存中的数据库页,则表示它要访问非本地内存。

可以通过查看 Buffer Node 对象来观察缓冲池。SQL Server 的缓冲池中的总内存显示为 Buffer Manager 对象的“目标页数”的计数器。缓冲池中用于每个节点的内存显示为 Buffer Node 对象的“目标页数”的计数器。其他节点的内存显示为“外部页数”的计数器。有关详细信息,请参阅 SQL Server Buffer Node 对象SQL Server Buffer Manager 对象

每个内存节点都有它自己的惰性编写器线程。此线程可同时针对隐式检查点和显式检查点进行调用。由于对称多处理 (SMP) 计算机仅有一个检查点线程,因此,在使用 NUMA 时,多个线程将导致检查点的速度增加。

除非在 CPU 上对多个节点执行并行扫描,否则,对节点 N1 执行的表扫描仅填充与节点 N1 关联的内存。如果只对单个节点执行排他扫描,则仅使用该节点的缓冲区页。这有助于对“应用程序”的工作负荷进行分区。

 

NUMA 方案

在安装有多个 CPU 的计算机中,非一致性内存访问 (NUMA) 硬件可以通过将专用内存与 CPU 配对来显著提高性能。本主题针对特定方案介绍了可以进一步提高性能的 NUMA 配置、CPU 关联和连接关联。下列设置将影响这些配置:

使用 NUMA 时,会经常遇到下面几种方案。

A. 没有端口到 NUMA 的关联

这是具有硬件 NUMA 和单个 SQL Server 实例的计算机中的默认设置。所有通信流量都通过一个单独的端口输入并采用循环方式分布到任何可用的 NUMA 节点。NUMA 增大了内存和 CPU 访问的区域并增加了 I/O 和惰性编写器线程的数量。在建立连接后会立即将其作用域限定为此节点。它提供了 NUMA 节点间的自动负载平衡。客户端应用程序可以连接到单个端口,而且可以轻松地进行部署。

连接使用任何 NUMA 节点。

B. 将单个端口关联到多个节点以提高主要应用程序的性能

将一个端口关联到多个用于主要应用程序的硬件 NUMA 节点。将第二个端口关联到另一个用于第二个次要应用程序的硬件 NUMA 节点。用于这两个应用程序的内存和 CPU 资源量非常不平衡,用于主要应用程序的本地内存和 CPU 资源量是用于次要应用程序的三倍。次要应用程序可以是数据库引擎的第二个实例,它在同一数据库引擎实例中,甚至在同一数据库中提供次要的功能。通过向优先使用的连接提供额外资源,它提供了一种线程优先执行的方式。

一个端口连接到多个 NUMA 节点。

C. 将多个端口关联到多个节点

可以将多个端口映射到同一 NUMA 节点。这样,您就可以为不同的端口配置不同的权限。例如,您可以通过控制对相应 TCP 端点的权限来严格限制由某个端口提供的访问。在此示例中,端口 1450 在 Intranet 上普遍可用。端口 1433 通过防火墙连接到 Internet,但对它的访问受到严格的限制。两个端口都可以充分、平等地利用 NUMA。

多个端口连接到所有可用的 NUMA 节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值