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内存。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。