说到服务器的NUMA架构,你们或许都知道。NUMA架构在中大型系统上一直很是盛行,也是高性能的解决方案,尤为在系统延迟方面表现都很优秀。但NUMA架构对服务器的相关性能到底有什么影响,怎样设置会更好呢?本文在此解析一下。git
一、什么是NUMA数据库
NUMA(Non Uniform Memory Access Architecture)是一种用于多处理器的电脑记忆体设计,内存访问时间取决于处理器的内存位置。 在NUMA下,处理器访问它本身的本地存储器的速度比非本地存储器(存储器的地方到另外一个处理器之间共享的处理器或存储器)快一些。安全
NUMA架构在逻辑上遵循对称多处理(SMP)架构。 它是在二十世纪九十年代被开发出来的,开发商包括Burruphs (优利系统), Convex Computer(惠普),意大利霍尼韦尔信息系统(HISI)的(后来的Group Bull),Silicon Graphics公司(后来的硅谷图形),Sequent电脑系统(后来的IBM),通用数据(EMC), Digital (后来的Compaq ,HP)。 这些公司研发的技术后来在类Unix操做系统中大放异彩,并在必定程度上运用到了Windows NT中。服务器
NUMA 的主要优势是伸缩性。NUMA 体系结构在设计上已超越了 SMP 体系结构在伸缩性上的限制。经过 SMP,全部的内存访问都传递到相同的共享内存总线。这种方式很是适用于 CPU 数量相对较少的状况,但不适用于具备几十个甚至几百个 CPU 的状况,由于这些 CPU 会相互竞争对共享内存总线的访问。NUMA 经过限制任何一条内存总线上的 CPU 数量并依靠高速互连来链接各个节点,从而缓解了这些瓶颈情况。架构
二、NUMA的几种架构方案socket
NUMA 系统一般比一致内存访问系统(UMA)更加经济且性能更高。一致内存访问系统必须平等地为全部 CPU 提供内存,而 NUMA 系统则可以为直接链接到 CPU 的内存提供高速互连,同时为与 CPU 相隔较远的内存提供较为便宜但更高延迟的链接。ide
使用 NUMA 时,会常常遇到下面几种方案,以SQL SERVER数据库为例。(参阅technet资料)性能
A. 没有端口到 NUMA 的关联优化
这是具备硬件 NUMA 和单个 SQL Server 实例的计算机中的默认设置。全部通讯流量都经过一个单独的端口输入并采用循环方式分布到任何可用的 NUMA 节点。NUMA 增大了内存和 CPU 访问的区域并增长了 I/O 和惰性编写器线程的数量。在创建链接后会当即将其做用域限定为此节点。它提供了 NUMA 节点间的自动负载平衡。客户端应用程序能够链接到单个端口,并且能够轻松地进行部署。spa
将一个端口关联到多个用于主要应用程序的硬件 NUMA 节点。将第二个端口关联到另外一个用于第二个次要应用程序的硬件 NUMA 节点。用于这两个应用程序的内存和 CPU 资源量很是不平衡,用于主要应用程序的本地内存和 CPU 资源量是用于次要应用程序的三倍。次要应用程序能够是数据库引擎的第二个实例,它在同一数据库引擎实例中,甚至在同一数据库中提供次要的功能。经过向优先使用的链接提供额外资源,它提供了一种线程优先执行的方式。
能够将多个端口映射到同一 NUMA 节点。这样,您就能够为不一样的端口配置不一样的权限。例如,您能够经过控制对相应 TCP 端点的权限来严格限制由某个端口提供的访问。在此示例中,端口 1450 在 Intranet 上广泛可用。端口 1433 则设置为经过防火墙链接到 Internet,并对它的访问进行严格的限制。两个端口均可以充分、平等、安全地利用 NUMA。
三、如何设置,遵循什么原则
那么在虚拟化场景中,如何设置NUMA呢?原则是什么?
例如一台配置了两颗八核处理器以及128GB内存的服务器,咱们须要在其上分配CPU和内存资源并划分虚机。
首先在NUMA架构中,每一个处理器可以控制64GB的物理内存,每一个处理器的八个核心中的每一个核心将对应一个8GB的NUMA节点。这将会如何影响虚拟机性能?因为每一个处理器核心访问NUMA节点内内存的速度要比其余节点快,所以当虚拟机内存大小少于或者等于NUMA节点的内存大小时,虚拟机在理论上可以得到最好的性能。若是给虚拟机分配更多的内存,则虚拟机必然要访问其NUMA节点以外的部份内存,这样或多或少会影响其性能。若是应用可以感知NUMA,那就更好了。vSphere使用vNUMA能够建立可以感知NUMA的虚拟机。该虚拟机将会被分割为虚拟NUMA节点,每一个vNUMA节点将会被放置到一个不一样的物理NUMA节点。尽管虚拟机仍旧在两个NUMA节点之间扩展,但虚拟机内的操做系统和应用可以感知NUMA,资源使用将会获得优化。
NUMA现已经对在数据中心服务器上安装及选择内存的方式带来了不少改变。在给服务器增长物理内存时,咱们须要注意增长的内存要在NUMA节点之间进行平衡及匹配以使主板上的每一个处理器拥有相同的内存。若是在咱们所举例的服务器上配置更多的内存,那么必须在处理器之间平衡这些内存模块。若是增长64GB的内存,那么每一个处理器将分配到32GB的内存(每一个处理器可支配的内存将增长到96GB,服务器总内存数将达到192GB),每一个NUMA节点的内存大小将从8GB增长到12GB。因为每一个Socket控制的内存插槽是不一样的,所以要确保内存插槽是均匀的。例如192G内存分为12个16G的内存条,那么应该4个插在一个Socket的内存插槽中,另8个插在另两个socket的内存插槽中。在为虚机分配vCPU资源时,也尽量按照Socket/Core的倍数分配,好比1X1, 1X2, 1X 4, 1X8, 2X1, 2X2, 2X4, 2X8等组合,但不要使用2X3, 2X5, 2X7这种组合。后面的组合会引发跨Socket的内存调用,从而容易致使性能降低。
结合实践,不一样的业务对内存会有不一样的要求,但最好不要跨NUMA单元去进行调用,尽量的使每一个CPU访问它的直连内存单元。遵循这些简单的原则,就会使性能更好。