故障分析 | MongoDB 5.0 报错 Illegal instruction 解决

爱可生云数据库 -
故障分析 | MongoDB 5.0 报错 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...

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

mongodb

扩展阅读

加个好友,技术交流

1628738909466805.jpg