---
title: 安装时报指令错误的处理-官方技术文章-鲲鹏社区
description: 本文主要介绍在使用官网提供的镜像安装数据库遇到的常见问题（ 如"非法指令" "illegal instruction" 的问题或者在一些本地搭建的虚拟机上数据库启动失败）的处理方法。
keywords: 安装时报指令,错误的处理,官方技术文章,鲲鹏社区,概述,服务器下,LSE,指令
url: https://www.hikunpeng.com/developer/techArticles/20230905-7?envFlag=1
section: (其他)
---

# 安装时报指令错误的处理-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230905-7?envFlag=1
描述: 本文主要介绍在使用官网提供的镜像安装数据库遇到的常见问题（ 如"非法指令" "illegal instruction" 的问题或者在一些本地搭建的虚拟机上数据库启动失败）的处理方法。
关键词: 安装时报指令,错误的处理,官方技术文章,鲲鹏社区,概述,服务器下,LSE,指令

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

安装时报指令错误的处理

安装时报指令错误的处理

实战经验

发表于 2023/07/24

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 服务器，不一定支持。

构建脚本：

```
1  build\script\utils\make_compile.sh
2  # 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 指令重新编译即可。

在编译脚本中 build\script\utils\make_compile.sh，删除掉所有的 -D__ARM_LSE ， 重新打包数据库。

```
1  sh build.sh -m release -3rd /sdb/binarylibs -pkg
2  # -3rd 是对应三方库二进制的目录
```

patch 如下图：

### 2. x86 服务器下 rdtscp 指令

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

在 server 中位置如下：src\gausskernel\storage\mot\core\infra\synchronization\cycles.h

```
1  /**
2       * @brief Retrieve the CPU cycle counter using rdtscp instruction
3       * @detail Force processor barrier and memory barrier
4       * @return The CPU cycle counter value.
5       */
6      static __inline __attribute__((always_inline)) uint64_t Rdtscp()
7  {
8  #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
9          uint32_t low, high;
10          __asm__ __volatile__("rdtscp" : "=a"(low), "=d"(high) : : "%rcx");
11          return (((uint64_t)high << 32) | low);
12  #elif defined(__aarch64__)
13          unsigned long cval = 0;
14          asm volatile("isb; mrs %0, cntvct_el0" : "=r"(cval) : : "memory");
15          return cval;
16  #else
17  #error "Unsupported CPU architecture or compiler."
18  #endif
19      }
```

有些自己搭建的虚拟机可能没有这个指令集，导致数据库无法启动。

检测方式

使用 lscpu 命令进行检测是否具有该指令集： lscpu | grep rdtscp

解决方法

如果没有该指令集，需要开启 CPU 直通模式 (host-passthrough)

### 3. x86 服务器下 avx 指令

avx 指令集用来进行加速计算，主要是 db4ai 在使用。该指令集从 2.1.0 版本开始引入，如果存在 2.1.0 之前版本可以运行数据库而 2.1.0 之后数据库启动失败，也有可能是没有该指令导致。

检测方式

使用 lscpu 命令进行检测是否具有该指令集： lscpu | grep avx

解决方法

如果没有该指令集，从代码中删掉该指令集的引用，重新打包数据库。

该指令集的引用在 Makefile 里面，可以全局搜索 -mavx , 删掉如下编译选项里面加载-mavx 指令，然后重新打包构建即可

```
1  ifeq ($(PLATFORM_ARCH),x86_64)
2          override CPPFLAGS += -mavx
3  endif
```
