欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

程序员文章站 2022-03-18 16:44:40
1. 需求描述 观察MongoDB的启动Log,会看到一个关于 NUMA 的警告 和 优化建议 那么我们是不是要调整下Linux的系统配置?首先我们先补充下基本知识。 2.相关知识介绍 2.1 NUMA和SMP NUMA和SMP是两种CPU相关的硬件架构。 SMP (对称多处理器结构: Symmet ......

 1. 需求描述

观察mongodb的启动log,会看到一个关于  numa 的警告 和 优化建议

2018-07-17t17:00:04.516+0800 i control  [initandlisten] ** warning: you are running on a numa machine.
2018-07-17t17:00:04.516+0800 i control  [initandlisten] **          we suggest launching mongod like this to avoid performance problems:
2018-07-17t17:00:04.516+0800 i control  [initandlisten] **              numactl --interleave=all mongod [other options]
2019-08-17t17:00:04.516+0800 i control  [initandlisten]

那么我们是不是要调整下linux的系统配置?首先我们先补充下基本知识。

2.相关知识介绍

2.1 numa和smp

numa和smp是两种cpu相关的硬件架构。

smp (对称多处理器结构: symmetric multi-processor) 

在smp架构里面,所有的cpu争用一个总线来访问所有内存,优点是资源共享,而缺点是当处理器的数目增大时,系统总线的竞争冲突加大,系统总线将成为瓶颈。随着pc服务器上的cpu数量变多(不仅仅是cpu核数),总线争用的弊端慢慢越来越明显。

numa ( 非一致存储访问结构: non-uniform memory access)

numa是指多处理器系统中,内存的访问时间是依赖于处理器和内存之间的相对位置的。这种设计里存在和处理器相对近的内存,通常被称作本地内存;还有和处理器相对远的内存,通常被称为非本地内存。numa最大的特点是引入了node和distance的概念。对于cpu和内存这两种最宝贵的硬件资源,numa用近乎严格的方式划分了所属的资源组(node),而每个资源组内的cpu和内存是几乎相等。资源组的数量取决于物理cpu的个数(现有的pc server大多数有两个物理cpu);distance是用来定义各个node之间调用资源的开销,为资源调度优化算法提供数据支持。

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

numa系统的结点通常是由一组cpu(如,sgi altix 3000是2个itanium2 cpu)和本地内存组成,有的结点可能还有i/o子系统。由于每个结点都有自己的本地内存,因此全系统的内存在物理上是分布的,每个结点访问本地内存和访问其它结点的远地内存的延迟是不同的,为了减少非一致性访存对系统的影响,在硬件设计时应尽量降低远地内存访存延迟(如通过cache一致性设计等),而操作系统也必须能感知硬件的拓扑结构,优化系统的访存。

2.2  numa的利与弊

现在的机器上都是有多个cpu和多个内存块的。以前我们都是将内存块看成是一大块内存,所有cpu到这个共享内存的访问消息是一样的,这就是之前普遍使用的smp模型。但是随着处理器的增加,共享内存可能会导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加。numa(non-uniform memory access)就是在这样的背景下引入的一个模型。比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个numa node,这样这个机器就会有两个numa node。在物理分布上,numa node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样numa node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用numa的模式如果能尽量保证本node内的cpu只访问本node内的内存块,提高访问效率。

但是,因为numa默认的内存分配策略是优先在进程所在cpu的本地内存中分配,会导致cpu节点之间内存分配不均衡,当某个cpu节点的内存不足时,会导致swap产生,而不是从远程节点申请内存,即所谓的swap insanity 现象。现有的redhat linux中,localalloc策略是默认的numa内存分配策略(localalloc规定进程从当前node上请求分配内存,此外还有策略 preferred、membind、interleave),这个配置选项导致资源独占程序很容易将某个node的内存用尽。而当某个node的内存耗尽时,linux又刚好将这个node分配给了某个需要消耗大量内存的进程(或线程),swap产生了。尽管此时还有很多page cache可以释放,甚至还有很多的free内存。swap的罪与罚文章就说到了一个numa的陷阱的问题。现象是服务器还有内存的时候,发现它已经在开始使用swap了,甚至导致机器出现停滞的现象。所以,如果限制一个进程只能使用自己的numa节点的内存,那么当它自身numa node内存使用光之后,就不会去使用其他numa node的内存了,会开始使用swap,甚至更糟的情况,机器没有设置swap的时候,可能会直接死机!

2.3 numa 与 swap 的案例说明

例如,我们通过 numactl --hardware 来 查看系统上的numa节点信息,如下:

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

从上面的信息可以 node 0 的 free 内存为312 mb,node 1 的free 内存为15254 mb。

 可知,两个node 节点的 上的剩余内存严重不均衡。

当node 0 上需要申请大于312mb的内存时,就会产生swap。

即,由于服务器硬件、系统设置不当,没有关闭numa,容易导致发生swap。

查看此服务器的内存情况,确实如此。

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

总结; 如果你的程序是会占用大规模内存的,应该考虑选择关闭numa node的限制(或从硬件关闭numa),因为这个时候很有可能会碰到numa陷阱。另外,如果你的程序并不占用大内存,而是要求更快的程序运行时间,可以考虑选择限制只访问本numa node的方法来进行处理。

3.numa 相关操作命令 

1 安装管理工具

yum install numactl -y

2.查看系统的numa节点

numactl --hardware

3.查看绑定信息

numactl  --show

4.查看执行统计信息

numastat 

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

当 numa_miss数值比较高时,说明需要对分配策略进行调整,从而提高内存命中率。

4.centos7.x 关闭 numa

step 1  编辑 /etc/default/grub 文件,在grub_cmdline_linux 行上添加加:numa=off,如下图:

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 2  重新生成 /etc/grub2.cfg 配置文件-----【此操作应慎重

grub2-mkconfig -o /etc/grub2.cfg

step 3 重启操作系统

  reboot

step 4 修改验证

 dmesg | grep -i numa

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

或者 

 cat /proc/cmdline

显示结果,出现了  numa=off 字符

 MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

 

在此设置下,重新mongodb服务,查看log记录,关于numa的警告信息不再出现。

 

5.设置  interleave=all

在上面的操作中,其实我们并没有针对 interleave=all 进行设置。针对这个建议,我们是不是还可以进行一些设置。

继续进行测试,换一台机器。

5.1 测试环境

修改配置前;

mongodb log 的启动记录

2018-07-23t16:50:42.844+0800 i control  [initandlisten] ** warning: you are running on a numa machine.
2018-07-23t16:50:42.844+0800 i control  [initandlisten] **          we suggest launching mongod like this to avoid performance problems:
2018-07-23t16:50:42.844+0800 i control  [initandlisten] **              numactl --interleave=all mongod [other options]

numa的信息;

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

从上面的信息可以看出numa是开启的。

5.2 在bios层设置interleave

下面的操作是在bios层,设置interleave。需通过远程管理卡去调整。

step 1:远程管理开连接指定机器后,点击【宏】--》点击【ctl-alt-del】进行重启  (特别注意:【ctl-alt-del】 针对windows系统是解除本机锁定;linux系统是要重启,要特别小心)

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 2 出现以下界面时,在键盘上请按下f2键,进行system setup 

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 3 启动后,选择【system bios】

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 4 选择 【memory settings】

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 5 针对【node interleaving】选项 由【disabled】调整为【enabled】

调整前

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

调整后

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 6 后退【即上一步点击back】后,点击【finish】,然后点击【yes】

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

 

 step 7 点击 【ok】

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

 step 8 点击finish,点击同意重启

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

step 9 重启ok

MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

 

 5.3 修改效果验证

查看numa信息,数据显示numa已经关闭

 MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

重启mongodb实例,查看log中没有了numa的相关警告。

说明通过上面bios的调整,关闭了numa。

 

参考资料:

1.;

2.;

3.https://blog.csdn.net/s100400507/article/details/45245663;

4.部分资料梳理于网络分享。