编译反馈调优
本次优化使用PGO编译反馈优化技术,通过插桩形式收集程序运行时信息(profile),编译器更换这些运行时信息指导分支预测,内联优化,函数重排等以进行更准确的优化决策,生成目标程序。
编译器有毕昇编译器和GCC for openEuler两种,其中毕昇编译器针对openEuler系统做过一系列优化手段,经过该编译器的反馈优化后效果要略微好于GCC for openEuler。用户根据需求自行选择,下面具体介绍两种编译器反馈优化的步骤。
毕昇编译器PGO编译反馈优化
- 进入编译Ceph的源码目录。
1
cd /home/ceph-14.2.10
- 添加补丁适配编译。
- 获取patch放到“/home/ceph-14.2.10”。
- 合入1下载的patch。
1
patch -p1 < pgo.patch
- 下载毕昇编译器并设置环境变量。
- 获取插桩编译后的ceph-osd。
- 进入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
- 在脚本中键入以下内容。
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
- 执行脚本完成后,进入“build”目录。
1 2
sh do_cmake_release_pgo_gen.sh cd build
- 执行编译操作。
1
make -j
- 进入ceph-14.2.10源码目录,并新建do_cmake_release_pgo_gen.sh。
- 替换插桩后的ceph-osd,并执行测试用例。
- 采集测试用例反馈的信息。
- 任意选取一个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)
- 执行以上命令后,会在“/media/bisheng-pgo/”下生成default_*_profraw文件。
- 对default_*_profraw文件进行预处理,生成profraw文件。
1 2
cd /media/bisheng-pgo /home/BiShengCompiler-4.1.0-aarch64-linux/bin/llvm-profdata merge -output=bisheng.profdata ./*
- 任意选取一个OSD进程,此处以osd0为例,生成采样文件。
- 利用反馈信息重新编译获取ceph-osd。
- 进入“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
- 在脚本中键入以下内容。
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
- 执行脚本完成后,进入“build”目录。
1 2
sh do_cmake_release_pgo_use.sh cd build
- 执行编译操作。
1
make -j
- 进入“ceph-14.2.10”源码目录,并新建do_cmake_release_pgo_use.sh。
- 将反馈优化后的ceph-osd替换到“/media”目录下,并进行提权操作。
- 停止OSD进程。
1
systemctl stop ceph-osd.target
- 将步骤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
- 停止OSD进程。
- 重启ceph中的OSD进程。
1
systemctl restart ceph-osd.target
GCC for openEuler PGO编译反馈优化
- 进入编译Ceph的源码目录。
1
cd /home/ceph-14.2.10
- 添加补丁适配编译。
- 获取patch放到“/home/ceph-14.2.10”。
- 合入1下载的patch。
1
patch -p1 < pgo.patch
- 获取插桩编译后的ceph-osd。
- 进入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
- 在脚本中键入以下内容。
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
- 执行脚本完成后,进入“build”目录。
1 2
sh do_cmake_release_pgo_gen.sh cd build
- 执行编译操作。
1
make -j
- 进入ceph-14.2.10源码目录,并新建do_cmake_release_pgo_gen.sh。
- 替换插桩后的ceph-osd,并执行测试用例。
- 采集测试用例反馈的信息。
- 任意选取一个OSD进程,此处以osd0为例,生成采样文件。
1 2
gdb attach -p $(ps -ef | grep ceph-osd | grep "\-\-id 0" | awk -F" " '{print $2}') call (void) __gcov_exit()
- 执行以上命令后,会在“/media/pgo/”下生成CMakeFiles文件。
- 任意选取一个OSD进程,此处以osd0为例,生成采样文件。
- 利用反馈信息重新编译获取ceph-osd。
- 进入“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
- 在脚本中键入以下内容。
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
- 执行脚本完成后,进入“build”目录。
1 2
sh do_cmake_release_pgo_use.sh cd build
- 执行编译操作。
1
make -j
- 进入“ceph-14.2.10”源码目录,并新建do_cmake_release_pgo_use.sh。
- 将反馈优化后的ceph-osd替换到“/media”目录下,并进行提权操作。
- 停止OSD进程。
1
systemctl stop ceph-osd.target
- 将步骤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
- 停止OSD进程。
- 重启ceph中的OSD进程。
1
systemctl restart ceph-osd.target
父主题: 调优指南