乐趣区

关于mongodb:故障分析-MongoDB-50-报错-Illegal-instruction-解决

作者:任仲禹

爱可生 DBA 团队成员,善于故障剖析和性能优化,文章相干技术问题,欢送大家一起探讨。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


去年七月的一声炮响,MongoDB Inc 给咱们送来了 MongoDB 5.0,该版不仅带来了外围个性—时序汇合,但若应用不慎还会给咱们埋些小小的“坑”;如果您的环境正筹备装置、试用或降级到 MongoDB 5.0,那无妨留步探讨下。

景象

先注明下,我的 Linux 版本为 CentOS Linux release 7.2.1511。

装置完最新的 mongodb-5.0.x 后,执行 mongo 或 mongod 间接报错 Illegal instruction

[root@10-186-61-38 mongodb]# cd mongodb-linux-x86_64-rhel70-5.0.5/bin/
[root@10-186-61-38 bin]# ./mongo --help
Illegal instruction
[root@10-186-61-38 bin]# ./mongod --help
Illegal instruction

满脸纳闷,应用低版本 MongoDB 4.4.9 是没有任何问题的。

[root@10-186-61-38 mongodb]# cd mongodb-linux-x86_64-rhel70-4.4.9/bin/
[root@10-186-61-38 bin]# ./mongo --help
MongoDB shell version v4.4.9
usage: ./mongo [options] [db address] [file names (ending in .js)]

排查

执行 mongo 或 mongod 命令获取到 2 行 demsg 日志报错:

[root@10-186-61-38 bin]# dmesg -T
······
[Thu Dec 23 18:05:13 2021] traps: mongo[16596] trap invalid opcode ip:7f0ad9fa90da sp:7ffe9deaa050 error:0 in mongo[7f0ad7f86000+2c8c000]
[Thu Dec 23 18:05:17 2021] traps: mongod[16597] trap invalid opcode ip:7f3b1e329a6a sp:7ffc8fb540e0 error:0 in mongod[7f3b1a355000+5110000]

能够看到,命令执行失败是因为 invalid opcode 导致,貌似是跟操作系统的某种指令集无关。

带着纳闷和关键字在 MongoDB 社区进行查找,发现存在相似报错:

该案例尽管操作系统为 Ubuntu,然而零碎错误信息相似,报错起因是因为:MongoDB 5.0 版本根本的要求是所在服务器的 CPU 须要反对 AVX 指令集。

认真查找官网文档,能够看到装置 MongoDB 5.0 版本的确须要依赖反对 AVX 指令集的 CPU:

目前反对 AVX 指令集的 CPU 型号能够参考链接:

https://en.wikipedia.org/wiki…

查看下我本人服务器的 CPU , 的确不反对 AVX(留神:若反对 AVX 指令集,flags 字段会有打印 ‘avx’ 字符串):

[root@10-186-61-38 ~]# cat /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 13
model name  : QEMU Virtual CPU version 2.5+
······
flags       : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm rep_good nopl xtopology eagerfpu pni cx16 x2apic hypervisor lahf_lm
······

反对 AVX 的 CPU 测试

找台 CPU 反对 AVX 指令集的服务器进行测试。

MongoDB 5.0 新版本命令失常执行。

AVX 指令集

AVX(Advanced Vector Extensions,高级向量扩大指令集)是 x86 架构微处理器中的指令集

  • 由英特尔在 2008 年 3 月提出,并在 2011 年第一季度公布的 Sandy Bridge 系列处理器中首次反对。AMD 在随后的 2011 年第三季度公布的 Bulldozer 系列处理器中开始反对 AVX。所以较老的 CPU 架构中可能并不反对 AVX 指令集。AVX 是 X86 指令集的 SSE 延长架构,如 IA16 至 IA32 般的把寄存器 XMM 128bit 晋升至 YMM 256bit,所以从实践上看 CPU 的运算性能将晋升 2 倍。

目前 MongoDB 官网文档中仅阐明装置 MongoDB 5.0 须要依赖服务器 CPU 反对 AVX 指令集,但并未阐明具体须要反对的起因;

网上仅检索到一篇关 于 MongoDB with AVX 的文章《Getting storage engines ready for fast storage devices》提到:能够应用通过高度优化基于 AVX 的 memcpy 形式,实现数据从内存映射区域拷贝到另一块利用的缓冲区;猜想目前 5.0 版本的公布蕴含了文章提到的 WiredTiger 存储引擎层面的更新(文章提到更新引擎后的读吞吐量晋升了 63%),而底层存储引擎的优化更新依赖于 avx 的反对。

https://engineering.mongodb.c…

论断

若须要装置或降级到 MongoDB 5.0 新版本,肯定要提前确保本人的服务器 CPU 是否反对 AVX 指令集 架构,查看命令如下:

grep avx /proc/cpuinfo

参考文档:

https://www.mongodb.com/commu…

https://docs.mongodb.com/manu…

退出移动版