linux上numa架构介绍

简介: linux上numa架构介绍

准备环境


以下案例基于 Ubuntu 16.04,同样适用于其他的 Linux 系统。我使用的案例环境如下所示:


  • 机器配置:32 CPU,64GB 内存


在NUMA中储存层次的概念:


b9c9d7faacbb9534eaa751443da96f0b.png


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对系统软件可见。


d1210c01aa8308c861f68042982836e7.png


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 7
node 0 size: 16047 MB
node 0 free: 3937 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 16126 MB
node 1 free: 4554 MB
node 2 cpus: 16 17 18 19 20 21 22 23
node 2 size: 16126 MB
node 2 free: 8403 MB
node 3 cpus: 24 25 26 27 28 29 30 31
node 3 size: 16126 MB
node 3 free: 7774 MB
node 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


0d470f450970c7e1030a4ebe23b9416d.png


根据这个图与命令得到的结果,可以看到,此系统共有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           node3
numa_hit             19480355292     11164752760     12401311900     12980472384
numa_miss                5122680       122652623        88449951            7058
numa_foreign           122652643        88449935            7055         5122679
interleave_hit             12619           13942           14010           13924
local_node           19480308881     11164721296     12401264089     12980411641
other_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:~# lscpu
Architecture:          x86_64
CPU(s):                32
Thread(s) per core:    1
Core(s) per socket:    8
Socket(s):             4
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0-7
NUMA node1 CPU(s):     8-15
NUMA node2 CPU(s):     16-23
NUMA node3 CPU(s):     24-31
相关文章
|
5月前
|
Ubuntu Linux
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
1072 3
|
2月前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
2月前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
97 2
|
4月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
117 0
|
5月前
|
负载均衡 网络协议 Linux
在Linux中,常用WEB服务器负载架构有哪些?
在Linux中,常用WEB服务器负载架构有哪些?
|
5月前
|
Linux OLTP 调度
Linux源码阅读笔记04-实时调度类及SMP和NUMA
Linux源码阅读笔记04-实时调度类及SMP和NUMA
|
5月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
168 3
|
5月前
|
编解码 Linux 数据安全/隐私保护
Linux平台x86_64|aarch64架构如何实现轻量级RTSP服务
为满足在Linux平台(x86_64与aarch64架构)上实现轻量级RTSP服务的需求,我们开发了一套解决方案。该方案通过调用`start_rtsp_server()`函数启动RTSP服务,并设置端口号及认证信息。支持AAC音频和H.264视频编码,可推送纯音频、纯视频或音视频流。此外,还支持X11屏幕采集、部分V4L2摄像头采集、帧率/GOP/码率调整、摄像头设备选择与预览等功能。对于音频采集,支持alsa-lib和libpulse接口。整体设计旨在提供150-400ms的低延迟体验,适用于多种应用场景。
|
6月前
|
NoSQL Redis 开发工具
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
|
5月前
|
存储 前端开发 关系型数据库
Linux 技术架构:前端、后端与数据库的完美融合
【8月更文挑战第25天】本文深入剖析了Linux操作系统的技术架构,重点介绍了前端、后端及数据库三大核心组成部分。Linux前端技术不仅涵盖了图形用户界面(GUI),包括GNOME、KDE等桌面环境,还涉及HTML、CSS、JavaScript等Web前端技术及其相关框架。后端技术则聚焦于Python、Java等多种编程语言、Apache和Nginx等Web服务器以及MySQL、PostgreSQL等数据库管理系统。Linux数据库技术覆盖了关系型和非关系型数据库,如MySQL、MongoDB等,并提供了多种数据库管理工具。
134 0