16K原子写

RDS MySQL16K原子写功能通过关闭实例的innodb_doublewrite(InnoDB双写机制)来提升写入效率。本文为您介绍该功能的使用方法以及性能测试结果。

说明

欢迎您加入RDS存储能力交流钉钉群(121770005512),获取更多RDS存储能力的相关信息,您可以在群内进行咨询、交流和反馈。

背景信息

MySQLInnoDB引擎数据的最小读写单位是Page(大小一般为16 KB),但文件系统的IO最小单位一般是4 KB。当数据页写入磁盘时,如果发生断电等极端情况,可能会导致InnoDB中部分数据页未完全写入磁盘。因此,InnoDB引入了双写的机制以来确保数据页的原子性,以防止半写错误。当InnoDB需要刷新脏页时,首先将数据写入双写缓冲区;待该缓冲区满后,刷脏线程需等待上一批次的数据完成写盘才能继续。每次刷新数据页都涉及两次写操作,这增加了磁盘I/O资源的消耗。

对于写入密集型应用,磁盘I/O常成为性能瓶颈,InnoDB双写机制会显著增加磁盘带宽负担,进而影响实例整体性能。

功能简介

RDS MySQL支持全链路的16K原子写,开启16K原子写功能后,可以确保每次数据页写入的原子性,从而安全地关闭InnoDB双写机制。这不仅降低了I/O写入量,还简化了刷脏过程,大幅度降低实例写盘的IOPS及带宽需求,达到提升实例写性能的目的。

开启16K原子写功能后,QPS至少提升40%,详见性能测试

前提条件

  • 数据库引擎及版本:仅支持MySQL 5.78.0实例。

  • 存储类型:仅支持ESSD云盘与高性能云盘。

费用说明

16K原子写功能免费,开启和关闭16K原子写都不会产生额外费用。

注意事项

  • 开启和关闭16K原子写功能时,会导致实例重启,请谨慎操作。

  • 主实例开启16K原子写功能时,无法关闭只读实例的16K原子写功能,避免因性能不一致导致复制延迟。

  • 创建只读实例与备份恢复场景中,16K原子写功能继承原实例配置。

管理16K原子写

重要

为提升实例性能和使用体验,满足开启16K原子写前提条件和以下条件的实例会默认开启16K原子写:

  • 新购实例:2025514日及之后通过RDS控制台购买的实例。

  • 存量倚天版实例:实例未变更过产品类型

存量标准版实例不支持开通16K原子写功能。

支持16K原子写功能的实例可以在控制台上手动开启或关闭该功能

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 基本信息页面,单击16K原子写开关,开启或关闭16K原子写。

性能测试

测试准备

  • 测试资源与方法:本次测试分别在高可用系列高性能云盘实例的通用规格和独享规格上执行数据写入操作,观察实例开启16K原子写功能前后的性能差异。

    产品系列

    存储类型

    实例规格

    规格代码

    CPU和内存

    高可用

    高性能云盘

    通用规格

    mysql.n2.large.2c

    48 GB

    高可用

    高性能云盘

    独享规格

    mysql.x2.large.2c

    48 GB

  • 测试工具安装:本文以CentOS系统安装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
     
  • 测试数据准备: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

    本测试所涉及的参数说明如下。

    参数名

    描述

    tables

    表数量,以30张为例。

    table_size

    每个表的记录行数,以4000万行为例。

    rand-type

    随机数分布类型,以special为例。

    rand-spec-pct

    特定随机数分布中被视为“特殊”值的百分比,以15%为例。

    threads

    并发线程数,以64为例。

    time

    测试的持续时间(单位:秒),以100秒为例。

测试写性能

在测试实例中执行以下命令,对比开启和关闭16K原子写功能的QPS性能。

sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run

测试结果

16K原子写测试结果

  • 48 GB标准版高可用系列通用型RDS MySQL实例的测试结果如下:

    开启16K原子写功能(橙色)后,QPS性能提升48%。

    image

  • 48 GB标准版高可用系列独享型RDS MySQL实例的测试结果如下:

    开启16K原子写功能(橙色)后,QPS性能提升47%。

    image

16K原子写 +Buffer Pool Extension(BPE)测试结果

说明

关于高性能云盘Buffer Pool Extension(BPE)功能的介绍,请参见Buffer Pool Extension(BPE)功能

48 GB标准版高可用系列通用型RDS MySQL实例的测试结果如下:

开启16K原子写与Buffer Pool Extension(BPE)(橙色)功能后,QPS性能提升93%。image

相关文档