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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文介绍了在倚天实例上进行内存优化的调优特性: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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
数据中心 Anolis
性能优化特性之:LSE指令集编译优化
本文介绍了倚天实例上的编译优化特性:LSE,并从优化原理、使用方法进行了详细阐述。
|
7月前
|
监控 Java 编译器
Go语言内存与并发性能综合优化策略
【2月更文挑战第11天】Go语言以其高效的并发处理能力和简洁的内存管理机制成为了现代软件开发中的热门选择。然而,在实际应用中,如何综合优化Go程序的内存使用和并发性能,仍然是一个值得探讨的话题。本文将深入探讨Go语言内存与并发性能的综合优化策略,包括内存布局优化、并发模式设计、资源池化以及性能监控与分析等方面,旨在帮助开发者全面提升Go程序的整体性能。
|
存储 编译器 C语言
性能优化特性之:LTO
本文介绍了倚天实例上的编译优化特性:LTO,并从优化原理、使用方法进行了详细阐述。
|
安全 程序员 编译器
【c++11】c++11特性
【c++11】c++11特性
|
编译器 C++ Anolis
性能优化特性之:PGO
本文介绍了倚天实例上的编译优化特性:PGO,并从优化原理、使用方法进行了详细阐述。
|
Java C++
C++三大特性
C++作为一种强大的面向对象的语言,其语法的复杂性可谓最高,相比于Java有自动内存回收机制,C++里对于堆上的资源需要手动进行管理,但是随着C++智能指针的出现成功的解决了这一问题,但是也正是这样也早就了C++那么难学,但是C++的也有一个很大的优点就是效率极高,所以灵活应用C++提供的新特性将有利于我们的开发效率和程序的运行效率,本文将从C++最基本的三大特性开始介绍C++这门功能强大但又极其复杂的语言。
|
存储 机器学习/深度学习 编译器
【C++】C++11常用特性总结-1
【C++】C++11常用特性总结-1
|
存储 编译器 对象存储
【C++】C++11常用特性总结-2
【C++】C++11常用特性总结--2
|
C# 图形学
C#——特性
C#——特性
74 0
|
缓存 负载均衡 NoSQL
接口性能优化方案及其理论依据
我们现在接口的线上问题主要有三个,第一:启动时有些机器会有短暂的线程池满。第二:并发量上不去,怕服务被打死,不敢调高限流阈值。第三:499超时现象。   今天终于把那天说的全量执行时间延长,从图中可以看到,中午12点发版之后,内存使用率有明显下降,晚上是接口调用高峰,会有上浮,但是总体来看还是下降了。
接口性能优化方案及其理论依据