Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不花钱提升 20-30% 的性能?看看MySQL编译器优化PGO

不花钱提升 20-30% 的性能?看看MySQL编译器优化PGO

作者头像
用户1278550
发布于 2024-07-02 09:04:22
发布于 2024-07-02 09:04:22
58600
代码可运行
举报
文章被收录于专栏:idbaidba
运行总次数:0
代码可运行

MySQL 在不修改代码的情况下,通过编译器优化,可以提高特定场景下的运行性能,通常性能可以有 20% ~ 40% 的性能提升。

这种特性在某些特定场景的 POC 测试中可以使用,以便更容易的通过测试, 部分云厂商已经提供针对sysbench的 PGO 版本。

在 PGO 编译器优化前

我们做的比较多的编译器优化是分支预测优化。这种奇技淫巧通过告诉编译器代码更倾向于走哪个分支,从而提升程序的运行效率。一旦预测是正确的,那么程序的性能就能得到有效的提升。但分支预测优化存在以下几个问题:

  1. 需要修改源码,而且需要非常有经验的程序员方能编写可靠的代码
  2. 编写的分支预测可能与实际业务运行的不一样,从而失去性能提升的可能性,反而导致灾难的发生

PGO 编译器优化

为了解决上面这两个问题,可以使用 PGO,更为通用的编译器优化,从而提升程序的运行效率。简单来说,PGO 会根据程序真实的运行情况,生成一份 profile 文件。下次编译时,通过上次运行产生的 profile 文件,以产生更加贴近真实运行情况、性能更好的代码。可以看到,PGO 优化需要两次编译,三个阶段:

  1. 采样编译(Instrument):在 instrument 阶段,先对应用做一次编译,在此编译中,编译器会向代码中插入指令,以便下一阶段可以收集数据。这些指令分为三种类型,分别用于统计每个函数被执行了多少次,每个分支被执行了多少次(例如 if-else 的场景)以及某些变量的值。
  2. 训练程序(Train):在 train 阶段,用户需要使用最常用的输入来运行上一阶段编译生成后的应用。由于上一阶段已经做好了收集数据的准备,所以在经过 train 阶段之后,该应用最常见的使用场景对应的数据就会被收集下来。
  3. 优化编译(Optimization):在 optimization 阶段中,编译器会利用上一阶段收集到的数据,对应用进行重新编译。由于上一阶段的数据来自于用户输入的最常见的用户场景,所以最后优化得到的结果就能在该场景下有更好的优化。

可以发现 PGO 优化不仅仅对数据库程序优化有效率,其实他是一种通用的优化手段,可以用于任何程序的优化。常见的 C/C++、Rust语言都已支持 PGO 优化。在 C++ 代码中使用 PGO 优化其实也比较简单,并不复杂。加上编译参数 -fprofile-generate 用户采样编译,参数 -fprofile-use 表示用 profile 进行优化编译。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#### 采样编译
g++ -o test test.cpp -fprofile-generate=/tmp/pgo
#### 运行程序
./test
### 优化编译
>g++ -o test test.cpp -fprofile-use=/tmp/pgo

使用 PGO 编译 MySQL

由于 MySQL 数据库使用 C++ 进行编写,显然可以使用 PGO 优化。从 MySQL 8.0.19 版本开始,MySQL 的 cmake 文件支持 PGO 优化,对 MySQL 进行采样编译可以加上参数 FPROFILE_GENERATE:

第一次编译
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd mysql-server-8.0.33
$ mkdir build
$ cmake -DCMAKE_C_FLAGS="-g -O3 -march=native -mcpu=native -flto" -DCMAKE_CXX_FLAGS="-g -O3 -march=native -mcpu=native -flto" -DCMAKE_INSTALL_PREFIX=/mysql_data/mysql_8.0.33_gcc_11.3.0_profile -DWITH_BOOST=/build/boost_1_77_0 -DFPROFILE_GENERATE=ON ..
$ make -j $(nproc)
$ make install
运行mysqld ,并压测

接着运行采样编译的二进制程序 mysqld,并运行 sysbench 程序,测试点查询的只读性能。

此时 PGO 其实在收集 MySQL 数据库运行时的各种状态,函数,变量。所以, MySQL 的 QPS 降低了很多。如果我们在观察二进制文件所在的 xxx-profile-data 文件夹,就会发现该文件夹下已经产生了很多 gcda 结尾的 profile 文件。

mysql-server-8.0.33/build-profile-data

第二次编译

然后,停止 mysqld 程序,通过下面的命令重新编译 MySQL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd mysql-server-8.0.33
$ rm rf build && mkdir build # make sure it's same build directory as in step 1, or it would fail to find the profile data under build-profile-data
$ cmake -DCMAKE_C_FLAGS="-g -O3 -march=native -mcpu=native -flto" -DCMAKE_CXX_FLAGS="-g -O3 -march=native -mcpu=native -flto" -DCMAKE_INSTALL_PREFIX=/mysql_data/mysql_8.0.33_gcc_11.3.0_pgo  -DWITH_BOOST=/build/boost_1_77_0 -DFPROFILE_USE=ON ..
$ make -j $(nproc)
$ make install

通过指定FPROFILE_USE=ON,再次进行编译时,MySQL 会自动根据 xxx-profile-data 文件夹下的各种 profile 文件进行编译器优化。这里产生的 mysqld 程序将会是对应上述 sysbench 测试后的编译优化版本。因此,在优化编译后,重新启动优化后的 mysqld 程序,再进行同样的 sysbench 性能压测,结果较之前有明显的提升,通过 PGO 优化后,性能提升超过 30%。

PGO 优化的限制

其实,从上面的实现原理来看,PGO是一种基于场景反馈的优化,比如针对 sysbench 的读写操作进行优化。但是实际业务中,这个数据库实例随着业务的发展,会有不同的TP 业务模型 ,或者会增加 AP 类的查询,此时 PGO 优化就不能完全覆盖新增的业务场景。

那么如何更好的使用的?欢迎大家来探讨。

参考

https://aijishu.com/a/1060000000433835

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go和C++通用性能优化黑魔法——PGO!
我们在进行性能优化的时候,往往会应用各种花式的优化手段:优化算法复杂度(从 O(N) 优化到 O(logN) ),优化锁的粒度或者无锁化,应用各种池化技术:内存池、连接池、线程池、协程池等。压缩技术、预拉取、缓存、批量处理、SIMD,内存对齐等等手段后,其实还有一种手段就是 Profile-Guided Optimization (PGO)。本文会介绍 PGO 的原理,以及 Go/C++ 语言进行 PGO 的实践。
腾讯云开发者
2023/10/23
2K0
Go和C++通用性能优化黑魔法——PGO!
PGO与LTO优化:编译器的秘密武器
如果你是一个软件开发者或者编译器爱好者,你可能已经听说过PGO(Profile-Guided Optimization)和LTO(Link Time Optimization)。那么,我们究竟应该如何理解这两种优化技术呢?本文将深入探讨PGO和LTO,展示它们的工作原理,如何在项目中实现,以及它们在实际应用中的优缺点。
码事漫谈
2024/12/23
4250
PGO与LTO优化:编译器的秘密武器
英特尔最新版 C/C++ 编译器采用 LLVM 架构,性能提升明显
下一代英特尔 C/C++ 编译器的表现会更加出色,因为它们将使用 LLVM 开源基础架构。
深度学习与Python
2021/10/13
1.1K0
在线教程!C++如何在云应用中快速实现编译优化?
导语 | 本文尝试在系统级的编译软件层面,挖掘云应用的性能提升空间。以C/C++应用的反馈优化技术为例,介绍业务和编译技术深度整合后产生的收益和价值,希望给相关业务的探索提供参考。 一、现代云应用特征 云应用特征梳理是一个非常庞大的系统工程,只有云厂商才有机会做全局剖析。一些特征沉淀成专用芯片或专用指令,比如AI芯片和新一代ARM64 CPU中的Matrix乘累加指令,或者一些RISC-V中的Protobuf加速尝试,一些特征驱动系统级的OS/编译软件优化获得普适收益。本次我们主要以典型C/C++应用展开分
腾讯云开发者
2022/02/15
1.6K0
编译优化在微信视频号的落地实践
导语:编译优化是通过编译技术获得性能提升的一类性能优化方法,它具有通用性和可持续性强的优势,一次投入后可长期保持稳定的优化效果,可以有效降低性能优化的成本。本文将回顾视频号推荐模块落地编译优化的历程和成果,也会介绍具体实践中遇到的问题和对应的解决方案,为后续同类应用提供参考。期待后续更多的业务模块能通过编译优化取得性能提升和成本收益。
用户3167314
2024/04/10
4930
MySQL Shell 8.0.32 for GreatSQL编译安装
GreatSQL 8.0.32-24已发布,配套的MySQL Shell也需要跟着升级一波,MySQL Shell版本从8.0.25升级到8.0.32后,也引入了一些不错的新特性。
老叶茶馆
2023/09/01
3620
MySQL Shell 8.0.32 for GreatSQL编译安装
亲测体验Go语言PGO
本文是对官方 Profile-guided optimization in Go 1.21[1] 的学习与实践.
fliter
2023/12/06
4890
亲测体验Go语言PGO
MySQL8.0源码编译和Clion调试
MySQL 是最为流行的开源关系型数据库之一,有关它的使用、优化和运维处理相关的文章汗牛充栋。我个人也写过《MySQL探秘》和《MySQL死锁》系列文章,详细介绍了诸如 MySQL 内存结构、持久化机制、锁和事务等多方面的知识。不过上述知识大多数都来自《高性能MysQL》、《MySQL技术内幕:InnoDB存储引擎》等书籍以及网上一些优秀博主的文章。
程序员历小冰
2022/06/27
2.4K1
MySQL8.0源码编译和Clion调试
现代CPU性能分析与优化-性能分析方法-编译器优化报告​
如今,软件开发在很大程度上依赖编译器进行性能优化。编译器在加速软件方面扮演着关键角色。大多数开发人员将优化代码的工作留给编译器,只有当他们发现编译器无法完成的优化机会时才会干预。可以说,这是一个好的默认策略。但是,当您追求最佳性能时,它就不太管用了。如果编译器没有执行关键优化,例如向量化循环,怎么办?您将如何知道这一点?幸运的是,所有主流编译器都提供优化报告,我们现在将讨论这些报告。
王很水
2024/08/20
2160
现代CPU性能分析与优化-性能分析方法-编译器优化报告​
Go 编译器优化
《从.go 文本文件到可执行文件》一文中,我们简单描述了 Go 编译器的工作流程。本文将继续深入其中的一些代码优化的工作。
gopher云原生
2022/11/22
8920
Go 编译器优化
现代 C++ 编程与性能优化实践:写出高效、优雅的系统级代码
C++ 是一种充满力量的系统级编程语言,历经数十年仍在不断演进。从 C++98 到 C++20,语言在保持高性能的同时,引入了丰富的现代特性,大大提升了开发效率。
用户11690575
2025/06/06
1020
实战性价比,腾讯Arm云实例评测 - Web 应用
腾讯CVM标准型SR1是腾讯云服务器推出的首款搭载ARM架构处理器的新一代CVM标准型计算实例规格。SR1基于全核一致主频3.0GHz的Ampere Altra处理器,实例核数从1核到64核,并支持1: 2、1: 4等多种处理器与内存配比,相对x86架构实例为用户提供卓越的性价比。
DavidZ
2022/06/15
7.7K4
实战性价比,腾讯Arm云实例评测 - Web 应用
Java Cloud Native 的未来 Graal AOT 编译器
Java 这门语言与生俱来的显著特性就是“一次编译,到处运行”,这种功能得益于 JVM 平台的支持,Java 程序通常通过将其打包为 JAR 或 WAR 包,并依赖 JVM 和 Servlet 容器来运行。其底层运行时 JVM 采用 JIT(即时编译)模式来执行程序代码,JVM 会在运行时进行编译优化和动态执行代码,这通常会导致较高的内存占用。这样的好处是采用 JIT 可以热更新和热部署程序,并且 JVM 可以在运行期间对程序进行动态分析,来实时优化程序以达到最好的性能状态。
一大块芝士
2024/07/23
2960
Java Cloud Native 的未来 Graal AOT 编译器
linux环境编译安装Mysql8.0
本文以BClinux for euler 21.10(redhat/centos可以参考)为例。在本地内网(Linux主机无法连接互联网,能连接公网最好,不能也没关系)编译安装。
炒香菇的书呆子
2024/07/23
8090
CentOS7下源码安装MySQL 8.x
会选择使用源码安装MySQL,想必对MySQL及其他的安装方式已经有了一定的了解,这里就不对周边信息进行过多赘述了,直接开始吧。
端碗吹水
2020/09/23
8720
CentOS7下源码安装MySQL 8.x
CentOS 7上编译安装MySQL 5.5
MySQL服务是一个真正的多线程、多用户的SQL数据库服务,凭借其高性能、高可靠和易于使用的特性,成为服务器领域中最受欢迎的开源数据库系统。为了确保MySQL数据库功能的完整性。可定制性,将采用源代码编译的方式安装MySQL数据库系统。
星哥玩云
2022/08/17
7610
2023年2月8日 Go生态洞察:Profile-Guided Optimization预览
🐯 摘要 嗨,猫头虎博主在此!今天我们将深入探讨2023年2月8日发布的Go语言新特性:Profile-Guided Optimization (PGO)。如果你对Go的性能优化感兴趣,那么本文将是你的不二之选。准备好了吗?让我们一起探索Go的这一新领域吧!
猫头虎
2024/04/08
1060
2023年2月8日 Go生态洞察:Profile-Guided Optimization预览
CentOS Linux 7.5 编译安装 MySQL 8.0.12 及修改密码问题
#cat /etc/RedHat-release CentOS Linux release 7.5.1804 (Core)
星哥玩云
2022/08/17
5780
openEuler、龙蜥Anolis、统信UOS系统下编译GreatSQL二进制包
为了能更好地支持更多操作系统及相关生态,我们决定发布openEuler、龙蜥Anolis、统信UOS三个操作系统下的GreatSQL二进制包。相应的二进制包可以访问gitee.com上的 GreatSQL项目 https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.25-17下载。
GreatSQL社区
2023/08/10
6000
openEuler、龙蜥Anolis、统信UOS系统下编译GreatSQL二进制包
Android对so体积优化的探索与实践
总第513篇 2022年 第030篇 减小应用安装包的体积,对提升用户体验和下载转化率都大有益处。本文将结合美团平台的实践经验,分享 so 体积优化的思路、收益,以及工程实践中的注意事项。本文将先从 so 文件格式讲起,结合文件格式分析哪些内容可以优化,然后再具体讲解每项优化手段以及注意事项,最后介绍相关的工程实践经验。希望能对从事包体积优化的同学有所帮助或启发。 1. 背景 2. so 文件格式分析 3. so 可优化内容分析 4. 优化方案介绍 4.1 精简动态符号表 4.2 移除无用代码 4.3 优
美团技术团队
2022/06/06
2.8K0
Android对so体积优化的探索与实践
相关推荐
Go和C++通用性能优化黑魔法——PGO!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验