這篇文章帶給大家啦linux中numa架構介紹的相關知識,希望對大家有幫助。
以下案例是基於 Ubuntu 16.04,同樣適用於其他的 Linux 系統。我使用的案例環境如下:
機器配置:32 CPU,64GB 記憶體
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############根據這個圖與指令得到的結果,可以看到,此系統共有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
相关推荐:《Linux视频教程》
以上是一起聊聊linux上numa架構(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!