NUMA起源百度一搜一大把,就不写了,写几条笔记给自己备忘。
为什么要关注NUMA
原因就是由于在某个Node上运行的程序要访问的内存在另外一个Node(一个有内存控制器的单核或者多核CPU组合体,对intel AMD来说,一般一个物理socket就是一个Node)的内存控制器管理之下,会造成内存读写延时加大(非本地Node读写还要通过CPU之间的串行互联来传输,amd的HT,intel的QPI),而且如果遇上另外一个Node如果也有程序在读写这块内存,还存在争用情况,造成等待,还有就是两个Node还有缓存一致性也需要处理。
由于存在这种情况,会让性能敏感型的应用程序响应时间变慢导致性能问题。
如何配置NUMA
硬件和操作系统有不同的地方对NUMA做调整。
硬件
在有多个Node服务器的BIOS里面,可能会存在 Memory Options > Node Interleaving.这样的选项,或者内存交错选项供开启或者关闭。
开启 内存地址交错分布在机器上所有Node安装的内存上,但实际程序性能可能会受影响,因为实际物理上读写的时候,会出现程序在Node A上运行,但内存分布在Node A ,Node B两个Node所在的内存控制器下。
禁用 默认状态,每个Node 各管各的内存。实际性能根据程序和程序所在的内存分布情况而定。
操作系统
操作系统可以在启动的时候给内核加参数numa=off关闭numa,这样系统下看到的就是一个Node,反正让程序是看起来是一个Node,分配内存的时候到底分配到那一块,会不会导致程序性能有问题,这还不太清楚,有待继续学习看内核如何处理的。反正系统下就没法用numactl来让程序绑定Node了。
这在vmware的blog上有人做了些测试,我没细看,但针对的负载主要是oracle数据库,但百度搜索,oracle确实也有关于开启了numa出现bug的情况,所以好多情况下应该都是一关了之,但实际我觉得还是得根据版本和实际测试情况来看,我想其他数据库原理上也应该相同 ,但文章反复提及,不管开不开,都建议在测试环境做好充分测试。
但实际上,比较科学的办法就是让程序和程序使用的内存都在一个Node上才是最优解。
这可以用numactl来做node绑定,taskset只能绑CPU,没法绑内存。
numactl --cpunodebind 0 --membind 0 xxxx 这样的格式来指定程序xxx的CPU和内存节点,
注:实际未测试过,等有机会部署大内存程序测试。
查看numa的状态可以用numastat ,当然也可以加-p 参数查看某个进程的numa内存分配情况。
当然,程序也可以使用libnuma库来实现程序自己的numa感知和调度。
还可以通过numad在后台周期性观察业务程序情况,从而动态调整numa分配,提高性能,当然,这个只是程序判断,具体业务还是人判断比较好。
https://indico.cern.ch/event/304944/contributions/1672535/attachments/578723/796898/numa.pdfhttps://indico.cern.ch/event/304944/contributions/1672535/attachments/578723/796898/numa.pdf这个PDF是老外自己做的测试和结果分析,从他的结果分析来看,要么用绑定能测出好成绩,要么用named能优化出好成绩,但默认肯定不是最优的。下面嫖几张结果图吧。
其他:
在Libvirt里配置虚拟机的NUMA拓扑,可以直接在xml编辑里面添加拓扑
<cpu>
<numa>
<cell cpus='0-3' memory='512000'/>
<cell cpus='4-7' memory='512000'/>
</numa>
</cpu>
参考的红帽官网虚拟化调试和优化指南手册。
另外记录一点内存使用的备忘
参考以下两个链接:
NUMA导致的MySQL服务器SWAP问题分析与解决方案-百度网盘下载-Java自学者论坛 - Powered by Discuz!【SWAP产生原理】 先从swap产生的原理来分析,由于linux内存管理比较复杂,下面以问答的方式列了一些重要的点,方便大家理解: 1、swap是如何产生的 swap指的是一 ...https://www.javazxz.com/thread-7173-1-1.html分享Linux内存占用几个案例 - 知乎案例一问题最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白。分析1、linux系统内存消耗主要有三个地方: 进程slabpagecacge用 free 命令…
https://zhuanlan.zhihu.com/p/521290111第一个分析了由于NUMA节点内存使用不均衡,导致其中给一个节点不活动的内存太多,内存不够就被换出去了的情况。
第二个分析了top ps 的used是没包括slab内存的情况(大量文件同步导致大量的inode这种小内存申请从slab里面取,但偏偏top ps没统计slab的使用量,这也不能怪top ps,毕竟对他们来说,他们是进程视角,free是系统视角)。
内存水位:
high 低于low时候,进行swap页面交换后,物理内存回收,达到high,停止回收。
low 低于low时候,进行swap页面交换后,物理内存回收,
min 空闲内存低于这个值(单位kB),发生内存直接回收,严重的时候就OOM(oom分高的进程可能就被回收挂了)了。
内存分zone,一般系统有DMA ,DMA32 ,NORMAL,可以通过/proc/zoneinfo 查看每个zone的内存页面信息。
Linux内存管理太复杂了,常见的都能百度到,但谁要能把系统里面的物理内存系统是怎么使用的以及内存都分布到哪儿去了说清楚了,那绝对是大师级的高手了。(自己经常连所有内存加起来都没法和物理内存给对应上,尤其是好多保留的那种。)
[ 0.000000] Memory: 8011812K/8323072K available (11772K kernel code, 1282K rwdata, 6524K rodata, 4096K init, 947K bss, 311260K reserved, 0K cma-reserved)
reserved内存随着计算机内安装的物理内存越多,增长越多,有人有512G内存,这个reserved内存居然达到9G左右。不知道这个如何理解,搜遍google也没人说清楚,实在不行可能只有看内核源码了吧,但这工作量太大了,对基础知识也有一定要求,后面有机会再慢慢学习吧。