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…