原先这个博客和其他的一些服务放在DMIT的SPro洛杉矶上,使用这一商家的这一产品的原因是其通过Cloudflare来清洗DDOS流量,且采用电信的CN2优化回程路由。这一路由让DMIT成为对中国大陆方向最佳的建站选择。
但是在更换到Azure的CDN以后,考虑到目前DDOS防护已经由Azure解决,源站服务器对大陆的优化也变的可有可无。加上DMIT过于昂贵,所以在购买了一个德国4核Ryzen+3G内存的服务器,成本仅为原先的三成。
在迁移服务器的过程中,有一个项目需要使用MongoDB,于是去mongodb官网找到了他们发布的debian包。我个人比较喜欢安装新版本的软件,看到MongoDB发布6.0+以后便打算安装最新的版本。
但是在安装完成之后,却发现MongoDB服务一直未启动,使用”mongod”指令得到”Illegal instruction”的报错。
问题原因
在前往MongoDB相关论坛查询后得知,从MongoDB 5.0.0版本开始,就需要CPU支持AVX指令集。目前绝大部分CPU都支持这一指令集,使用相关命令查看服务器的指令集列表,发现缺少这一指令集。
root@*:*# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 15
model : 107
model name : QEMU Virtual CPU version 2.5+
stepping : 1
microcode : 0x1000065
cpu MHz : 4241.996
cache size : 512 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm rep_good nopl cpuid extd_apicid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cmp_legacy 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs swapgs_fence amd_e400 spectre_v1 spectre_v2
bogomips : 8483.99
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
问题解决
商家标称CPU使用Ryzen 3000+系列,而咱用的3700X是支持AVX指令集的,所以我推测是他们的虚拟化配置问题导致虚拟机中缺少AVX指令集。
KVM虚拟化的CPU Model是可以自由设置的,如果没有调整为Host模式,那么显示的CPU就会是奇奇怪怪的名字。在这台服务器上,CPU的型号为”QEMU Virtual CPU version 2.5+”。名字倒是无所谓,但是设置不当结果便是虚拟的CPU可能会缺少指令集。
原先使用的Dmit设置的是Host模式,就可以直接看到CPU型号为“AMD EPYC 7443P 24-Core Processor”,指令集也对的上。
root@*:*# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 25
model : 1
model name : AMD EPYC 7443P 24-Core Processor
stepping : 1
microcode : 0x1000065
cpu MHz : 2844.606
cache size : 512 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 16
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero xsaveerptr arat npt nrip_save umip vaes vpclmulqdq rdpid arch_capabilities
bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 5689.21
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
遂发工单给德国人,要求他解决这一问题,并附带上我对这一问题的推测。
在德国人解决问题之前,考虑到现在不需要MongoDB的一些新特性,只好安装旧版MongoDB(4.22),正常运行。
后续
在装完旧版本的MongoDB以后,德国人回复了我的工单,表示已经完成了配置,附上一张新的配置报告。
root@*:*# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 113
model name : AMD Ryzen 7 3700X 8-Core Processor
stepping : 0
microcode : 0x8701021
cpu MHz : 4241.996
cache size : 512 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 16
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw perfctr_core ssbd ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero xsaveerptr wbnoinvd arat npt nrip_save umip rdpid arch_capabilities
bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass
bogomips : 8483.99
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management:
MongoDB高版本无法使用的问题也得以彻底解决。