学堂 学堂 学堂公众号手机端

IO性能瓶颈优化--组提交

lewis 5年前 (2020-01-15) 阅读数 5 #技术
二阶段提交

二阶段提交步骤

1、更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。

2、然后告知执行器执行完成了,随时可以提交事务。执行器生成这个操作的 binlog,并把 binlog 写入磁盘。


3、执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)


组提交

我们知道redo的组提交是mysql自己就默认的,在并发更新场景下,第一个事务写完 redo log buffer 以后,接下来这个 fsync 越晚调用,组员可能越多,节约 IOPS 的效果就越好。

redo的组提交

日志写到 redo log buffer 是很快的,wirte 到 page cache 也差不多,但是持久化到磁盘的速度就慢多了。让更多的事务,同时能够进行fsync就是redo的组提交。

在并发更新场景下,第一个事务写完 redo log buffer 以后,接下来这个 fsync 越晚调用,组员可能越多,节约 IOPS 的效果就越好。


binlog组提交

在执行图 中第 4 步把 binlog fsync 到磁盘时,如果有多个事务的 binlog 已经写完了,也是一起持久化的,这样也可以减少 IOPS 的消耗。不过通常情况下第 3 步执行得会很快,所以 binlog 的 write 和 fsync 间的间隔时间短,导致能集合到一起持久化的 binlog 比较少,因此 binlog 的组提交的效果通常不如 redo log 的效果那么好。


如果你想提升 binlog 组提交的效果,可以通过设置

binlog_group_commit_sync_delay 和

binlog_group_commit_sync_no_delay_count 来实现。

binlog_group_commit_sync_delay 参数,表示延迟多少微秒后才调用 fsync;binlog_group_commit_sync_no_delay_count 参数,表示累积多少次以后才调用 fsync。


WAL 机制优势

主要得益于两个方面:

redo log 和 binlog 都是顺序写,磁盘的顺序写比随机写速度要快;

组提交机制,可以大幅度降低磁盘的 IOPS 消耗。


解决IO性能瓶颈方式

如果你的 MySQL 现在出现了性能瓶颈,而且瓶颈在 IO 上,可以通过哪些方法来提升性能呢?

针对这个问题,可以考虑以下三种方法:

1、设置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 参数,减少 binlog 的写盘次数。这个方法是基于“额外的故意等待”来实现的,因此可能会增加语句的响应时间,但没有丢失数据的风险。

2、将 sync_binlog 设置为大于 1 的值(比较常见是 100~1000)。这样做的风险是,主机掉电时会丢 binlog 日志。

3、将 innodb_flush_log_at_trx_commit 设置为 2。这样做的风险是,主机掉电的时候会丢数据。



版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门