---
title: 编译反馈调优
description: "本次优化使用PGO编译反馈优化技术，通过插桩形式收集程序运行时信息（profile），编译器利用这些运行时信息指导分支预测，内联优化，函数重排等以进行更准确的优化决策，生成目标程序。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2400/sds/kunpengecturbo_02_0011.html
sourcePath: /source/zh/kunpengboostkithistory/2400/sds/kunpengecturbo_02_0011.html
indexId: 3945ecba02bb8d06f0a9b7eb70d55a7339c02867e28b383bbdc4bdc1df31ed5270
---
# 编译反馈调优

本次优化使用PGO编译反馈优化技术，通过插桩形式收集程序运行时信息（profile），编译器利用这些运行时信息指导分支预测，内联优化，函数重排等以进行更准确的优化决策，生成目标程序。

编译器有毕昇编译器和GCC for openEuler两种，其中毕昇编译器针对openEuler系统做过一系列优化手段，经过该编译器的反馈优化后效果要略微好于GCC for openEuler。用户根据需求自行选择，下面具体介绍两种编译器反馈优化的步骤。

#### 毕昇编译器PGO编译反馈优化

1. 进入编译Ceph的源码目录。
  1 cd /home/ceph-14.2.10

2. 添加补丁适配编译。

  a. 获取patch放到“/home/ceph-14.2.10”。
    patch下载链接：pgo.patch(https://gitee.com/kunpengcompute/ceph/releases/download/ec_turbo_optimization/pgo.patch)。

  b. 合入    1
下载的patch。
    1 patch -p1 < pgo.patch

3. 下载毕昇编译器并设置环境变量。

  a. 单击    此处(https://www.hikunpeng.com/zh/developer/devkit/compiler/bisheng)
获取毕昇编译器。
  b. 执行以下命令将压缩包放置于“/home”目录下并解压。
    1 2 cd /home tar -zxvf BiShengCompiler-4.1.0-aarch64-linux.tar.gz

  c. 设置环境变量。
    1 2 export PATH=/home/BiShengCompiler-4.1.0-aarch64-linux/bin:$PATH export LD_LIBRARY_PATH=/home/BiShengCompiler-4.1.0-aarch64-linux/lib:$LD_LIBRARY_PATH

4. 获取插桩编译后的ceph-osd。

  a. 进入ceph-14.2.10源码目录，并新建do_cmake_release_pgo_gen.sh。
    1 2 cd /home/ceph-14.2.10 vim do_cmake_release_pgo_gen.sh

  b. 在脚本中键入以下内容。
    1 2 3 4 5 6 7 8 #!/bin/bash set -x export PATH=/home/BiShengCompiler-4.1.0-aarch64-linux/bin:$PATH rm -rf build OPT_FLAGS="-O3 -flto=thin -fuse-ld=lld -Wno-unused-command-line-argument -fprofile-generate=/media/bisheng-pgo -mllvm -inline-threshold=1000 -Wl,-mllvm,-inline-threshold=1000 -Wl,-zmax-page-size=2097152 -mno-outline-atomics" ./do_cmake.sh -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib64 -DCMAKE_INSTALL_LIBEXECDIR=/usr/lib -DCMAKE_INSTALL_LOCALSTATEDIR=/var -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_MANDIR=/usr/share/man -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/ceph -DCMAKE_INSTALL_INCLUDEDIR=/usr/include -DCMAKE_INSTALL_SYSTEMD_SERVICEDIR=/usr/lib/systemd/system -DWITH_MANPAGE=ON -DWITH_PYTHON3=3.7 -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DWITH_PYTHON2=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS_RELEASE="-O3 -DNDEBUG -Wno-unused-command-line-argument" -DCMAKE_CXX_FLAGS_RELEASE="-O3 -DNDEBUG -Wno-unused-command-line-argument" -DCMAKE_AR="`which llvm-ar`" -DCMAKE_RANLIB="`which llvm-ranlib`" -DWITH_TESTS=OFF -DWITH_CEPHFS_JAVA=ON -DWITH_SELINUX=ON -DWITH_LTTNG=ON -DWITH_BABELTRACE=ON -DWITH_OCF=ON -DWITH_BOOST_CONTEXT=ON -DWITH_LIBRADOSSTRIPER=ON -DWITH_RADOSGW_AMQP_ENDPOINT=ON -DWITH_RADOSGW_KAFKA_ENDPOINT=ON -DBOOST_J=64 -DWITH_GRAFANA=ON -DCMAKE_C_FLAGS="$OPT_FLAGS" -DCMAKE_CXX_FLAGS="$OPT_FLAGS" -DWITH_REENTRANT_STRSIGNAL=ON

  c. 执行脚本完成后，进入“build”目录。
    1 2 sh do_cmake_release_pgo_gen.sh cd build

  d. 执行编译操作。
    1 make -j

5. 替换插桩后的ceph-osd，并执行测试用例。

  a. 停止OSD进程。
    1 systemctl stop ceph-osd.target

  b. 将    步骤4
编译好后的ceph-osd替换到“/media/”目录下，并进行提权。
    1 2 cp /home/ceph-14.2.10/build/bin/ceph-osd /media setcap 'CAP_DAC_OVERRIDE+eip CAP_SYS_ADMIN+eip' /media/ceph-osd

  c. 重启OSD进程。
    1 systemctl restart ceph-osd.target

  d. 执行4k块读写测试用例，详细步骤请参见    测试指导
。
6. 采集测试用例反馈的信息。

  a. 任意选取一个OSD进程，此处以osd0为例，生成采样文件。
    1 2 3 4 gdb attach -p $( ps -ef | grep ceph-osd | grep "\-\-id 0" | awk -F" " '{print $2}') set height 0 handle SIG36 SIGUSR2 noprint nostop call (int)exit(0)

  b. 执行以上命令后，会在“/media/bisheng-pgo/”下生成default_*_profraw文件。
  c. 对default_*_profraw文件进行预处理，生成profraw文件。
    1 2 cd /media/bisheng-pgo /home/BiShengCompiler-4.1.0-aarch64-linux/bin/llvm-profdata merge -output=bisheng.profdata ./*

7. 利用反馈信息重新编译获取ceph-osd。

  a. 进入“ceph-14.2.10”源码目录，并新建do_cmake_release_pgo_use.sh。
    1 2 cd /home/ceph-14.2.10 vim do_cmake_release_pgo_use.sh

  b. 在脚本中键入以下内容。
    1 2 3 4 5 6 7 8 #!/bin/bash set -x export PATH=/home/BiShengCompiler-4.1.0-aarch64-linux/bin:$PATH rm -rf build OPT_FLAGS="-O3 -flto=thin -fuse-ld=lld -Wno-unused-command-line-argument -fprofile-use=/media/bisheng-pgo/bisheng.profdata -mllvm -inline-threshold=1000 -Wl,-mllvm,-inline-threshold=1000 -Wl,-q -Wl,-zmax-page-size=2097152 -mno-outline-atomics" ./do_cmake.sh -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib64 -DCMAKE_INSTALL_LIBEXECDIR=/usr/lib -DCMAKE_INSTALL_LOCALSTATEDIR=/var -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_MANDIR=/usr/share/man -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/ceph -DCMAKE_INSTALL_INCLUDEDIR=/usr/include -DCMAKE_INSTALL_SYSTEMD_SERVICEDIR=/usr/lib/systemd/system -DWITH_MANPAGE=ON -DWITH_PYTHON3=3.7 -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DWITH_PYTHON2=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS_RELEASE="-O3 -DNDEBUG -Wno-unused-command-line-argument" -DCMAKE_CXX_FLAGS_RELEASE="-O3 -DNDEBUG -Wno-unused-command-line-argument" -DCMAKE_AR="`which llvm-ar`" -DCMAKE_RANLIB="`which llvm-ranlib`" -DWITH_TESTS=OFF -DWITH_CEPHFS_JAVA=ON -DWITH_SELINUX=ON -DWITH_LTTNG=ON -DWITH_BABELTRACE=ON -DWITH_OCF=ON -DWITH_BOOST_CONTEXT=ON -DWITH_LIBRADOSSTRIPER=ON -DWITH_RADOSGW_AMQP_ENDPOINT=ON -DWITH_RADOSGW_KAFKA_ENDPOINT=ON -DBOOST_J=64 -DWITH_GRAFANA=ON -DCMAKE_C_FLAGS="$OPT_FLAGS" -DCMAKE_CXX_FLAGS="$OPT_FLAGS" -DWITH_REENTRANT_STRSIGNAL=ON

  c. 执行脚本完成后，进入“build”目录。
    1 2 sh do_cmake_release_pgo_use.sh cd build

  d. 执行编译操作。
    1 make -j

8. 将反馈优化后的ceph-osd替换到“/media”目录下，并进行提权操作。

  a. 停止OSD进程。
    1 systemctl stop ceph-osd.target

  b. 将    步骤7
编译好后的ceph-osd替换到“/media/”目录下，并进行提权。
    1 2 cp /home/ceph-14.2.10/build/bin/ceph-osd /media setcap 'CAP_DAC_OVERRIDE+eip CAP_SYS_ADMIN+eip' /media/ceph-osd

9. 重启ceph中的OSD进程。
  1 systemctl restart ceph-osd.target


#### GCC for openEuler PGO编译反馈优化

1. 进入编译Ceph的源码目录。
  1 cd /home/ceph-14.2.10

2. 添加补丁适配编译。

  a.     获取patch(https://gitee.com/kunpengcompute/ceph/releases/download/ec_turbo_optimization/pgo.patch)
放到“/home/ceph-14.2.10”。
  b. 合入    1
下载的patch。
    1 patch -p1 < pgo.patch

3. 获取插桩编译后的ceph-osd。

  a. 进入ceph-14.2.10源码目录，并新建do_cmake_release_pgo_gen.sh。
    1 2 cd /home/ceph-14.2.10 vim do_cmake_release_pgo_gen.sh

  b. 在脚本中键入以下内容。
    1 2 3 4 5 6 #!/bin/bash set -x rm -rf build OPT_FLAGS="-O3 -fprofile-generate=/media/pgo -Wl,-zmax-page-size=2097152" ./do_cmake.sh -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib64 -DCMAKE_INSTALL_LIBEXECDIR=/usr/lib -DCMAKE_INSTALL_LOCALSTATEDIR=/var -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_MANDIR=/usr/share/man -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/ceph -DCMAKE_INSTALL_INCLUDEDIR=/usr/include -DCMAKE_INSTALL_SYSTEMD_SERVICEDIR=/usr/lib/systemd/system -DWITH_MANPAGE=ON -DWITH_PYTHON3=3.7 -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DWITH_PYTHON2=ON -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DWITH_TESTS=OFF -DWITH_CEPHFS_JAVA=ON -DWITH_SELINUX=ON -DWITH_LTTNG=ON -DWITH_BABELTRACE=ON -DWITH_OCF=ON -DWITH_BOOST_CONTEXT=ON -DWITH_LIBRADOSSTRIPER=ON -DWITH_RADOSGW_AMQP_ENDPOINT=ON -DWITH_RADOSGW_KAFKA_ENDPOINT=ON -DBOOST_J=64 -DWITH_GRAFANA=ON -DCMAKE_C_FLAGS="$OPT_FLAGS" -DCMAKE_CXX_FLAGS="$OPT_FLAGS" -DWITH_REENTRANT_STRSIGNAL=ON

  c. 执行脚本完成后，进入“build”目录。
    1 2 sh do_cmake_release_pgo_gen.sh cd build

  d. 执行编译操作。
    1 make -j

4. 替换插桩后的ceph-osd，并执行测试用例。

  a. 停止OSD进程。
    1 systemctl stop ceph-osd.target

  b. 将    步骤3
编译好后的ceph-osd替换到“/media/”目录下，并进行提权。
    1 2 cp /home/ceph-14.2.10/build/bin/ceph-osd /media setcap 'CAP_DAC_OVERRIDE+eip CAP_SYS_ADMIN+eip' /media/ceph-osd

  c. 重启OSD进程。
    1 systemctl restart ceph-osd.target

  d. 执行4k块读写测试用例，详细步骤请参见    测试指导
。
5. 采集测试用例反馈的信息。

  a. 任意选取一个OSD进程，此处以osd0为例，生成采样文件。
    1 2 gdb attach -p $(ps -ef | grep ceph-osd | grep "\-\-id 0" | awk -F" " '{print $2}') call (void) __gcov_exit()

  b. 执行以上命令后，会在“/media/pgo/”下生成CMakeFiles文件。
6. 利用反馈信息重新编译获取ceph-osd。

  a. 进入“ceph-14.2.10”源码目录，并新建do_cmake_release_pgo_use.sh。
    1 2 cd /home/ceph-14.2.10 vim do_cmake_release_pgo_use.sh

  b. 在脚本中键入以下内容。
    1 2 3 4 5 6 #!/bin/bash set -x rm -rf build OPT_FLAGS="-O3 -fprofile-use=/media/pgo -fprofile-correction -Wno-error=coverage-mismatch -Wl,-zmax-page-size=2097152" ./do_cmake.sh -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib64 -DCMAKE_INSTALL_LIBEXECDIR=/usr/lib -DCMAKE_INSTALL_LOCALSTATEDIR=/var -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_MANDIR=/usr/share/man -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/ceph -DCMAKE_INSTALL_INCLUDEDIR=/usr/include -DCMAKE_INSTALL_SYSTEMD_SERVICEDIR=/usr/lib/systemd/system -DWITH_MANPAGE=ON -DWITH_PYTHON3=3.7 -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DWITH_PYTHON2=ON -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DWITH_TESTS=OFF -DWITH_CEPHFS_JAVA=ON -DWITH_SELINUX=ON -DWITH_LTTNG=ON -DWITH_BABELTRACE=ON -DWITH_OCF=ON -DWITH_BOOST_CONTEXT=ON -DWITH_LIBRADOSSTRIPER=ON -DWITH_RADOSGW_AMQP_ENDPOINT=ON -DWITH_RADOSGW_KAFKA_ENDPOINT=ON -DBOOST_J=64 -DWITH_GRAFANA=ON -DCMAKE_C_FLAGS="$OPT_FLAGS" -DCMAKE_CXX_FLAGS="$OPT_FLAGS" -DWITH_REENTRANT_STRSIGNAL=ON

  c. 执行脚本完成后，进入“build”目录。
    1 2 sh do_cmake_release_pgo_use.sh cd build

  d. 执行编译操作。
    1 make -j

7. 将反馈优化后的ceph-osd替换到“/media”目录下，并进行提权操作。

  a. 停止OSD进程。
    1 systemctl stop ceph-osd.target

  b. 将    步骤6
编译好后的ceph-osd替换到“/media/”目录下，并进行提权。
    1 2 cp /home/ceph-14.2.10/build/bin/ceph-osd /media setcap 'CAP_DAC_OVERRIDE+eip CAP_SYS_ADMIN+eip' /media/ceph-osd

8. 重启ceph中的OSD进程。
  1 systemctl restart ceph-osd.target
