问题出现得很突然,日志倒是留得挺全。本地编译好的二进制拷到旧机器上执行,直接报非法指令,同一份文件在新机器上完全正常。

原因不止一个,得分开看。编译时启用了目标机没有的指令集。也可能是镜像在不同代际处理器之间混用。

少数情况下是基础镜像按新架构做过优化。

先看处理器支持的指令集

grep -m1 flags /proc/cpuinfo

再往下确认二进制的编译目标

file /opt/app/bin/app

然后按通用指令集重新编译

gcc -march=x86-64 -O2 -o app app.c

等前面都确认过,再在目标机验证依赖

ldd /opt/app/bin/app && ./app --version

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

别只看报错消失,验证要多做一步。程序在目标机器上正常启动,不再出现非法指令错误。

补一句。跨代际机器部署要么统一编译参数,要么统一镜像来源;按本机优化编出来的包基本不可移植,最稳的做法是在配置最低的机型上构建产物。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189