我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL45讲之IO性能提升 - flowers

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL45讲之IO性能提升 - flowers

MySQL45讲之IO性能提升 - flowers

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。

前言

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。

binlog 的写入机制

binlog 的写入流程是:

先将日志写入到 binlog cache 中,然后再 write page cache 到磁盘(文件系统向内核申请的一块内存空间,当 MySQL 进程重启时,不影响这块空间),最后 fsync 到磁盘。

每个事务对应的 binlog 是不能拆开的,所以必须一次性保存。每个线程有自己的 binlog cache,通过 binlog_cache_size 参数设置,但是多个线程共享同一个 binlog 文件。如果 binlog cache 存不下,就会存到磁盘中。

binlog 的刷盘策略,即 write 和 fsync 的时机,是由参数 sync_binlog 控制的:

  1. sync_binlog=0的时候,表示每次提交事务都只write,不fsync;

  2. sync_binlog=1的时候,表示每次提交事务都会执行fsync;

  3. sync_binlog=N(N>1)的时候,表示每次提交事务都write,但累积N个事务后才fsync。

一般不会将 sync_binlog 设置为 0,那样可能会丢失大量的日志。为了提高 IO 性能,可能会将 sync_binlog 设置为 100 ~ 1000 的值,这样只会丢失最近的 N 条日志。

redo log 的写入机制

redo log 的写入流程:

先将日志记录在 redo log buffer 中,然后再 write page cache,最后 fsync 到磁盘。并且,有一个后台线程,每隔一段时间就会将 redo log buffer 同步到磁盘。(可能事务未提交,但也同步到磁盘的情况)

redo log 的刷盘策略,由 InnoDB 提供了 innodb_flush_log_at_trx_commit 参数控制,它有三种可能取值:

  1. 设置为0的时候,表示每次事务提交时都只是把redo log留在redo log buffer中;

  2. 设置为1的时候,表示每次事务提交时都将redo log直接持久化到磁盘;

  3. 设置为2的时候,表示每次事务提交时都只是把redo log写到page cache。

注意,如果把 innodb_flush_log_at_trx_commit 设置为 1,那么 redo log 在两阶段提交的第一个 prepare 阶段就会刷盘,第二个 commit 阶段只会 write page cache。

双“1”配置

MySQL 的双“1”配置指的就是 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1 。即一次事务提交,需要等待两次 fsync。

组提交(group commit)

这时候,你可能有一个疑问,这意味着我从MySQL看到的TPS是每秒两万的话,每秒就会写四万次磁盘。但是,我用工具测试出来,磁盘能力也就两万左右,怎么能实现两万的TPS?

解释这个问题,就要用到组提交 group commit 机制了。

这里,我需要先和你介绍日志逻辑序列号 LSN(log sequence number)的概念。LSN是单调递增的,用来对应redo log的一个个写入点。每次写入长度为length的redo log, LSN的值就会加上length。

组提交举例:

对于多个并发事务,他们都写完了 redo log buffer,准备持久化到磁盘,那么会从这些事务中选择一个 leader,然后取他们中最大的 LSN,让这个 leader 带着最大的 LSN 取写盘,这样小于 LSN 的日志就都写到了磁盘,也就完成了一个组提交,其他事务直接返回即可。

所以,一次组提交中事务越多,可以节省的 IOPS 也就越多。

MySQL 在进行两阶段提交时,redo log 和 binlog 都是可以使用组提交的。此外,为了提高 binlog 使用组提交的效果,可以设置 binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count 来实现:

  1. binlog_group_commit_sync_delay参数,表示延迟多少微秒后才调用fsync;

  2. binlog_group_commit_sync_no_delay_count参数,表示累积多少次以后才调用fsync。

注意,如果 sync_binlog 设置为 0,那么 binlog_group_commit_sync_delay 会进行延迟,但不会 fsync。

MySQL的IO性能优化

综合所述,可以通过以下方法进行优化:

  1. 将 sync_binlog 设置为大于 1 的(一般为 100 ~ 1000),这样可能会丢失最近的 N 条日志

  2. 将 innodb_flush_log_at_trx_commit 设置为 2,主机断电会导致丢失数据

  3. 设置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count参数,提升组优化效果,减少写盘次数,但是会增加事务响应时间,也可能有丢失日志的风险

参考

  • [1] MySQL是怎么保证数据不丢的

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL45讲之IO性能提升 - flowers

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL45讲之IO性能提升 - flowers

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。 前言本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。
MySQL45讲之IO性能提升 - flowers
2015-04-27

MySQL45讲之主备数据一致性 - flowers

本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。 前言本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。binlog三种格式1. state
MySQL45讲之主备数据一致性 - flowers
2019-06-13

MySQL45讲之生产环境下的性能问题 - flowers

本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。 前言本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。1. 短连接风暴当由于大量短连接造成数据库性能低时,首先考虑一些无损安全的解决方案,如果是必须立刻提升一些数据库性能,那么可以考虑下
MySQL45讲之生产环境下的性能问题 - flowers
2017-08-20

阿里云服务器升级IO,提升服务器性能

什么是IOIO(Input/Output)是指计算机与外部设备之间的数据传输。在服务器中,IO通常指硬盘的读写速度。IO速度越快,服务器的性能就越好。为什么要升级IO随着业务的发展,服务器的负载也会逐渐增加。如果服务器的IO速度跟不上,就会导致服务器响应变慢,甚至出现宕机等问题。因此,升级IO是提升服务器性能的重要手段。如何升级IO阿里云服务器提供了多种升级IO的方式:更换云盘类型:阿里云提供了多种云盘类型...
2023-10-27

python 性能提升之 并行map

前段时间进行单一目录下10万张图片发送,效果很差,数据积压原来越多。性能问题提上议程。采用多线程 多进程 感觉比较繁琐,网上有介绍 map的并行处理的,使用后性能提高明细。网上介绍map如下介绍:MapMap是一个很棒的小功能,同时它也是P
2023-01-31

Python性能提升之延迟初始化

所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。构造一个延迟计算属性的主要目的是为了提升性能 property 在切入正题之前,我们了解下prope
2022-06-04

Django 性能优化:提升网站速度之道

Django 作为一种高性能 Web 框架,通过优化代码,可以显著提升网站速度。本文将深入探讨 Django 性能优化技巧,助您打造更快速、更响应的 Web 应用程序。
Django 性能优化:提升网站速度之道
2024-02-15

Redis性能大幅提升之Batch批量读写详解

前言 本文主要介绍的是关于Redis性能提升之Batch批量读写的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 提示:本文针对的是StackExchange.Redis 一、问题呈现 前段时间在开发的时候,遇到了redis批量读
2022-06-04

Golang函数性能优化之提升函数清晰度

为提升函数清晰度,优化 go 函数性能,应遵循以下原则:局部变量在需要使用时声明,最小化变量生存范围。避免使用 interface{} 参数类型,使用具体类型以减少类型检查开销。减少循环嵌套深度,使用 for 循环替代 while 循环。避
Golang函数性能优化之提升函数清晰度
2024-04-17

PHP接口性能优化之SQL注入防御与性能提升(PHP接口中如何同时防御SQL注入并提升性能?)

PHP接口优化指南涵盖了如何防止SQL注入攻击和提升性能。通过参数化查询和数据验证可防御注入。为了提高性能,可缓存查询结果、优化数据库查询、减少数据库连接、优化服务器配置、使用CDN和异步编程。此外,持续监控和优化至关重要。本文提供了针对PHP接口性能优化的一系列实用策略。
PHP接口性能优化之SQL注入防御与性能提升(PHP接口中如何同时防御SQL注入并提升性能?)
2024-04-02

Node.js Streams最佳实践:揭秘性能优化和可靠性提升之道

了解Node.js Streams最佳实践是提升应用程序性能和可靠性的关键。本文将分享一些实用的技巧和示例,帮助你优化Node.js Streams的应用。
Node.js Streams最佳实践:揭秘性能优化和可靠性提升之道
2024-02-07

Python 性能之道:掌握优化技巧,提升程序效率

Python 性能优化之道:秘诀揭秘,让程序飞驰
Python 性能之道:掌握优化技巧,提升程序效率
2024-02-15

速度之王!提升操作系统性能调优的 10 个秘诀

提升您的操作系统性能,释放系统潜能!本文提供了 10 个实用的调优秘诀,帮助您优化系统,提升响应速度和整体效率。
速度之王!提升操作系统性能调优的 10 个秘诀
2024-02-29

服务器管理的智者之石:炼化你的服务器,提升性能

服务器管理的炼金术:提升服务器性能的秘诀
服务器管理的智者之石:炼化你的服务器,提升性能
2024-03-04

编程热搜

目录