鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

编译反馈调优

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

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

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

  1. 进入编译Ceph的源码目录。
    1
    cd /home/ceph-14.2.10
    
  2. 添加补丁适配编译。
    1. 获取patch放到“/home/ceph-14.2.10”

      patch下载链接:pgo.patch

    2. 合入1下载的patch。
      1
      patch -p1 < pgo.patch 
      
  3. 下载毕昇编译器并设置环境变量。
    1. 单击此处下载毕昇编译器。
    2. 执行以下命令将压缩包放置于“/home”目录下并解压。
      1
      2
      cd /home 
      tar -zxvf BiShengCompiler-4.1.0-aarch64-linux.tar.gz
      
    3. 设置环境变量。
      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。
    1. 进入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
      
    2. 在脚本中键入以下内容。
      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
      
    3. 执行脚本完成后,进入“build”目录。
      1
      2
      sh do_cmake_release_pgo_gen.sh
      cd build
      
    4. 执行编译操作。
      1
      make -j
      
  5. 替换插桩后的ceph-osd,并执行测试用例。
    1. 停止OSD进程。
      1
      systemctl stop ceph-osd.target
      
    2. 步骤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
      
    3. 重启OSD进程。
      1
      systemctl restart ceph-osd.target
      
    4. 执行4k块读写测试用例,详细步骤请参见测试指导
  6. 采集测试用例反馈的信息。
    1. 任意选取一个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)
      
    2. 执行以上命令后,会在“/media/bisheng-pgo/”下生成default_*_profraw文件。

    3. 对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。
    1. 进入“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
      
    2. 在脚本中键入以下内容。
      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
      
    3. 执行脚本完成后,进入“build”目录。
      1
      2
      sh do_cmake_release_pgo_use.sh
      cd build
      
    4. 执行编译操作。
      1
      make -j
      
  8. 将反馈优化后的ceph-osd替换到“/media”目录下,并进行提权操作。
    1. 停止OSD进程。
      1
      systemctl stop ceph-osd.target
      
    2. 步骤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. 添加补丁适配编译。
    1. 获取patch放到“/home/ceph-14.2.10”

      patch下载链接:pgo.patch

    2. 合入1下载的patch。
      1
      patch -p1 < pgo.patch 
      
  3. 获取插桩编译后的ceph-osd。
    1. 进入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
      
    2. 在脚本中键入以下内容。
      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
      
    3. 执行脚本完成后,进入“build”目录。
      1
      2
      sh do_cmake_release_pgo_gen.sh
      cd build
      
    4. 执行编译操作。
      1
      make -j
      
  4. 替换插桩后的ceph-osd,并执行测试用例。
    1. 停止OSD进程。
      1
      systemctl stop ceph-osd.target
      
    2. 步骤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
      
    3. 重启OSD进程。
      1
      systemctl restart ceph-osd.target
      
    4. 执行4k块读写测试用例,详细步骤请参见测试指导
  5. 采集测试用例反馈的信息。
    1. 任意选取一个OSD进程,此处以osd0为例,生成采样文件。
      1
      2
      gdb attach -p $(ps -ef | grep ceph-osd | grep "\-\-id 0" | awk -F" " '{print $2}')
      call (void) __gcov_exit()
      
    2. 执行以上命令后,会在“/media/pgo/”下生成CMakeFiles文件。

  6. 利用反馈信息重新编译获取ceph-osd。
    1. 进入“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
      
    2. 在脚本中键入以下内容。
      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
      
    3. 执行脚本完成后,进入“build”目录。
      1
      2
      sh do_cmake_release_pgo_use.sh
      cd build
      
    4. 执行编译操作。
      1
      make -j
      
  7. 将反馈优化后的ceph-osd替换到“/media”目录下,并进行提权操作。
    1. 停止OSD进程。
      1
      systemctl stop ceph-osd.target
      
    2. 步骤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