如果您希望提升磁盘IO效率和系统的响应速度,可以使用RDS MySQL通用云盘的IO加速功能,该功能可以帮助扩展缓存池的大小,实现缓存加速,提升RDS实例的整体读写性能。本文介绍IO加速功能的技术原理、使用方法和性能测试详情等信息。
背景
将数据从磁盘读取到内存,或将内存数据写入磁盘是数据库系统常见的IO操作。相比内存操作,磁盘IO操作运行速度相对较慢,需消耗较多的时间。当出现大规模数据读写或频繁数据读写请求时,IO操作可能成为系统瓶颈。
因此,阿里云RDS产品推出新的存储类型——通用云盘。在兼容ESSD云盘所有特性的基础上,通用云盘采用三级存储架构对不同类型的数据和缓存进行分级管理和读写,并且引入IO突发和IO加速功能,提升了RDS实例的IO性能。
IO加速功能介绍
功能简介
缓存池(Buffer Pool)作为一个内存区域,用于缓存磁盘数据。当一个数据块需要被从磁盘读取或被写入磁盘时,系统会先从缓存池中查找数据块:
若存在,则直接从缓存池中读写数据。
若不存在,则会从磁盘读写数据,并存储到缓存池。
基于此读写逻辑,缓存池能够有效减少磁盘IO操作,提升实例的IO性能。但缓存池的大小受系统内存大小的限制,当内存不足时,缓存池大小受限,从而影响IO性能。
RDS MySQL的IO加速功能引入缓存池拓展(Buffer Pool Extension)的能力,帮助扩展缓存池的大小,并结合RDS引擎内核能力,从技术上提升RDS MySQL的整体读写性能,让实例在一定时间内执行更多的读写命令,提高磁盘IO效率和系统的响应速度,实现缓存加速。
功能优势
引入IO加速功能的缓存池拓展后,RDS MySQL的存储结构分为三个层次,能够针对不同的数据存储场景和诉求,充分利用阿里云底座的各种存储介质,实现实例的IO性能提升:
提升读写性能,缩短SQL执行耗时
缓存池拓展通过缓存数据读取操作,大幅提升数据页的访问速度,缩短SQL执行时间。
缓存池拓展大幅降低访问实例通用云盘中数据文件的频率,降低通用云盘带宽。
提升实例的稳定性
缓存池拓展所在的磁盘比通用云盘延迟更低。同时,大幅降低通用云盘IO抖动对数据库运行的影响,提升稳定性。
在IO加速解决方案体验馆中,通过构建真实的RDS资源,可以直观看到开启IO加速和不开启IO加速的实时压测情况,且功能免费。详情请参见RDS通用云盘IO加速(BPE)性能&价格力观测。
价值收益
RDS MySQL实例开启IO加速功能后,目前无需支付任何额外费用,业务不需要做任何改动。
您在无任何成本变化和业务改动的情况下,就可以获得实例IO性能的大幅度提升。以8核16 GB高可用系列通用型的RDS MySQL实例为例,开启IO加速功能后,可获得QPS读写性能提升。详情请参见性能测试。
技术原理
通用云盘的IO加速功能利用了缓存池拓展技术,在不提升成本的情况下,将ESSD形态的性能进行衍生。基于冷热数据分离的思想,通过扩展InnoDB的缓存池(Buffer Pool),将数据页缓存到Buffer Pool Extension中,将温数据存放在Buffer Pool Extension中,使得InnoDB可以灵活使用多种存储介质,从而获得QPS性能提升。
技术架构
缓存池拓展的部署架构如下图所示。
缓存池拓展选用多种高速磁盘作为缓存介质,介于内存和通用云盘之间。高速磁盘相比于通用云盘,IO延迟更低,性能更加优异。
高速磁盘仅用于存放缓存。
数据文件、Binlog文件、Redo文件等存放于通用云盘上。
通过扩展InnoDB Buffer Pool,将缓存池上的数据页缓存到缓存池扩展中,从而InnoDB可以灵活使用多种缓存介质。
实现原理
开启IO加速功能后,实例的数据页会被缓存在高速磁盘的缓存池拓展上。
缓存池拓展上存放的数据页均为干净页,与通用云盘中数据文件的数据保持一致。
一次数据页读取的过程如下:
客户端发起读取数据页的请求。
请求进入内存的缓存池(Buffer Pool)中查找指定的数据页:
如果在缓存池中找到数据页,则将结果返回给客户端侧,查询和读取结束。
如果在缓存池中未找到数据页,则执行步骤3。
请求进入高速磁盘的缓存池拓展中查找指定数据页:
如果在缓存池拓展中找到数据页,则将数据页返回给缓存池,然后将结果返回给客户端侧,查询和读取结束。
如果在缓存池拓展中未找到数据页,则执行步骤4。
请求进入通用云盘的数据表文件中查找指定数据页。找到数据页后返回给缓存池,再将结果返回给客户端侧。
查询和读取请求结束。
适用范围
引擎:RDS MySQL
版本:大于或等于MySQL 8.0 20230914
产品系列:高可用系列、集群系列
产品类型:标准版
规格族:通用型
地域和可用区(仅做参考,实际请以控制台为准):
地域
可用区
西南1(成都)
可用区B
华北2(北京)
可用区I
华东2(上海)
可用区M
可用区N
华东1(杭州)
可用区J
说明在售卖页面开启IO加速功能后,可在主可用区及网络处查看是否支持。
费用
RDS MySQL通用型规格的通用云盘IO加速功能免费。
注意事项
RDS MySQL通用型规格的IO加速功能免费。
缓存池拓展中的数据丢失与否不影响实例的业务数据(业务持久化数据存放于数据盘),也不影响实例的正常使用。
开启IO加速功能会占用一定内存(buffer_pool_size的4%)。因此,默认的buffer_pool_size会自动下调4%,后续如需修改buffer_pool_size,请根据内存使用率指标合理调整。
开启或关闭IO加速功能后,实例约有30秒不可用,建议在业务低峰期执行功能的开启和关闭操作。
开启IO加速功能后,实例性能会有明显提升,实例规格越大,提升效果越明显。例如,8核16 GB标准版高可用系列通用型RDS MySQL实例性能可提升103%。
缓存池能够有效减少磁盘IO操作,提升实例的IO性能。但缓存池的大小受系统内存大小的限制,当内存不足时,缓存池大小受限,从而影响IO性能。
使用IO加速功能
开启IO加速
购买新实例时开启IO加速
您可以在购买实例时,选择满足通用云盘IO加速功能的参数后,开启IO加速功能:
满足通用云盘IO加速功能的已有实例开启IO加速
访问实例列表,在上方选择地域,然后单击目标实例ID。
在基本信息区域,单击存储类型右侧的通用云盘开关设置,在弹出的对话框中,开启IO加速开关。
关闭IO加速
访问实例列表,在上方选择地域,然后单击目标实例ID。
在基本信息区域,单击存储类型右侧的通用云盘开关设置,在弹出的对话框中,关闭IO加速开关。
性能测试
测试准备
测试方法:向同一规格实例执行数据读写操作,对比开启IO加速功能前后的QPS性能。
测试数据量:300 GB
测试工具:Sysbench(详情请参见Sysbench官方文档)
说明请提前开通ECS实例,本文测试工具安装在ECS上。
测试所用实例:分别准备一个4核8 GB和一个8核16 GB的高可用系列通用型RDS MySQL实例,并开启IO加速功能。
系列
规格代码
CPU和内存
高可用系列
mysql.n2.large.xc
4核8 GB
高可用系列
mysql.n2.xlarge.xc
8核16 GB
测试方法
本文以CentOS系统为例进行性能测试,如果需要安装到其他操作系统测试,请参见Sysbench官方文档。
安装Sysbench
执行以下命令完成Sysbench的安装。
git clone https://github.com/akopytov/sysbench.git
cd sysbench
git checkout 0.5
yum -y install make automake libtool pkgconfig libaio-devel
yum -y install mariadb-devel
./autogen.sh
./configure
make -j
make install
测试实例QPS性能
参数说明
本测试所涉及的参数说明如下:
参数名 | 描述 |
--tables | 表数量 |
--table_size | 每个表的记录行数 |
--rand-type | 随机数分布类型 |
--rand-spec-pct | 对特定随机数分布来说被视为“特殊”值的百分比 |
--threads | 并发线程数 |
--time | 测试的持续时间(秒) |
测试读性能
准备数据:执行以下命令,在系统中准备300 GB数据量(30张数据表,每张表4000万行)。
sysbench oltp_read_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare
测试读性能:执行以下命令测试实例的读性能。
sysbench oltp_read_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
测试写性能
准备数据:执行以下命令,在系统中准备300 GB数据量(30张数据表,每张表4000万行)。
sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare
测试读性能:执行以下命令测试实例的写性能。
sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
测试读写性能
准备数据:执行以下命令,在系统中准备300 GB数据量(30张数据表,每张表4000万行)。
sysbench oltp_read_write --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare
测试读写性能:执行以下命令测试实例的读写性能。
sysbench oltp_read_write --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
测试结果
4核8 GB标准版高可用系列通用型RDS MySQL实例的测试结果如下:
读性能:开启IO加速前后,QPS性能基本持平。
写性能:开启IO加速后,QPS性能提升30%。
读写性能:开启IO加速后,QPS性能提升26%。
8核16 GB标准版高可用系列通用型RDS MySQL实例的测试结果如下:
读性能:开启IO加速后,QPS性能提升80%。
写性能:开启IO加速后,QPS性能提升33%。
读写性能:开启IO加速后,QPS性能提升103%。