Numa基础

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...

你可能感兴趣的:(linux)