漫话NUMA

在DPDK中,使用了NUMA技术,来提高CPU对内存的访问效率.那么什么是NUMA呢,它是如何提高CPU访问内存的效率的呢?

首先,我们先明确几个概念,即,SMP、NUMA、MPP。它们是目前主流的计算机系统架构。

SMP(Symmetric Multi-Processor):对称多处理结构。在这样的系统中,多个 CPU 对称工作,无主次或从属关系。所有的CPU共享全部资源,如总线,内存和I/O系统等,多个CPU之间没有区别,平等地访问内存、外设、一个操作系统。每个 CPU 访问内存中的任何地址所需时间是相同的,因此 SMP 也被称为一致存储器访问结构 (UMA : Uniform Memory Access) 。操作系统管理着一个队列,每个处理器依次处理队列中的进程。如果两个处理器同时请求访问一个资源(例如同一段内存地址),由硬件、软件的锁机制去解决资源争用问题。

SMP 服务器的主要特征是共享,系统中所有资源 (CPU 、内存、 I/O 等 ) 都是共享的。也正是由于这种特征,导致了 SMP 服务器的主要问题,那就是它的扩展能力非常有限。对于 SMP 服务器而言,每一个共享的环节都可能造成 SMP 服务器扩展时的瓶颈,而最受限制的则是内存。由于每个 CPU 必须通过相同的内存总线访问相同的内存资源,因此随着 CPU 数量的增加,内存访问冲突将迅速增加,最终会造成 CPU 资源的浪费,使 CPU 性能的有效性大大降低。实验证明, SMP 服务器 CPU 利用率最好的情况是 2 至 4 个 CPU 。

NUMA(Non-Uniform Memory Access):非一致存储访问结构。NUMA 服务器的基本特征是具有多个 CPU 模块,每个 CPU 模块由多个 CPU( 如 4 个 ) 组成,并且具有独立的本地内存、 I/O 槽口等。由于其节点之间可以通过互联模块 ( 如称为 Crossbar Switch) 进行连接和信息交互,因此每个 CPU 可以访问整个系统的内存 ( 这是 NUMA 系统与 MPP 系统的重要差别 ) 。显然,访问本地内存的速度将远远高于访问远地内存 ( 系统内其它节点的内存 ) 的速度,这也是非一致存储访问 NUMA 的由来。由于这个特点,为了更好地发挥系统性能,开发应用程序时需要尽量减少不同 CPU 模块之间的信息交互。

NUMA 技术同样有一定缺陷,由于访问远地内存的延时远远超过本地内存,因此当 CPU 数量增加时,系统性能无法线性增加。

MPP(Massive Parallel Processing):海量并行处理结构。和 NUMA 不同, MPP 提供了另外一种进行系统扩展的方式,它由多个 SMP 服务器通过一定的节点互联网络进行连接,协同工作,完成相同的任务,从用户的角度来看是一个服务器系统。MPP 的节点互联机制是在不同的 SMP 服务器外部通过 I/O 实现的,每个节点只访问本地内存和存储,节点之间的信息交互与节点本身的处理是并行进行的。其基本特征是由多个 SMP 服务器 ( 每个 SMP 服务器称节点 ) 通过节点互联网络连接而成,每个节点只访问自己的本地资源 ( 内存、存储等 ) ,是一种完全无共享 (Share Nothing) 结构,因而扩展能力最好,理论上其扩展无限制,目前的技术可实现 512 个节点互联,数千个 CPU 。

了解了三种系统架构的不同之后,我们再来了解一下同一物理设备内的NUMA Node、Socket、Core、Logical Processor、超线程技术Hyper-threading这四个名词分别指什么。

超线程技术Hyper-threading:就是在一个CPU Core上集成了两个逻辑处理器单元,即,两个Logical Processor。

一个NUMA node包括一个或者多个Socket,以及与之相连的local memory。一个多核的Socket有多个Core。如果CPU支持HT,OS还会把这个Core看成 2个Logical Processor。如下图:

NUMA Node:

查看当前系统的Numa Node:

1、numactl –hardware命令

[[email protected]_DEFAULT ~]# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3
node 0 size: 8183 MB
node 0 free: 4255 MB
node 1 cpus: 4 5 6 7
node 1 size: 8192 MB
node 1 free: 6139 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10
[[email protected]_DEFAULT ~]#

2、查看系统/sys/devices/system/node/目录下有几个node。

[[email protected]_DEFAULT ~]# ls -tlr /sys/devices/system/node/
total 0
drwxr-xr-x 3 root root    0 2014-11-12 19:03 node1
drwxr-xr-x 3 root root    0 2014-11-12 19:03 node0
-rw-r--r-- 1 root root 4096 2014-11-20 16:27 uevent
-r--r--r-- 1 root root 4096 2014-11-20 16:27 possible
-r--r--r-- 1 root root 4096 2014-11-20 16:27 online
-r--r--r-- 1 root root 4096 2014-11-20 16:27 has_normal_memory
-r--r--r-- 1 root root 4096 2014-11-20 16:27 has_cpu

Socket:

查看当前系统有几个socket:

[[email protected]_DEFAULT ~]# cat /proc/cpuinfo | grep "physical id"
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 1
physical id     : 1
physical id     : 1
physical id     : 1

可以看出,有两个socket,0和1。

Core:

查看当前系统有哪些core:

[[email protected]_DEFAULT ~]# cat /proc/cpuinfo | grep "core id"
core id         : 0
core id         : 1
core id         : 9
core id         : 10
core id         : 0
core id         : 1
core id         : 9
core id         : 10

一个socket有4个core。分别为0、1、9、10.

Logical Processor:

查看当前系统的Logical Processor:

[[email protected]_DEFAULT ~]# cat /proc/cpuinfo | grep "processor"
processor       : 0
processor       : 1
processor       : 2
processor       : 3
processor       : 4
processor       : 5
processor       : 6
processor       : 7
[[email protected]_DEFAULT ~]#

Cache:

ls /sys/devices/system/cpu/cpu0/cache/查看CPU0的cache的详细信息。

[[email protected]_DEFAULT ~]# ls /sys/devices/system/cpu/cpu0/cache/
index0  index1  index2  index3
[[email protected]_DEFAULT ~]#
index0:1级数据cache
index1:1级指令cache
index2:2级cache
index3:3级cache ,对应cpuinfo里的cache

通过查看各个CPU的index3的shared_cpu_map的,可以发现,一个socket上每个core共享L3 Cache。

[[email protected]_DEFAULT ~]# cat /sys/devices/system/cpu/cpu0/cache/index3/shared_cpu_map
00000000,0000000f
[[email protected]_DEFAULT ~]# cat /sys/devices/system/cpu/cpu1/cache/index3/shared_cpu_map
00000000,0000000f
[[email protected]_DEFAULT ~]# cat /sys/devices/system/cpu/cpu2/cache/index3/shared_cpu_map
00000000,0000000f
[[email protected]_DEFAULT ~]# cat /sys/devices/system/cpu/cpu3/cache/index3/shared_cpu_map
00000000,0000000f
[[email protected]_DEFAULT ~]#

通过上面的分析看,在NUMA架构中,使用numactl命令将应用程序绑定在一个Socket上的core上运行,可以提高内存的访问效率。如下:

numactl -m 0 –physcpubind=2,3 ./test
-m 0:在node 0上分配内存
–physcpubind=2,3:在cpu 2和3上运行程序,即一个线程运行在cpu2上,另一个运行在cpu3上。

参考:

http://www.searchtb.com/2012/12/%E7%8E%A9%E8%BD%ACcpu-topology.html

http://www.cnblogs.com/yubo/archive/2010/04/23/1718810.html

http://www.cnblogs.com/yjf512/archive/2012/12/10/2811823.html

时间: 2024-10-13 12:15:21

漫话NUMA的相关文章

漫话Asp.net

经过不到三个星期时间,学习了asp.net的基础教学视频,对asp.net这一块有了一些了解,漫话一下. Asp.net与Web : asp.net属于动态网页技术,属于web应用程序开发. Web应用程序一般是B/S模式. 和B/S模式相对于的还有C/S. 知识扩充: C/S与B/S的联系与区别 首先必须强调的是C/S和B/S并没有本质的区别:B/S是基于特定通信协议(HTTP)的C/S架构,也就是说B/S包含在C/S中,是特殊的C/S架构. 之所以在C/S架构上提出B/S架构,是为了满足瘦客

SMP、NUMA、MPP体系结构介绍

从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 (SMP : Symmetric Multi-Processor) ,非一致存储访问结构 (NUMA : Non-Uniform Memory Access) ,以及海量并行处理结构 (MPP : Massive Parallel Processing) . 从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 (SMP : Symmetric Multi-Processor) ,非一致存储访问结构 (NUMA

【转】CPU优化(4)NUMA架构

转自 http://jimshu.blog.51cto.com/3171847/1266977/ 一.服务器系统架构 从系统架构来看,目前的商用服务器大体可以分为以下三类 1. 即对称多处理器结构(SMP:Symmetric Multi-Processor),, 在SMP架构中,每个CPU对称工作,各CPU共享相同的物理内存,每个 CPU访问内存中的任何地址所需时间是相同的,因此SMP也被称为一致存储器访问结构(UMA:Uniform Memory Access). 对SMP服务器进行扩展的主要

A NUMA API for LINUX(numa架构)

NUMA简介 在传统的对称多处理器(SMP, Symmetric Multiprocessing)系统中,整个计算机中的所有cpu共享一个单独的内存控制器.当所有的cpu同时访问内存时,这个内存控制器常常成为性能瓶颈.同时,这种架构也不能适应使用大量的cpu的场景.于是,为了解决这些问题,越来越多的现代计算机系统采用了CC/NUMA(缓存一致性/非对称访存)架构.例如AMD* Opteron*, IBM* Power5*, HP* Superdome, and SGI* Altix*. 在SMP

【转帖】漫话C++0x(四) —- function, bind和lambda

实在是觉得此文总是去翻感觉不太好.于是果断转过来了,想看原文的请戳:http://www.wuzesheng.com/?p=2032 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解.在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础.下面我们来看看wikipedia上对于计算机领域的closu

NUMA体系结构详解

1. NUMA的几个概念(Node,socket,core,thread) 对于socket,core和thread会有不少文章介绍,这里简单说一下,具体参见下图: 一句话总结:socket就是主板上的CPU插槽; Core就是socket里独立的一组程序执行的硬件单元,比如寄存器,计算单元等; Thread:就是超线程hyperthread的概念,逻辑的执行单元,独立的执行上下文,但是共享core内的寄存器和计算单元. NUMA体系结构中多了Node的概念,这个概念其实是用来解决core的分组

【翻译自mos文章】升级到11.2.0.4之后在alert日志中出现 NUMA 警告信息

注:与本文有关的文章为:http://blog.csdn.net/msdnchina/article/details/43763927 升级到11.2.0.4之后在alert日志中出现 NUMA 警告信息 翻译自mos文章:NUMA warning message appear after upgrade to 11.2.0.4 (文档 ID 1600824.1)1 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.4 and

NUMA的取舍

现在的机器上都是有多个CPU和多个内存块的.以前我们都是将内存块看成是一大块内存,所有CPU到这个共享内存的访问消息是一样的.这就是之前普遍使用的SMP模型.但是随着处理器的增加,共享内存可能会导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加.NUMA(Non-Uniform Memory Access)就是这样的环境下引入的一个模型.比如一台机器是有2个处理器,有4个内存块.我们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUM

漫话Unity3D(一)

前言 使用Unity已经有将近半年时间了,尽管项目还仅仅是个半成品,可是Unity差点儿相同玩熟了.这里把使用过程中碰到的问题梳理一遍.不会涉及到太过详细的功能和代码,可是假设开发一个网游又都会涉及到这些知识点,而这样的直击"本质"的"答案"是非常多教学书籍所不具备的. 一.背景介绍:什么是Unity 2013年手游如火如荼,开发了端游页游之外的第三战场.而随着手游品质的逐渐提高(越来越多的大公司開始介入手游领域,手游不管从画面还是内容都直逼端游),Unity開始为