llvm-bolt
2.2 MySQL场景搭建
2.2.1 编译环境
安装编译依赖
dnf -y install bison ncurses ncurses-devel libaio-devel openssl openssl-devel gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel wget tar rpcgen cmake libtirpc-devel gcc gcc-c++ m4 automake libtool
获取MySQL源码
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-boost-8.0.25.tar.gz
获取sysbench源码
wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0.zip"
解压源码
tar xf mysql-boost-8.0.25.tar.gz
unzip sysbench-1.0.zip
2.2.2 编译安装MySQL
建立build目录
cd mysql-8.0.25 && mkdir build
生成构建文件
cmake .. -DCMAKE_LINKER=/usr/bin/lld -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS="-fno-reorder-blocks-and-partition -Wl,--emit-relocs" -DCMAKE_CXX_FLAGS="-fno-reorder-blocks-and-partition -Wl,--emit-relocs" -DBUILD_CONFIG=mysql_release -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/data -DWITH_BOOST=/root/mysql-8.0.25/boost/boost_1_73_0
编译
make -jnproc
安装
make install
2.2.3 编译安装sysbench
编译
cd sysbench-1.0
echo export PATH=$PATH:/usr/local/mysql/bin >> ~/.bashrc
source ~/.bashrc
./autogen.sh
./configure
make -jnproc
安装
make install
指定MySQL库位置
echo /usr/local/mysql/lib >> /etc/ld.so.conf
ldconfig -v
验证
sysbench --version
sysbench 1.0.20
2.3 MySQL实例配置初始化
2.3.1 创建用户和数据目录
groupadd mysql
useradd -g mysql mysql
passwd mysql
mkdir -p /data/mysql
cd /data/mysql
mkdir data tmp run log relaylog
chown -R mysql:mysql /data/mysql
2.3.2 初始化配置
cat > /etc/my.cnf << EOF
[mysqld_safe]
log-error=/data/mysql/log/mysql.log
pid-file=/data/mysql/run/mysqld.pid
[mysqldump]
quick
[mysql]
no-auto-rehash
[client]
default-character-set=utf8
[mysqld]
basedir=/usr/local/mysql
socket=/data/mysql/run/mysql.sock
tmpdir=/data/mysql/tmp
datadir=/data/mysql/data
default_authentication_plugin=mysql_native_password
port=3306
user=mysql
max_connections=5000
back_log=2048
max_prepared_stmt_count=128000
EOF
2.3.3 初始化实例
/usr/local/mysql/bin/mysqld --initialize --user mysql --datadir=/data/mysql/data
get初始密码
2.3.4 修改初始化密码
启动mysqld进程
/usr/local/mysql/bin/mysqld --user=root &
登录
/usr/local/mysql/bin/mysql -u root -p -S /data/mysql/run/mysql.sock
修改初始密码
alter user 'root'@'localhost' identified by "123456";
create user 'root'@'%' identified by '123456';
grant all privileges on . to 'root'@'%';
flush privileges;
创建数据库
create database sbtest;
2.3.6 性能测试脚本
脚本示例如下。
实际上,该示例脚本包含mysql的服务的启动以及sysbench的测试命令,实际使用时可分开执行。
绑核数量视情况设置,本文主要为了验证自动反馈优化特性,故并没有进行实际的全部调优。
cat mysql-benchmark.sh
! /bin/bash
tooldir={tooldir}/mysql-start.sh
sleep 5
sh ${tooldir}/sysbench-test.sh
cat mysql-start.sh
! /bin/bash
mysqlpid=$(pgrep -x mysqld)
if [ "${mysqlpid}" != "" ]
then
/usr/local/mysql/bin/mysqladmin -uroot -p123456 shutdown -S /data/mysql/run/mysql.sock
fi
taskset -c 0-7 /usr/local/mysql/bin/mysqld --user=root &
cat sysbench-test.sh
! /bin/bash
common_param="--report-interval=10 --mysql-user=root --mysql-password=123456 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-db=sbtest --db-driver=mysql"
taskset -c 8 sysbench ${common_param} --threads=5 oltp_read_write --tables=10 --table-size=100000 prepare
taskset -c 8 sysbench ${common_param} --threads=5 oltp_read_write --tables=10 --table-size=100000 --time=120 run
taskset -c 8 sysbench ${common_param} oltp_read_write --tables=10 --table-size=100000 --mysql-ignore-errors=8005 cleanup
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
3 llvm-bolt验证
3.1 基础性能测试
3.1.1 启动服务运行测试
运行测试
./mysql-benchmark.sh
采集mysqld进程数据(在开始进行性能测试的同时)
perf record -e cycles:u -o perf_profile.data -p pidof mysqld
-- sleep 150
3.1.2 测试结果
SQL statistics:
queries performed:
read: 816690
write: 233340
other: 116670
total: 1166700
transactions: 58335 (486.01 per sec.)
queries: 1166700 (9720.28 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 120.0259s
total number of events: 58335
Latency (ms):
min: 4.86
avg: 10.29
max: 92.27
95th percentile: 15.55
sum: 599987.61
Threads fairness:
events (avg/stddev): 11667.0000/13.93
execution time (avg/stddev): 119.9975/0.01
3.2 llvm-bolt优化二进制
3.2.1 perf2bolt转换性能数据格式
perf2bolt的作用是将运行时收集的perf性能数据转换为BOLT可以理解的格式,以便llvm-bolt根据这些数据对二进制文件进行优化,转换方法如下:
perf2bolt -p ./perf_profile.data -o ./perf_profile.fdata -nl /usr/local/mysql/bin/mysqld
3.2.2 llvm-bolt对二进制进行优化
llvm-bolt /usr/local/mysql/bin/mysqld -o ./mysqld.bolt -data perf_profile.fdata
优化后的二进制是mysqld.bolt,从上图日志可以看出,llvm-bolt对mysqld二进制文件进行了多方面的优化:
指令缩短:33801条指令被缩短,提高了代码的紧凑性和执行效率。
空块删除:删除了9765个空块,减少了代码冗余。
宏融合优化:利用宏融合机会修复了热路径上的实例,提高了性能。
尾调用优化:修补了302个尾调用,并删除了一些冗余的跳转和基本块,进一步优化了代码执行路径。
3.2.3 优化后性能测试
1)备份原有二进制
mv /usr/local/mysql/bin/mysqld /usr/local/mysql/bin/mysqld.bak
2)替换二进制
cp mysqld.bolt /usr/local/mysql/bin/mysqld
3)进行性能测试
./mysql-benchmark.sh
SQL statistics:
queries performed:
read: 835912
write: 238832
other: 119416
total: 1194160
transactions: 59708 (497.48 per sec.)
queries: 1194160 (9949.55 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 120.0200s
total number of events: 59708
Latency (ms):
min: 4.64
avg: 10.05
max: 116.52
95th percentile: 15.55
sum: 599967.27
Threads fairness:
events (avg/stddev): 11941.6000/10.71
execution time (avg/stddev): 119.9935/0.00
3.2.4 优化前后性能对比
根据调优前后的性能对比,通过llvm-bolt对mysqld二进制进行优化后,TPS由486.01提升至497.48,提升了%2.3,QPS由9720.28提升至9949.55,提升了%2.3。
perf_profile.gcov 和 perf_profile.bolt 这两个文件分别与不同的性能分析和优化工具相关联,它们各自服务于不同的目的:
perf_profile.gcov: 这个文件通常与 GCC 的性能分析工具 gcov(GCOV)有关。gcov 是一个代码覆盖率工具,它可以跟踪程序执行期间每个源代码行的执行次数,从而帮助开发者理解哪些部分的代码被频繁执行,哪些部分可能从未被执行。perf_profile.gcov 文件包含了由 gcov 生成的代码覆盖率数据,可以用来指导优化工作,例如,通过识别热点代码段进行针对性的优化。
perf_profile.bolt: perf_profile.bolt 则与 Binary Optimization and Layout Tool(BOLT)相关。BOLT 是一个用于优化二进制文件布局的工具,它通过分析程序的运行时行为,重新组织二进制文件中的代码和数据段,以减少分支预测错误和提高缓存效率。perf_profile.bolt 文件包含了 BOLT 分析的结果,可以用来生成优化后的二进制文件。
两者的主要区别在于:
用途:
perf_profile.gcov 主要用于代码覆盖率分析和性能热点识别。
perf_profile.bolt 主要用于二进制级别的性能优化,特别是针对分支预测和缓存效率的优化。
工具:
perf_profile.gcov 与 GCC 的 gcov 工具相关联。
perf_profile.bolt 与 BOLT 工具相关联。
输出:
perf_profile.gcov 输出的是代码覆盖率信息。
perf_profile.bolt 输出的是二进制优化信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现