问题出现得很突然,日志倒是留得挺全。本地编译好的二进制拷到旧机器上执行,直接报非法指令,同一份文件在新机器上完全正常。
原因不止一个,得分开看。编译时启用了目标机没有的指令集。也可能是镜像在不同代际处理器之间混用。
少数情况下是基础镜像按新架构做过优化。
先看处理器支持的指令集
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
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
别只看报错消失,验证要多做一步。程序在目标机器上正常启动,不再出现非法指令错误。
补一句。跨代际机器部署要么统一编译参数,要么统一镜像来源;按本机优化编出来的包基本不可移植,最稳的做法是在配置最低的机型上构建产物。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。