MongoDB 5.0 报错Illegal instruction解决

七月的一声炮响,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社区进行查找,发现存在类似报错:

image.png

该案例虽然操作系统为Ubuntu,但是系统错误信息类似,报错原因是因为:MongoDB 5.0版本基本的要求是所在服务器的 CPU 需要支持 AVX指令集
仔细查找官方文档,可以看到安装MongoDB 5.0 版本确实需要依赖支持 AVX 指令集的 CPU:
image.png

目前支持AVX指令集的CPU型号可以参考链接:https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX
检查下我自己服务器的 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 指令集的服务器进行测试。


image.png

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


image.png

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.com/post/getting-storage-engines-ready-for-fast-storage-devices

结论

若需要安装或升级到MongoDB 5.0 新版本,一定要提前确保自己的服务器 CPU 能否支持 AVX指令集 架构,检查命令如下:

grep avx /proc/cpuinfo  

参考文档:

https://www.mongodb.com/community/forums/t/mongodb-5-0-cpu-intel-g4650-compatibility/116610
https://docs.mongodb.com/manual/administration/production-notes/

你可能感兴趣的:(MongoDB 5.0 报错Illegal instruction解决)