Numa基础 smp和 numasmpsmp(symmetricalmulti-processing)对称多处理是指一台计算机上一组cpu的集合,以及各个cpu之间的共享内存子系统和总线。smp的主要特点是共享。系统中的所有资源都是共享的(cpu、mem、io)。随着cpu数量的增加(一般为2-4个),内存访问冲突会增加,造成资源浪费cpu模块,每个模块都有独立的内存和io槽。内存组织的基本概念以numa为例节点(Node) 内存被划分为节点(node),每个节点关联一个cpu,内存中的每个Numa节点使用一个pg_data_t结构来描述其结构;在Uma系统中,内存域(Zone) 每个节点都划分了内存域,通常有3个,对可用于DMA操作的内存区域有限制,有高端内存区域不能直接映射的,两者之间是一般的公共内存区,需要补充。Numa相关命令实践numactl[root@ceph1~]#numactl-spolicy:defaultpreferrednode:currentphyscpubind:0cpubind:0nodebind:0membind:0Policy:1.每个进程(或线程)都继承父进程的NUMA策略进程并被分配一个优先级节点。如果NUMA策略允许,进程可以调用其他节点上的资源。2、NUMA的CPU分配策略包括cpunodebind和physcpubind。cpunodebind规定进程运行在某些节点上,而physcpubind可以更精细地指定它运行在哪些核上。3、NUMA的内存分配策略有localalloc、preferred、membind、interleave。default 总是在本地节点上分配bind 指定节点interleave 在所有节点上分配preferred 指定节点,失败时选择其他节点,因为NUMA默认的内存分配策略是优先where进程位于CPU本地内存节点的Allocation会导致CPU节点间内存分配不均衡。当某个CPU节点内存不足时,会产生swap,而不是从远程节点分配内存。这就是所谓的swapinsanity现象。numastat[root@ceph1~]#numastatnode0numa_hit96933059numa_miss0numa_foreign0interleave_hit13507local_node96933059other_node0解释:numa_hit——hit,即为本节点成功分配本地内存访问的内存大小numa_miss——将内存访问分配到另一个node节点的内存大小,这个值对应另一个节点的numa_foreign。numa_foreign–anotherNodeaccessmymemorysize,对应其他节点的numa_misslocal_node–本节点进程成功分配本节点内存访问大小allocatedmemoryaccesssizebind可以使程序运行在某个节点上cpu和mem节点#numactl--cpubind=0--membind=0ls-lrt问题swapNUMA的内存分配策略是在进程(或线程)之间。这不公平。如果使用默认分配策略,资源独占程序很容易耗尽节点内存。而当一个节点的内存耗尽时,Linux只是将这个节点分配给一个消耗大量内存的进程(或线程),并适当地产生swap。这时候虽然还有很多pagecache可以释放,甚至还有很多空闲内存。参考参考原文:https://blog.csdn.net/wylfeng...
