编译优化高性能版本

最近更新时间:2024-10-12 10:54:31

我的收藏
TDSQL-C MySQL 版的 TXSQL 内核支持编译优化高性能版本,可以在保持原有兼容性、不更改内核内部实现逻辑的前提下,借助动态编译器优化手段考虑用户可能的输入行为,使得数据库内核在业务通用场景下表现出更强的性能、同时降低其使用功耗。本文为您介绍 TDSQL-C MySQL 版的编译优化高性能版本。

支持版本

内核版本 TDSQL-C MySQL 版5.7 2.1.11及以上。
内核版本 TDSQL-C MySQL 版8.0 3.1.12及以上。
说明:
编译优化高性能版本当前为灰度发布中,如需提前体验,请在满足以上数据库内核版本的前提下 提交工单 申请使用。

背景

随着现代 CPU 内部实现的日益复杂,云数据库默认的编译、配置和运行方法很难充分发挥 CPU 的性能潜力,导致大量 CPU 周期空转。这种现象在规模效应叠加的情况下,不仅造成硬件资源的浪费,而且还会浪费大量的功耗。因此,需要对云数据库进行优化,以最大限度地发挥 CPU 的性能潜力,减少 CPU 周期的空转,提高硬件资源的利用率,并降低功耗的浪费。
TDSQL-C MySQL 版在不更改数据库内核业务逻辑代码前提下,借助动态编译器优化手段,以最小的代价完成了内核性能提升和功耗减少。通过收集云数据库在典型/真实业务场景下的行为和性能消耗数据,解决默认编译方式对业务行为无感知的问题;分析数据库运行时的行为特征,结合 CPU 微架构的特点,利用编译优化技术使得优化之后的版本对 CPU 微架构更友好,可充分发挥 CPU 的性能潜力;通过大量的场景测试以保证优化效果在各种条件下不劣化。
通过以上技术手段,此版本实现了如下优化:
1. 基于数据库运行行为数据实现反馈优化,提升函数内联/函数重排/基本库重排的优化能力,从而大幅降低数据库 CPU ICache/ITLB 失效,提升性能。
2. 通过“链接时优化技术”增加编译优化视野,从单文件单函数扩展到跨文件/全二进制文件范围,可极大提升内联的优化空间,降低指令数。
3. 在实践中摸索出一套高效验证和分析的方法,确保效果接近理论极限和保证在各种场景下不劣化。


什么是编译优化

编译优化是指在编译代码时,通过对代码进行优化和调整编译参数,以提高程序的执行效率和性能的过程。

优化原理

TDSQL-C MySQL 版的编译优化高性能版本使用 PGO(profile guided optimization) 技术进行优化,PGO 技术能够解决传统编译器在执行优化时,只基于静态代码信息,而不去考虑用户可能的输入,从而无法对代码进行有效优化的问题。
PGO 技术主要分为以下三个阶段:
1. instrument:在 instrument 阶段,先对应用做一次编译,在此编译中,编译器会向代码中插入指令,以便下一阶段可以收集数据。这些指令分为三种类型,分别用于统计每个函数被执行了多少次、每个分支被执行了多少次(例如 if-else 的场景)以及某些变量的值(主要用于 switch-case 的场景)。
2. train:在 train 阶段,用户需要使用最常用的输入来运行上一阶段编译生成后的应用。由于上一阶段已经做好了收集数据的准备,所以在经过 train 阶段之后,该应用最常见的使用场景对应的数据就会被收集下来。
3. optimization:在 optimization 阶段中,编译器会利用上一阶段收集到的数据,对应用进行重新编译。由于上一阶段的数据来自于用户输入的最常见的用户场景,所以最后优化得到的结果就能在该场景下有更好的优化。
通过以上三个阶段的优化,TDSQL-C MySQL 版的编译优化高性能版本就能更好地适应用户的需求,提高应用的性能和效率。

性能测试

测试场景
混合读写(point select)测试场景,主要测试数据库在同时进行读写操作时的性能表现,可以帮助评估数据库在实际应用场景下的性能表现,包括并发读写操作的处理能力、响应时间、吞吐量等指标。
测试结果

规格
并发
单表数据量(table_size)
表总数(tables)
QPS
使用编译优化版本
提升百分比
2核16GB
64
800000
150
29207
27%
4核16GB
256
800000
300
65562
27%
4核32GB
256
800000
300
78973
27%
8核32GB
256
800000
300
139845
28%
8核64GB
256
800000
450
154894
28%
16核64GB
256
800000
450
249954
29%
16核96GB
256
800000
600
238061
29%
16核128GB
512
5000000
300
253848
29%
32核128GB
512
5000000
300
399647
30%
32核256GB
512
5000000
400
402105
30%
64核256GB
512
6000000
450
596706
31%