闲聊引入
最近想学习mongodb,之前安装overleaf的时候,安装mongodb的容器但无法启动,因为我的N5105不支持AVX,导致虚拟机中无法运行,最后只能使用mongodb 5以下的版本。
后来更换了11600T的U,正常支持了,所以这一次安装一下。安装的教程我会给出来连接,大家照着弄就好了。没什么难的。
问题定位
如何定位是CPU问题
在PVE平台上安装MongoDB 8时,如果遇到启动失败或服务无法运行的问题,通过查看报错日志,多数情况是由于 CPU兼容性问题 所致。
日志如下:
Nov 28 00:13:16 debianSmall systemd[1]: Started mongod.service - MongoDB Database Server.
Nov 28 00:13:16 debianSmall systemd[1]: mongod.service: Main process exited, code=killed, status=4/ILL
Nov 28 00:13:16 debianSmall systemd[1]: mongod.service: Failed with result 'signal'.
一般的报错都是这个样子:status=4/ILL
这个基本就是CPU类型导致的问题。
检查主机CPU是否支持AVX指令集
MongoDB 8需要依赖AVX指令集等现代CPU特性,首先需要确认主机CPU是否支持这些指令集。
通过命令行查询CPU支持的指令集
在主机上运行以下命令,检查CPU是否支持avx
和avx2
:
cat /proc/cpuinfo | grep flags
看是否包含avx
,avx2
之类的字样,如果有的话,就代表支持,那么我们以下的方法都可以用,如果没有,只能像我的N5105一样,使用mongodb 5以下版本即可。
通过CPU官方资料查询支持情况
去CPU官网(如Intel或AMD官方网站)查找CPU型号规格,会查到明确的信息是否支持avx等指令集。
无法安装MongoDB 8的原因
从MongoDB 5开始,对CPU指令集的要求提高,引入了对SSE4.2、AVX、AVX2等现代指令集。因此:
- 如果主机CPU不支持AVX指令集:MongoDB 8及更高版本将无法运行。
- 解决办法:如果CPU无法满足要求,只能退回到MongoDB 5以下的版本(如MongoDB 4.4),这些版本对CPU指令集没有AVX的要求。
解决方案
CPU支持AVX的两种方案
方法1:将在pve中修改虚拟机CPU类型修改为host
通过命令行去修改
这里面的VMID是你的PVE虚拟机的ID,在管理界面都能看得到。
vi /etc/pve/qemu-server/<VMID>.conf
将CPU类型修改为:cpu: host
qm restart <VMID>
管理界面修改
- 选择目标虚拟机,进入Hardware > Processor>修改CPU类型
重启虚拟机
方法2:通过自定义CPU模型实现支持
自定义CPU模型可以选择性地暴露必要的指令集,兼顾兼容性和性能。这个方法我找了好久才找到的,网上常见的解决方案都是上面那一种,改host完事,优点是操作简单,性能更好,不足之处是改host迁移虚拟机的时候,可有会遇到问题,虚拟CPU中kvm64是兼容性最好的,所以还是坚持使用虚拟机来解决。
定义新的CPU模型: 编辑/etc/pve/virtual-guest/cpu-models.conf
文件,添加如下内容:
cpu-model: x86-64-v2-AES-AVX
flags +avx;+avx2;+xsave;+aes;+popcnt;+ssse3;+sse4_1;+sse4_2
phys-bits host
hidden 0
hv-vendor-id proxmox
reported-model kvm64
管理界面修改CPU类型为自定义的x86-64-v2-AES-AVX
- 选择目标虚拟机,进入Hardware > Processor>修改CPU类型
重启虚拟机
正常启动的mongodb日志
sudo systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; preset: enabled)
Active: active (running) since Thu 2024-11-28 00:49:36 PST; 4h 21min ago
Docs: https://docs.mongodb.org/manual
Main PID: 595 (mongod)
Memory: 238.0M
CPU: 1min 2.068s
CGroup: /system.slice/mongod.service
└─595 /usr/bin/mongod --config /etc/mongod.conf
Nov 28 00:49:36 debianSmall systemd[1]: Started mongod.service - MongoDB Database Server.
Nov 28 00:49:37 debianSmall mongod[595]: {"t":{"$date":"2024-11-28T08:49:37.766Z"},"s":"I", "c":"CONTROL", "id":7484500, "ctx":"main","msg":"Environment v>
具体的一些开机启动设置,在参考链接中都有,第2个链接中的安装教程都有详细说明,我这边就不多写了。
总结
针对PVE 8中的虚拟机安装MongoDB 8的通用解决方案:
- CPU不支持AVX指令集:降级到MongoDB 5以下版本,如MongoDB 4.4。
- CPU支持AVX指令集:有两种方法可以解决:
- 修改虚拟机的CPU类型为
host
。 - 通过自定义CPU模型配置,显式启用AVX、AVX2等指令集。
- 修改虚拟机的CPU类型为
这两种方法都可以解决MongoDB 8在虚拟机中运行的CPU兼容性问题,具体选择取决于虚拟化环境和兼容性需求。
参考链接
- CPU with AVX support 这个是找到自定义CPU的pve论坛的帖子
- Install MongoDB Community Edition on Debian 这是在debian12中安装mongodb的指南