问题背景: 在开发机上编译ovs,在目标机器上运行,出现来ovs-vswitchd崩溃,dmesg得到如下信息: [ 2807.148361] traps: ovs-vswitchd[10511] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd[55d4eecb2000+721000] [ 2807.401581] traps: [11296] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd[55d4eecb2000+721000] [ 2817.557260] traps: [11324] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd[55d4eecb2000+721000] [ 2822.415470] traps: ovs-vswitchd[11437] trap invalid opcode ip:55aed509cb51 sp:7fffbaf19260 error:0 in ovs-vswitchd[55aed501f000+721000] [ 2827.713594] traps: [11471] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd[55d4eecb2000+721000] [ 2837.869480] traps: [11529] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd[55d4eecb2000+721000] [ 2870.048788] traps: [11587] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd (deleted)[55d4eecb2000+721000] [ 2870.199582] traps: [12442] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd (deleted)[55d4eecb2000+721000] [ 2880.330830] traps: [12459] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd (deleted)[55d4eecb2000+721000] [ 2890.462325] traps: [12484] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd (deleted)[55d4eecb2000+721000] 问题分析: 1,指令错误分析 log的内容是一致的,随便截取一行来看: [ 2807.401581] traps: [11296] trap invalid opcode ip:55d4eed2fb51 sp:7ffe19a29700 error:0 in ovs-vswitchd[55d4eecb2000+721000] 可以看到,是因为执行了invalid opcode导致的。很可能是指令集的原因导致的。 2,定位 根据ip:55d4eed2fb51和map信息ovs-vswitchd[55d4eecb2000+721000],可以推算出来,出错的地址是0x55d4eed2fb51 - 0x55d4eecb2000 = 0x7db51 反汇编,执行命令objdump -D /root/openvswitch-dpdk/openvswitch-2.9.2/vswitchd/ovs-vswitchd > obj,截取0x7db51偏移的代码片段: 000000000007db50 <rte_vfio_enable>: 7db50: 55 push %rbp 7db51: 62 f1 fd 48 6f 15 25 vmovdqa64 0x4ab325(%rip),%zmm2 # 528e80 <__func__.8528+0x950> 7db58: b3 4a 00 7db5b: 48 8d 15 a4 b2 4a 00 lea 0x4ab2a4(%rip),%rdx # 528e06 <__func__.8528+0x8d6> 7db62: 62 f1 fd 48 6f 0d 54 vmovdqa64 0x4ab354(%rip),%zmm1 # 528ec0 <__func__.8528+0x990> 7db69: b3 4a 00 7db6c: 31 f6 xor %esi,%esi 7db6e: 31 c0 xor %eax,%eax 7db70: 62 f1 fd 48 6f 05 86 vmovdqa64 0x4ab386(%rip),%zmm0 # 528f00 <__func__.8528+0x9d0> 7db77: b3 4a 00 7db7a: 48 89 e5 mov %rsp,%rbp 7db7d: 41 52 push %r10 7db7f: 53 push %rbx 7db80: 48 89 fb mov %rdi,%rbx 7db83: bf 07 00 00 00 mov $0x7,%edi 那么,vmovdqa64就是凶手!! 3,定位指令集 查找Intel SDM文档,
可以发现,vmovdqa64指令是AVX512F支持的指令集。 使用lscpu命令,对比编译机和目标机的指令集发现,编译机是v5,开发机是v4。 而avx512f是v5支持的,v4并不支持。
4,结论
一些系统软件比较注重性能,如果可以统一机型的情况下,尽量发挥CPU的特性是一个更好的选择。
如果机型不统一,最好使用版本较低的型号上编译,防止出现高版本的CPU支持的指令。
当然也可以修改编译选项。。。