安装时报指令错误的处理

2023年 10月 25日 46.0k 0

概述

在使用官网提供的镜像安装数据库,有时会遇到一些 "非法指令" "illegal instruction" 的问题,或者在一些本地搭建的虚拟机上,数据库启动失败,但是没有很明确的错误信息的问题。 这些往往是由于 CPU 指令集不兼容导致的。

常见的有 3 种:

  1. arm CPU 下的 lse 指令
  2. x86_64 CPU 下的 rdtscp 指令
  3. x86_64 CPU 下的 avx 指令

1. arm 服务器下 LSE 指令

官网发布的 openEuler_arm 包,在编译的时候,打开了ARM_LSE指令集做了编译的优化。但是对于一些其他 arm 服务器,不一定支持。

构建脚本:

buildscriptutilsmake_compile.sh

# it may be risk to enable 'ARM_LSE' for all ARM CPU, but we bid our CPUs are not elder than ARMv8.1

实测在 鲲鹏 920 和 麒麟 990 的 cpu 芯片下是支持安装的。 cpu 可以通过 lscpu 名称查看。

对于其他不自持该指令的系统,需要去掉 -D__ARM_LSE 指令重新编译即可。

在编译脚本中 buildscriptutilsmake_compile.sh,删除掉所有的 -D__ARM_LSE , 重新打包数据库。

sh build.sh -m release -3rd /sdb/binarylibs -pkg

# -3rd 是对应三方库二进制的目录

patch 如下图:

2. x86 服务器下 rdtscp 指令

rdtscp 指令集用来检索 CPU 周期计数器,MOT 特性有用到

在 server 中位置如下: srcgausskernelstoragemotcoreinfrasynchronizationcycles.h

/**
* @brief Retrieve the CPU cycle counter using rdtscp instruction
* @detail Force processor barrier and memory barrier
* @return The CPU cycle counter value.
*/
static __inline __attribute__((always_inline)) uint64_t Rdtscp()
{
#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
uint32_t low, high;
__asm__ __volatile__("rdtscp" : "=a"(low), "=d"(high) : : "%rcx");
return (((uint64_t)high

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论