Numa基础

8次阅读

共计 1576 个字符,预计需要花费 4 分钟才能阅读完成。

smp 与 numa

  • smp

smp(symmetrical multi-promcessing) 对称多处理,是指在一个计算机上汇集了一组cpu,各cpu之间共享内存子系统以及总线.

smp 的主要特征是共享,系统中所有的资源都是共享的(cpu,mem,io)
随着cpu数量的增加(通常2-4个),内存访问冲突会增加,导致资源的浪费

  • numa

numa(Non-uniform memory access)非一致内存访问,可以把几十个cpu组合在一个系统内,通过cpu模块进行组织,每个模块有独立的内存以及io槽口.

内存组织基本概念

以numa举例

  • 节点 (Node)
    内存划分为节点(node),每个节点关联到一个cpu,内存中每个 Numa 节点使用一个 pg_data_t 结构体描述其结构;在 Uma 系统中,
  • 内存域(Zone)

各个节点又划分为内存域,通常会有3个,对于可用于 DMA 操作的内存区是有限制的,还有一个高端内存区无法直接映射,在二者之间是通用的普通内存区

  • 待补充

Numa 相关命令实践

numactl

[root@ceph1 ~]# numactl -s
policy: default
preferred node: current
physcpubind: 0 
cpubind: 0 
nodebind: 0 
membind: 0 

策略:

1、每个进程(或线程)都会从父进程继承 NUMA 策略,并分配有一个优先 node。如果 NUMA 策略允许的话,进程可以调用其他 node 上的资源。
2、NUMA 的 CPU 分配策略有 cpunodebind、physcpubind。cpunodebind 规定进程运行在某几个 node 之上,而 physcpubind 可以更加精细地规定运行在哪些核上。
3、NUMA 的内存分配策略有 localalloc、preferred、membind、interleave。

  • default 总是在本地节点上分配
  • bind 指定节点
  • interleave 在所有节点上分配
  • preferred 指定节点,失败时选择其他节点

因为 NUMA 默认的内存分配策略是优先在进程所在 CPU 的本地内存 node 中分配,会导致 CPU 节点之间内存分配不均衡,当某个 CPU 节点的内存不足时,会导致 swap 产生,而不是从远程节点分配内存。这就是所谓的 swap insanity 现象。

numastat

[root@ceph1 ~]# numastat
                           node0
numa_hit                96933059
numa_miss                      0
numa_foreign                   0
interleave_hit             13507
local_node              96933059
other_node                     0

说明:
numa_hit—命中的,也就是为这个节点成功分配本地内存访问的内存大小
numa_miss—把内存访问分配到另一个 node 节点的内存大小,这个值和另一个 node 的 numa_foreign 相对应。
numa_foreign–另一个 Node 访问我的内存大小,与对方 node 的 numa_miss 相对应
local_node—- 这个节点的进程成功在这个节点上分配内存访问的大小
other_node—- 这个节点的进程 在其它节点上分配的内存访问大小

bind

可以制定程序在某一个 cpu 以及 mem node 上运行

#numactl --cpubind=0 --membind=0 ls -lrt

问题

swap

NUMA 的内存分配策略对于进程(或线程)之间来说,并不是公平的。如果使用默认的分配策略,会使资源独占程序很容易将某个 node 的内存用尽。而当某个 node 的内存耗尽时,Linux 又刚好将这个 node 分配给了某个需要消耗大量内存的进程(或线程),swap 就妥妥地产生了。尽管此时还有很多 page cache 可以释放,甚至还有很多的 free 内存。

参考

参考原文:https://blog.csdn.net/wylfeng…

正文完
 0