性能优化特性之:16K原子写

简介: 本文介绍了在倚天实例上进行内存优化的调优特性:16K原子写 的优化原理、使用方法。

优化原理

MySQL InnoDB 的 page size 一般为 16KB,数据校验也是按 16KB 页面来计算的。但操作系统写入磁盘是以 4KB 页进行的,因此在极端场景如掉电,操作系统无法保证 InnoDB 的 16KB 页的原子写入,即 partial write。 为了解决 partial write 问题,MySQL 在将脏数据 flush 到数据文件时,会先将脏数据拷贝到 double write buffer,之后通过 double write buffer 写入到共享表空间,再调用 fsync 刷到数据文件。 因此,数据页面存在双倍的写入,这在实际应用场景可能带来如下问题: 1)云盘场景,额外占用存储带宽,抖动问题变多; 2)传统物理机场景,额外的写入会降低 SSD 的寿命(TBW 为 SSD 的生命周期重要指标之一)。 大致原理图如下:

image.png Double Write 介绍:  https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html 

16k 原子写方案旨在通过文件系统 COW 异地更新的机制,确保 MySQL 16k 页面原子写入,同时对 MySQL 应用无侵入,优化 MySQL 的性能和数据写入量,解决 Double Write 带来的额外带宽占用以及降低 SSD 寿命等问题。

使用方法

1、下载 OpenAnolis 社区 SIG 的特性分支代码,并编译安装。

git clone git@gitee.com:anolis/storage-cloud-kernel.git git checkout feature/atomic-write make anolis_defconfig make -j64 -s sudo make modules_install -j64 -s sudo make install sudo reboot

2、安装 MySQL 和客户端:

sudo yum install mariadb mariadb-server mariadb-devel

3、创建 xfs 数据盘并挂载,用于保存 MySQL 数据库。 (注意需确保 xfsprogs 版本支持 reflink 特性)

sudo mkfs.xfs -m reflink=1 <device> sudo mount <device> <mnt_point> sudo chown -R mysql:mysql <mnt_point>

例如:

sudo mkfs.xfs -m reflink=1 /dev/vdb sudo mount /dev/vdb /var/lib/mysql sudo chown -R mysql:mysql /var/lib/mysql

4、修改 MySQL 配置文件 /etc/my.cnf,使用 direct 写入,并关闭 double write。例如:

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ... innodb_file_per_table innodb_page_size = 16384 innodb_buffer_pool_size = 12288M innodb_use_native_aio = 0 innodb_flush_method = O_DIRECT innodb_doublewrite = 0  # 已支持 16k 原子写,无需 double write
  • 设置 mysql db 目录为原子写目录,如:
sudo chattr +c /var/lib/mysql
  • dmesg 将显示原子写已针对目录开启信息:
[  330.918099] XFS (vdb): atomic write set on dir ino 128

6、启动 mysqld 服务。

sudo systemctl start mariadb

7、下载并编译 sysbench。

git clone https://github.com/akopytov/sysbench.git cd sysbench ./autogen.sh ./configure make -j64 -s sudo make install

8、运行测试。

sudo ./test-mysql.sh




---------------------------------------------------------------------------------------

更多调优信息,请参考:

龙蜥社区:https://openanolis.cn/

KeenTune SIG:https://openanolis.cn/sig/KeenTune

阿里云龙蜥操作系统专区:https://developer.aliyun.com/group/aliyun_linux

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
数据中心 Anolis
性能优化特性之:LSE指令集编译优化
本文介绍了倚天实例上的编译优化特性:LSE,并从优化原理、使用方法进行了详细阐述。
|
Linux Anolis
性能优化特性之:EXT4 Fast Commit
本文介绍了倚天实例上进行IO优化的特性:Fast Commit,并对其优化原理、使用方法进行了详细阐述
|
监控 调度 开发工具
IO神器blktrace使用介绍
## 前言 1. blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。 2. blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。 ## blktrace的原理 一个I/O请求的处理过程,可以梳理为这样一张简单的图: ![](http://image
20428 0
|
固态存储 关系型数据库 MySQL
NVMe SSD原子写
NVMe SSD原子写
1155 0
NVMe SSD原子写
|
关系型数据库 MySQL PostgreSQL
性能优化特性之:code_hugepage - 代码大页
本文介绍了倚天实例上的内存优化特性:代码段大页,并从优化原理、使用方法、性能收益进行详细阐述。
|
存储 监控 关系型数据库
关系型数据库mysql的BLACKHOLE
【6月更文挑战第18天】
412 4
|
存储 关系型数据库 MySQL
带你读《2022龙蜥社区全景白皮书》——5.3.4 跨处理器节点内存访问优化
带你读《2022龙蜥社区全景白皮书》——5.3.4 跨处理器节点内存访问优化
854 88
|
弹性计算 Linux 编译器
CoreBolt——在倚天上基于 Coresight 做 BOLT 优化
CoreBolt 是一种倚天平台的性能优化解决方案。CoreBolt 通过 Coresight 在程序运行时采集程序运行信息,对程序的热代码和冷代码进行区分,并通过 BOLT 对程序进行代码段重排,从而提升程序代码的局部性,减少程序运行过程中由 CPU iCache miss 和 iTLB miss 引发的性能下降,提升程序的整体性能。
1643 6
|
存储 缓存 固态存储
SPDK应用框架
SPDK应用框架