您好,欢迎访问一九零五行业门户网

一起聊聊linux上numa架构(图文详解)

本篇文章给大家带来啦linux中numa架构介绍的相关知识,希望对大家有帮助。
以下案例基于 ubuntu 16.04,同样适用于其他的 linux 系统。我使用的案例环境如下所示:
机器配置:32 cpu,64gb 内存
在numa中储存层次的概念:
1)处理器层:单个物理核,称为处理器层。2)本地节点层:对于某个节点中的所有处理器,此节点称为本地节点。3)home节点层:与本地节点相邻的节点称为home节点。4)远程节点层:非本地节点或邻居节点的节点,称为远程节点。cpu访问不同类型节点内存的速度是不相同的,访问本地节点的速度最快,访问远端节点的速度最慢,即访问速度与节点的距离有关,距离越远访问速度越慢,此距离称作node distance。应用程序要尽量的减少不同cpu模块之间的交互,如果应用程序能有方法固定在一个cpu模块里,那么应用的性能将会有很大的提升。
**以鲲鹏920处理器讲一下cpu芯片的的构成:**鲲鹏920处理器片上系统的每个超级内核集群包含6个内核集群、2个i/o集群和4个ddr控制器。每个超级内核集群封装成一个cpu晶片。每个晶片上集成了4个72位(64位数据加8位ecc)、数据传输率最高为3200mt/s的高速ddr4通道,单晶片可支持最多512gb×4的ddr存储空间。l3 cache在物理上被分为两部分:l3 cache tag和l3 cache data。l3 cache tag集成在每个内核集群中,以降低监听延迟。l3 cache data则直接连接片上总线。hydra根代理(hydra home agent,hha)是处理多芯片系统cache一致性协议的模块。poe_icl是系统配置的硬件加速器,一般可以用作分组顺序整理器、消息队列、消息分发或者实现某个处理器内核的特定任务等。此外,每个超级内核集群在物理上还配置了一个通用中断控制器分发器(gicd)模块,兼容arm的gicv4规范。当单芯片或多芯片系统中有多个超级内核集群时,只有一个gicd对系统软件可见。
numactl的使用linux提供了一个一个手工调优的命令numactl(默认不安装),在ubuntu上的安装命令如下:
sudo apt install numactl -y
首先你可以通过man numactl或者numactl --h了解参数的作用与输出的内容。查看系统的numa状态:
numactl --hardware
运行得到如下的结果:
available: 4 nodes (0-3)node 0 cpus: 0 1 2 3 4 5 6 7node 0 size: 16047 mbnode 0 free: 3937 mbnode 1 cpus: 8 9 10 11 12 13 14 15node 1 size: 16126 mbnode 1 free: 4554 mbnode 2 cpus: 16 17 18 19 20 21 22 23node 2 size: 16126 mbnode 2 free: 8403 mbnode 3 cpus: 24 25 26 27 28 29 30 31node 3 size: 16126 mbnode 3 free: 7774 mbnode distances:node 0 1 2 3 0: 10 20 20 20 1: 20 10 20 20 2: 20 20 10 20 3: 20 20 20 10
根据这个图与命令得到的结果,可以看到,此系统共有4个node,各领取8个cpu和16g内存。 这里还需要注意的就是cpu共享的l3 cache也是会自己领取相应的空间。通过numastat命令可以查看numa状态,返回值内容:
numa_hit:是打算在该节点上分配内存,最后从这个节点分配的次数;
numa_miss:是打算在该节点分配内存,最后却从其他节点分配的次数;
numa_foreign:是打算在其他节点分配内存,最后却从这个节点分配的次数;
interleave_hit :采用interleave策略最后从本节点分配的次数
local_node:该节点上的进程在该节点上分配的次数
other_node:是其他节点进程在该节点上分配的次数
注:如果发现 numa_miss 数值比较高时,说明需要对分配策略进行调整。例如将指定进程关联绑定到指定的cpu上,从而提高内存命中率。
root@ubuntu:~# numastat node0 node1 node2 node3numa_hit 19480355292 11164752760 12401311900 12980472384numa_miss 5122680 122652623 88449951 7058numa_foreign 122652643 88449935 7055 5122679interleave_hit 12619 13942 14010 13924local_node 19480308881 11164721296 12401264089 12980411641other_node 5169091 122684087 88497762 67801
numa的内存分配策略--localalloc或者-l:规定进程从本地节点上请求分配内存。--membind=nodes或者-m nodes:规定进程只能从指定的nodes上请求分配内存。--preferred=node:指定一个推荐的node来获取内存,如果获取失败,则尝试别的node。--interleave=nodes或者-i nodes:规定进程从指定的nodes上,以round robin算法交织地请求内存分配。
numactl --interleave=all mongod -f /etc/mongod.conf
因为numa默认的内存分配策略是优先在进程所在cpu的本地内存中分配,会导致cpu节点之间内存分配不均衡,当开启了swap,某个cpu节点的内存不足时,会导致swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。或导致性能急剧下降。所以在运维层面,我们也需要关注numa架构下的内存使用情况(多个内存节点使用可能不均衡),并合理配置系统参数(内存回收策略/swap使用倾向),尽量去避免使用到swap。
node->socket->core->processor
随着多核技术的发展,将多个cpu封装在一起,这个封装被称为插槽socket;core是socket上独立的硬件单元;通过intel的超线程ht技术进一步提升cpu的处理能力,os看到的逻辑上的核processor数量。
socket = node
socket是物理概念,指的是主板上cpu插槽;node是逻辑概念,对应于socket。
core = 物理cpu
core是物理概念,一个独立的硬件执行单元,对应于物理cpu;
thread = 逻辑cpu = processor
thread是逻辑cpu,也就是processo
lscpu的使用
显示格式:
architecture:架构
cpu(s):逻辑cpu颗数
thread(s) per core:每个核心线程,也就是指超线程
core(s) per socket:每个cpu插槽核数/每颗物理cpu核数
cpu socket(s):cpu插槽数
l1d cache:级缓存(google了下,这具体表示表示cpu的l1数据缓存)
l1i cache:一级缓存(具体为l1指令缓存)
l2 cache:二级缓存
l3 cache:三级缓存
numa node0 cpu(s) :cpu上的逻辑核,也就是超线程
执行lscpu,结果部分如下:
root@ubuntu:~# lscpuarchitecture: x86_64cpu(s): 32thread(s) per core: 1core(s) per socket: 8socket(s): 4l1d cache: 32kl1i cache: 32kl2 cache: 256kl3 cache: 20480knuma node0 cpu(s): 0-7numa node1 cpu(s): 8-15numa node2 cpu(s): 16-23numa node3 cpu(s): 24-31
相关推荐:《linux视频教程》
以上就是一起聊聊linux上numa架构(图文详解)的详细内容。
其它类似信息

推荐信息