MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)
1. 需求描述
观察MongoDB的启动Log,会看到一个关于 NUMA 的警告 和 优化建议
--17T17::04.516+ I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine.
--17T17::04.516+ I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
--17T17::04.516+ I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options]
--17T17::04.516+ 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之间调用资源的开销,为资源调度优化算法提供数据支持。
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节点信息,如下:
从上面的信息可以 node 0 的 free 内存为312 MB,node 1 的free 内存为15254 MB。
可知,两个Node 节点的 上的剩余内存严重不均衡。
当Node 0 上需要申请大于312MB的内存时,就会产生SWAP。
即,由于服务器硬件、系统设置不当,没有关闭NUMA,容易导致发生SWAP。
查看此服务器的内存情况,确实如此。
总结; 如果你的程序是会占用大规模内存的,应该考虑选择关闭numa node的限制(或从硬件关闭numa),因为这个时候很有可能会碰到numa陷阱。另外,如果你的程序并不占用大内存,而是要求更快的程序运行时间,可以考虑选择限制只访问本numa node的方法来进行处理。
3.numa 相关操作命令
1 安装管理工具
yum install numactl -y
2.查看系统的NUMA节点
numactl --hardware
3.查看绑定信息
numactl --show
4.查看执行统计信息
numastat
当 numa_miss数值比较高时,说明需要对分配策略进行调整,从而提高内存命中率。
4.CentOS7.x 关闭 NUMA
Step 1 编辑 /etc/default/grub 文件,在GRUB_CMDLINE_LINUX 行上添加加:numa=off,如下图:
Step 2 重新生成 /etc/grub2.cfg 配置文件-----【此操作应慎重】
grub2-mkconfig -o /etc/grub2.cfg
Step 3 重启操作系统
reboot
Step 4 修改验证
dmesg | grep -i numa
或者
cat /proc/cmdline
显示结果,出现了 numa=off 字符
在此设置下,重新MongoDB服务,查看log记录,关于NUMA的警告信息不再出现。
5.设置 interleave=all
在上面的操作中,其实我们并没有针对 interleave=all 进行设置。针对这个建议,我们是不是还可以进行一些设置。
继续进行测试,换一台机器。
5.1 测试环境
修改配置前;
MongoDB log 的启动记录
--23T16::42.844+ I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine.
--23T16::42.844+ I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
--23T16::42.844+ I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options]
NUMA的信息;
从上面的信息可以看出NUMA是开启的。
5.2 在BIOS层设置interleave
下面的操作是在BIOS层,设置interleave。需通过远程管理卡去调整。
Step 1:远程管理开连接指定机器后,点击【宏】--》点击【Ctl-Alt-Del】进行重启 (特别注意:【Ctl-Alt-Del】 针对Windows系统是解除本机锁定;Linux系统是要重启,要特别小心)
Step 2 出现以下界面时,在键盘上请按下F2键,进行System Setup
Step 3 启动后,选择【System Bios】
Step 4 选择 【Memory Settings】
Step 5 针对【Node Interleaving】选项 由【Disabled】调整为【Enabled】
调整前
调整后
Step 6 后退【即上一步点击Back】后,点击【Finish】,然后点击【Yes】
Step 7 点击 【OK】
Step 8 点击Finish,点击同意重启
Step 9 重启OK
5.3 修改效果验证
查看NUMA信息,数据显示NUMA已经关闭
重启MongoDB实例,查看Log中没有了NUMA的相关警告。
说明通过上面BIOS的调整,关闭了NUMA。
参考资料:
1.https://www.thegeekdiary.com/how-to-disable-numa-in-centos-rhel-67/;
2.https://www.jianshu.com/p/e36c54b4b53e;
3.https://blog.csdn.net/S100400507/article/details/45245663;
4.部分资料梳理于网络分享。
MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)的更多相关文章
- MongoDB启动时遇到的问题
问题一:child process failed, exited with error number 100 原因分析:100是锁了 解决办法:#cd /usr/local/mongodb/data ...
- Mongodb 启动时 lock文件访问没有权限处理
mongodb 第二次启动时候异常信息: lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance ...
- 项目启动时警告 Establishing SSL connection without server's identity verification is not recommended
项目启动时控制台提示警告: Tue May 14 23:16:10 CST 2019 WARN: Establishing SSL connection without server's identi ...
- mongoDB启动前的系统设置,解决部分Warning问题
1.多核心系统资源分配问题 2017-10-13T17:57:02.650+0800 I CONTROL [initandlisten] ** WARNING: You are running on ...
- 【mongodb系统学习之五】mongodb启动最常用参数
五.mongodb启动时其他常用参数的使用(都是选用): 1).--logappend,指定日志的写入方式为追加,强烈建议使用: 2).--port,指定mongodb的端口号,当不使用这个参数的时候 ...
- ElasticSearch 启动时加载 Analyzer 源码分析
ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档 ...
- Redis 3.0版本启动时出现警告的解决办法
原文:http://m.blog.csdn.net/article/details?id=50864933 Redis 3.0.7版本启动时出现警告的解决办法 发表于2016/3/12 12:52:4 ...
- Spring Boot 2 实践记录之 MyBatis 集成的启动时警告信息问题
按笔者 Spring Boot 2 实践记录之 MySQL + MyBatis 配置 中的方式,如果想正确运行,需要在 Mapper 类上添加 @Mapper 注解. 但是加入此注解之后,启动时会出现 ...
- mongoDB启动参数备忘
本文转载 Mongodb启动命令mongod参数说明 mongod的主要参数有: 基本配置 ----------------------------------------------- ...
随机推荐
- 漏洞告诉你:商家为什么都乐于提供免(diao)费(yu)WiFi?
作为一名小微商户,每天我除了要为经营小店忙得焦头烂额,还要想方设法地寻求提升用户体验.于是,我用了号称“营销神器”的某商用WiFi系统...... 然后不可思议的事情发生了:连上此WiFi的手机(包括 ...
- 【Qt】一劳永逸解决UAC问题(修改mkspecs\win32-msvc2012\qmake.conf)
如果你的程序跑在一个开启了UAC保护的系统中,而你的程序又没有"盾牌"的话,程序总是会受到各种阻挠的,比如读写文件,写注册表等. 有了"盾牌"的话就不会出现一些 ...
- c# 停靠窗体
public partial class FrmAnchor : Form, IMessageFilter { public FrmAnchor(Control parentControlc, Con ...
- JavaScript语言核心--词法结构
编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序.作为语法的基础,它规定了诸如变量名是什么样的.怎么写注释,以及程序语言之间如何分隔等规则. 1. 字符集 JavaScript程 ...
- 将后台窗口激活到前台的方法(使用AttachThreadInput和SetForegroundWindow两个API)
下面这种方法是我见到的最理想的,还有一些其他的方法,像通过SetWindowsPos这个API设置窗口的Z-oder到最顶层,再设置回去.还有通过把当前窗口设置到底层,然后激活目标窗口等等方法. HW ...
- Qt中实现单例模式(SingleTon),大约有3种办法
Qt中实现单例模式(SingleTon) 单例模式分为“饥汉”和“饿汉”两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂.由于单例模式很常用,Boost库中有强大的泛型单例实现,我也利用Qt ...
- Yolov3代码分析与训练自己数据集
现在要针对我们需求引入检测模型,只检测人物,然后是图像能侧立,这样人物在里面占比更多,也更清晰,也不需要检测人占比小的情况,如下是针对这个需求,用的yolov3-tiny模型训练后的效果. Yolov ...
- URL收集
window下 php5.5 安装pthread扩展:http://blog.csdn.net/aoyoo111/article/details/19020161
- ES6 新增声明变量的 var let const 的区别详解
var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...
- 【python3两小时快速入门】入门笔记03:简单爬虫+多线程爬虫
作用,之间将目标网页保存金本地 1.爬虫代码修改自网络,目前运行平稳,博主需要的是精准爬取,数据量并不大,暂未加多线程. 2.分割策略是通过查询条件进行分类,循环启动多条线程. 1.单线程简单爬虫(第 ...