安裝時報指令錯誤的處理
概述
在使用官網(wǎng)提供的鏡像安裝數(shù)據(jù)庫,有時會遇到一些?"非法指令" "illegal instruction"?的問題,或者在一些本地搭建的虛擬機上,數(shù)據(jù)庫啟動失敗,但是沒有很明確的錯誤信息的問題。這些往往是由于 CPU 指令集不兼容導致的。
常見的有 3 種:
arm CPU 下的 lse 指令
x86_64 CPU 下的 rdtscp 指令
x86_64 CPU 下的 avx 指令
1. arm 服務器下 LSE 指令
官網(wǎng)發(fā)布的?openEuler_arm?包,在編譯的時候,打開了ARM_LSE指令集做了編譯的優(yōu)化。但是對于一些其他 arm 服務器,不一定支持。
構建腳本:
實測在?鯤鵬 920?和?麒麟 990?的 cpu 芯片下是支持安裝的。cpu 可以通過?lscpu?名稱查看。
對于其他不自持該指令的系統(tǒng),需要去掉?-D__ARM_LSE?指令重新編譯即可。
在編譯腳本中?build\script\utils\make_compile.sh,刪除掉所有的?-D__ARM_LSE?, 重新打包數(shù)據(jù)庫。
patch 如下圖:

2. x86 服務器下 rdtscp 指令
rdtscp 指令集用來檢索 CPU 周期計數(shù)器,MOT 特性有用到。
在 server 中位置如下:src\gausskernel\storage\mot\core\infra\synchronization\cycles.h
有些自己搭建的虛擬機可能沒有這個指令集,導致數(shù)據(jù)庫無法啟動。
檢測方式
使用 lscpu 命令進行檢測是否具有該指令集:?lscpu | grep rdtscp
解決方法
如果沒有該指令集,需要開啟 CPU 直通模式 (host-passthrough)
3. x86 服務器下 avx 指令
avx 指令集用來進行加速計算,主要是 db4ai 在使用。該指令集從 2.1.0?版本開始引入,如果存在 2.1.0 之前版本可以運行數(shù)據(jù)庫而 2.1.0 之后數(shù)據(jù)庫啟動失敗,也有可能是沒有該指令導致。
檢測方式
使用 lscpu 命令進行檢測是否具有該指令集:?lscpu | grep avx
解決方法
如果沒有該指令集,從代碼中刪掉該指令集的引用,重新打包數(shù)據(jù)庫。
該指令集的引用在 Makefile 里面,可以全局搜索?-mavx?, 刪掉如下編譯選項里面加載-mavx 指令,然后重新打包構建即可
本文作者:zhang_xubo