---
title: 毕昇编译器
description: "使用毕昇编译器对OceanBase数据库进行PGO（Profile-guided Optimization）优化，提升OceanBase的执行效率和性能，大致过程包括OceanBase源码准备、编译器配置、优化选项设置、PGO数据采集和基于PGO数据的优化。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/OceanBase/kunpengocenbase_05_0020.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/OceanBase/kunpengocenbase_05_0020.html
indexId: db5c86b39f1ece34b834232b98b18c6f1a8d800413556724f9821e624c3a1c3376
---
# 毕昇编译器

使用毕昇编译器对OceanBase数据库进行PGO（Profile-guided Optimization）优化，提升OceanBase的执行效率和性能，大致过程包括OceanBase源码准备、编译器配置、优化选项设置、PGO数据采集和基于PGO数据的优化。

1. 以3.1.5版本为例，下载OceanBase源码并进入源码目录，初始化并编译源码。

```
git clone https://github.com/oceanbase/oceanbase oceanbase-3.1.5_CE
cd oceanbase-3.1.5_CE
bash build.sh release --init --make
```


  您也可以直接下载OceanBase 3.1.5源码(https://github.com/oceanbase/oceanbase/archive/refs/tags/v3.1.5_CE.zip)并存放至目标路径。

  等待编译完成。

2. 下载毕昇编译器(https://www.hikunpeng.com/developer/devkit/download/bishengcompiler)并解压到指定目录，例如“/home”。编译器版本需要选择4.0.0。
3. 修改CMake配置文件以适配毕昇编译器。

  a. 修改“cmake/Env.cmake”文件。

    1. 打开“cmake/Env.cmake”文件。

```
cd oceanbase-3.1.5_CE
vim cmake/Env.cmake
```


    2. 按“i”进入编辑模式，将“DEVTOOLS_DIR”设置为毕昇编译器的路径；并添加Clang的头文件路径到“BUILD_OPT”，其中，x.x.x为Clang对应的版本号，请根据实际安装的版本修改。

```
ob_define(DEVTOOLS_DIR "/home/BiShengCompiler4.0")
set(BUILD_OPT "${BUILD_OPT} -I${DEVTOOLS_DIR}lib/clang/
x.x.x
/include/")
```


    3. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  b. 修改“./deps/easy/CMakeLists.txt”和“/deps/oblib/src/CMakeLists.txt”文件。

    1. 打开“cmake/Env.cmake”文件。
    2. 按“i”进入编辑模式，修改“./deps/easy/CMakeLists.txt”文件的第46行和“/deps/oblib/src/CMakeLists.txt”文件的第27行，去除“-Werror”选项，避免编译警告被当作错误处理。
    3. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
4. 配置编译选项以支持PGO。

  a. 打开“cmake/Env.cmake”文件。

```
vim cmake/Env.cmake
```


  b. 按“i”进入编辑模式，为“CMAKE_CXX_FLAGS”和“CMAKE_C_FLAGS”添加优化选项。
    找到“CMAKE_CXX_FLAGS”
    和“CMAKE_C_FLAGS”
    并将这两个选项设置为与以下内容一致。

```
set(CMAKE_CXX_FLAGS "${BUILD_OPT}
-mcpu=tsv110 -fuse-ld=lld -Wno-register -Wl,-q -no-pie -flto=thin -mllvm -enable-aggressive-inline -Wl,-mllvm,-enable-aggressive-inline -mllvm -aggressive-inline-level=3 -Wl,-mllvm,-aggressive-inline-level=3
")
set(CMAKE_C_FLAGS "${BUILD_OPT}
-mcpu=tsv110 -fuse-ld=lld -Wno-register -Wl,-q -no-pie -flto=thin -mllvm -enable-aggressive-inline -Wl,-mllvm,-enable-aggressive-inline -mllvm -aggressive-inline-level=3 -Wl,-mllvm,-aggressive-inline-level=3
")
```


  c. 启用PGO的插桩编译。
    找到“CMAKE_CXX_FLAGS”
    和“CMAKE_C_FLAGS”
    变量，为这两个选项都添加“-fprofile-generate”
    选项和“-Wno-backend-plugin”
    选项，并指定采样数据存放路径（例如“/opt/profile”
    ，请根据实际情况自定义）。修改示例参考如下：

```
set(CMAKE_CXX_FLAGS "${BUILD_OPT}
-fprofile-generate
=
/opt/profile
-Wno-backend-plugin
")
set(CMAKE_C_FLAGS "${BUILD_OPT}
-fprofile-generate
=
/opt/profile
-Wno-backend-plugin
")
```


  d. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
5. 重新编译OceanBase源码以生成插桩版本的OceanBase。

```
cd oceanbase-3.1.5_CE
bash build.sh release  --make
```


  编译完成将生成插桩版本的OBServer二进制文件。

6. 采集性能数据。

  a. 将插桩版本的OBServer替换到OceanBase集群中，并启动OceanBase集群。
  b. 运行测试模型，如Sysbench或TPC-C等，对OceanBase集群进行测试，生成性能数据。
  c. 停止OBServer进程，收集生成的采样数据文件。

```
kill `pidof observer`
```


    上述命令执行完成后，将生成采样数据文件（例如xxx.profraw）。

  d. 使用llvm-profdata工具将xxx.profraw文件合并成.profdata文件。

```
llvm-profdata merge xxx.profraw -output=xxx.profdata
```


7. 使用性能数据进行优化编译。
  需要修改OceanBase源码中的“cmake/Env.cmake”
  文件。
  a. 打开“cmake/Env.cmake”文件。

```
cd oceanbase-3.1.5_CE
vim cmake/Env.cmake
```


  b. 按“i”进入编辑模式，将“CMAKE_CXX_FLAGS”和“CMAKE_C_FLAGS”的编译选项从“-fprofile-generate”更改为“-fprofile-use”，并指定xxx.profdata文件的路径。修改示例参考如下：

```
set(CMAKE_CXX_FLAGS "${BUILD_OPT}
-fprofile-use
=
/opt/profile/xxx.profdata
-Wno-backend-plugin")
set(CMAKE_C_FLAGS "${BUILD_OPT}
-fprofile-use
=
/opt/profile/xxx.profdata
-Wno-backend-plugin ")
```


  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。


8. 重新编译OceanBase。

```
cd oceanbase-3.1.5_CE
bash build.sh release  --make
```


  编译完成将生成优化后的OBServer二进制文件，将优化后的OBServer替换到OceanBase集群中，并启动OceanBase集群。
