MongoDB 5.0 报错 Illegal instruction 解决
现象
先注明下,我的 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/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 指令集的服务器进行测试。

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.com/post/getting-storage-engines-ready-for-fast-storage-devices
结论
若需要安装或升级到 MongoDB 5.0 新版本,一定要提前确保自己的服务器 CPU 能否支持 AVX 指令集 架构,检查命令如下:
grep avx /proc/cpuinfo
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)