numa作用,numa技术主要用于实现
作者:[标致小伙]
博客:https://wuyeliang.blog.csdn.net/
一、系统架构的演进从SMP到NUMA
1、SMP(Symmetric Multi-Processor)
所谓对称多处理器结构,就是服务器中的多个CPU对称工作,没有主次关系。所有的CPU共享同一个物理内存,每个CPU访问内存中任意一个地址的时间都是一样的,所以SMP也叫UMA:统一内存访问(UMA)。扩展SMP服务器的方法包括增加内存、使用更快的CPU、增加CPU、扩展I/O(插槽和总线的数量)以及增加更多的外部设备(通常是磁盘存储)。
SMP的主要特点是分享。所有资源(CPU、内存、I/O等。)是共享的。正是因为这个特性,SMP服务器的主要问题是扩展性非常有限。对于SMP服务器来说,每一条共享链路都可能造成SMP服务器扩展的瓶颈,而最受限制的就是内存。由于每个CPU必须通过相同的内存总线访问相同的内存资源,随着CPU数量的增加,内存访问冲突会迅速增加,最终导致CPU资源的浪费,大大降低CPU性能的有效性。
实验数据表明,SMP服务器有2-4个CPU是可以的,多余的浪费了。
2、NUMA(Non-Uniform Memory Access)
由于SMP扩展能力的限制,人们开始探索如何有效地扩展和构建大型系统。NUMA就是这一努力的成果之一。利用NUMA技术,几十个CPU(甚至几百个CPU)可以组合在一个服务器中。NUMA服务器的基本特点是具有多个CPU模块,每个CPU模块由多个CPU(如4个CPU)组成,并具有独立的本地内存、I/O插槽等。因为它的节点可以通过互联的模块(比如纵横制交换机)进行连接和交换信息,所以每个CPU都可以访问整个系统的内存(这是NUMA系统和MPP系统的重要区别)。显然,访问本地内存的速度会比访问远程内存(系统中其他节点的内存)快很多,这也是内存不一致访问NUMA的由来。由于这一特点,在开发应用程序时,为了充分发挥系统性能,需要尽量减少不同CPU模块之间的信息交互。通过使用NUMA技术,可以很好地解决原有SMP系统的扩展问题,一台物理服务器可以支持上百个CPU。NUMA服务器的典型例子有HP Superdome、SUN15K、IBMp690等。
每个CPU模块通过互连模块连接和交换信息,并且CPU是互连的。同时,每个CPU模块平均分为若干个芯片(不超过四个),每个芯片都有自己的内存控制器和内存插槽。
在NUMA也有三个节点的概念:
1)本地节点:对于一个节点中的所有CPU,这个节点称为本地节点。
2)邻居节点:与本地节点相邻的节点称为邻居节点。
3)远程节点:不是本地节点或邻居节点的节点,称为远程节点。
4)、邻居节点和远程节点都称为Off节点。
不同类型节点的CPU访问内存的速度是不同的,访问本地节点的速度最快,访问远程节点的速度最慢,即访问速度与节点的距离有关,距离越远访问速度越慢,称为节点距离。应用程序应该尽量减少不同CPU模块之间的交互。如果应用程序可以固定在一个CPU模块中,应用程序的性能将会大大提高。
二、NUMA实践
1、安装numactl工具
Linux提供了一个手动调整的命令numactl(默认情况下不安装)
# yum install numatl-y # numatl-hardware枚举系统上的numa节点2、查看numa状态。
# numactl-show policy:default preferred node:currentphyscpubind:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 cpubind:0 1 node bind:0 1 membind:0 1 # numastat node 0 node 1 numa _ hit 1296554257 918018444 numa _ miss 81
Numa_hit— hit,即为该节点成功分配的本地内存访问的内存大小。
Numa_miss—分配内存访问的另一个节点的内存大小。这个值对应于另一个节点的numa_foreign。
numa _ foreign——另一个节点访问我的内存大小,这对应于另一个节点的numa_miss。
Local_node -该节点的进程成功地分配了该节点上的内存访问大小。
other _ node——该节点的进程在其他节点上分配的内存访问大小。
显然,miss值和外来值越高,就要考虑绑定问题。
说明:
在redhat6中,有一个numad服务(需要手动安装)。它可以自动监控我们的cpu状态,自动平衡资源。这个服务只有在内存占用非常大的情况下才会有明显的效果。当有大量空闲内存时,需要关闭KSM以避免冲突。官方表示,在一些内存使用量巨大的环境中,性能可能会提高50%。
#服务号码开始3、numad服务
# numactl - hardwareavailable: 2个节点(0-1)节点0 CPU:0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30节点0大小:64337 MB节点0空闲:1263 MB节点1 CPU:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 1节点大小:64509 MB节点1空闲:30530 MB节点距离:节点0 1
1个cpu1可用内存30530 MB
cpu0上请求内存超过1263M就必须使用Swap,这是非常不合理的。
这里,假设我要执行一个java param命令,需要1 GB内存;python param命令,需要8G内存。
最佳优化方案是python在node1执行,java在node0执行。命令是:
# numatl-cpubind=0-membind=0 python param # numatl-cpubind=1-membind=1 Java param4、查看cpu和内存使用情况
1.默认:总是在本地节点上分配(在当前进程运行的节点上分配);
2.bind:强制分配给指定的节点;
3.交错:在所有节点或指定节点上交错分布;
4.首选:分布在指定节点上,如果失败,分布在其他节点上。
因为NUMA默认的内存分配策略是优先考虑进程所在CPU的本地内存,所以会导致CPU节点间的内存分配不均衡。当一个CPU节点内存不足时,会导致交换而不是从远程节点分配内存。这就是所谓的互换精神错乱现象。
5、NUMA的内存分配策略
# numa CTL-hardware node 0 cpu:0 2 4 6 node 0大小:65490 MBnode 0空闲:24447 MB node 1 CPU:1 3 5 7 node 1大小:65536 MBnode 1空闲:16050 MBnode设备:node 0 1 0: 10 20 1: 20 10可以看到有2个numa节点和8个物理CPU节点。
现在我们绑定资源,两个CPU,每个CPU有四个物理节点,所以我们打开四个mysql实例,每个实例绑定两个CPU物理节点。
Numactl-physcpublind=0,3-local alloc mysqld _ multi-defaults-extra-file=/etc/mysqld _ multi . CNF start 1physcpublind指定绑定的cpu节点,
-local alloc表示使用内存模式不交叉,以免降低性能,
Mysqld_multi是mysql实例启动命令。
举例:
三、如何关闭NUMA
BIOS:交错=禁用/启用
方法一:通过bios关闭
1.编辑/etc/default/grub文件,并添加:numa=off。
grub _ cmdline _ Linux= crash kernel=auto numa=off rd . LVM . LV=centos/rootrd . LVM . LV=centos/swaprhgquiet 2,regenerate /etc/grub2.cfg配置文件:
# grub 2-mkconfig-o/etc/grub 2 . CFG 3,重启操作系统
#重启4,确认:
# dmesg grep -i numa[ 0.000000]命令行:BOOT _ IMAGE=/vmlinuz-3。10 .0-327 .el7。x86 _ 64 root=/dev/mapper/centos-root ro崩溃内核=auto numa=off rd。LVM。LV=centos/root rd。LVM。LV=centos/swap rhgb quiet[0.000000]NUMA关闭[0.00000]内核命令行:BOOT _ 1参考:
https://blog.csdn.net/blackmanren/article/details/53490655
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。