`
丁林.tb
  • 浏览: 797228 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

量化InnoDB group commit的效果

阅读更多

前几天有位开发的同学问了个问题,InnoDB的group commit效果如何?之前说好了回头给看下,结果险些拖过年。

Group commit背景
         InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit)。如果设置为1,每次事务提交都至少需要写一次redolog。这对IOPS冲击严重,尤其是在HDD上,直接成为性能瓶颈。
         Group commit的基本想法是将多个并发线程对redo的fsync操作合并成1个。具体的过程可以参照这篇

Group commit的效果

         其实效果好不好全看具体场景。这里我们先给出一种直观看结果的方法,然后再举例子分析。

1)       数据
         简单表结构
CREATE TABLE `tb` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

并执行(伪码,大家看得懂的)
For(i=1; i<=100; i++)
    insert into tb ($i, 1)

2)       观察脚本
后续我们启不同类似的压力,先给出观察脚本。神器systemtap

cat innodb_group_commit.stp   
/*
   this script is for investigatint the effect of InnoDB group commit
 */
global n_log_write
global n_flush
global n_prev_flush
probe process(“/u01/dingqi.lxb/mysql56/bin/mysqld”).function(“log_write_up_to”)
{
  if ($wait == 92)
    n_log_write += 1;
}
probe process(“/u01/dingqi.lxb/mysql56/bin/mysqld”).function(“fil_flush”)
{
  n_flush= $fil_n_log_flushes;
}

probe timer.s(1)
{
  if (n_log_write)
  {
    printf(“n_write %d n_flush %d\n”, n_log_write, n_flush – n_prev_flush);
    n_prev_flush = n_flush;
    n_log_write = 0;
  }
}

probe begin
{
  println(“Ready”);
}

3)       压力

a)       单线程压力
我们先单线程执行update tb set c=c+1 where id=1次,看输出

可以看到n_write和flush的比例为1:1.
因为单线程就无所谓”group” 了

b)       并发线程压力
启50个客户端线程,每个都单独持续执行 update tb set c=c+1 where id=1


 还是1:1, 原因? InnoDB里的行锁导致每个更新事务都互相阻塞,也就是说在commit阶段是串行的,也没有group。与a的区别仅仅是TPS稍微高了一点。

 c)       并发更新
启动50个线程,线k执行 update tb set c=c+1 where id=k

现在能看出效果了,差不多是3:1.
另外顺便提下, 多线程更新同一行的性能真是太低了。(商品热卖?)

d)       100并发更新

与c类似,启动100个线程,线k执行 update tb set c=c+1 where id=k
差不多是5:1,并发越多就有越大的概率用到组提交。

 

 PS
        细心的同学从上面的脚本中可以看到,变量 fil_n_log_flushes 记录的就是redo 的fsync次数,这个值表示redolog做了多少次sync 。可以从这个命令得到
show global status like ‘Innodb_os_log_fsyncs’;

 

 PS_final
         实际上如果在log_write_up_to入口增加一个变量统计,就能直接从show status里面得到脚本输出的这两个值,观察更方便

 

PS_final_final
         实际单线程压力下,n_write和n_flush并非严格的1:1,但在持续压力下可以近似。比如我们压1万次, n_flush会多出6次。那是后台线程在刷,可以忽略。

 

 PS_final_final
        说个吉祥话吧,祝所有DBA同学们2013年 线上无报警,节假不加班 呀。

1
0
分享到:
评论
6 楼 zjjxxl 2013-08-01  
这里的mysql是定制版本吧,还是自己编译的。

oracle官方版本里没有log_write_up_to等probe吧。

如果要试验怎么编译啊,谢谢。
5 楼 lidayu_up 2013-02-27  
或者说group commit可以提高innodb_flush_log_at_trx_commit=1背景下的性能,我们公司都是innodb_flush_log_at_trx_commit=2
4 楼 lidayu_up 2013-02-27  
比方说我把:innodb_flush_log_at_trx_commit=1,然后用50个并发线程去update不同的行,这个group commit就会起作用吗?是不是group commit只发生在同时commit的时刻?
3 楼 丁林.tb 2013-02-26  
likydba 写道
如果sync_binlog=0,Groupcommit其实影响不大吧

恩,那就无所谓了。 但是有了group commit以后,可以设置为1了,0 毕竟不安全
2 楼 likydba 2013-02-25  
如果sync_binlog=0,Groupcommit其实影响不大吧
1 楼 GaoYusong 2013-02-09  
奇哥春节快乐!过年还在写技术文章,stO

相关推荐

    MySQL事物实现原理之组提交(group commit).pdf

    在MySQL中,事务的实现依赖于其强大的事务日志系统,而组提交(group commit)技术则是提高事务处理性能的关键技术之一。下面将详细解读MySQL事务实现原理之组提交的核心知识点。 首先,了解什么是WAL(Write-Ahead...

    MySQL InnoDB 源码实现分析

    通过对MySQL InnoDB源码实现的深入分析,我们可以看到InnoDB在查询优化、Insert Buffer、Checkpoint以及Group Commit等方面采用了多种高级技术来提高数据库系统的性能和可靠性。理解这些核心机制不仅有助于开发人员...

    InnoDB性能优化参数详解.docx

    6. **innodb_flush_log_at_trx_commit**:这个参数决定事务日志何时被刷入磁盘。设置为1表示每次提交事务都会同步到磁盘,确保强一致性但可能影响性能;设置为0或2则牺牲一致性以提高性能,但可能导致数据丢失。 7....

    MySql Innodb 引擎特性详解

    - `innodb_log_file_size` 和 `innodb_log_files_in_group`:控制重做日志文件的大小和数量,以确保在事务提交时的性能。 - `innodb_flush_log_at_trx_commit`:控制日志刷新频率,2表示每秒刷新一次,这在大多数...

    MySQL Innodb 参数详解与优化实践

    `innodb_flush_log_at_trx_commit` - **描述**:控制事务提交时是否同步写入日志文件,默认值为0。 - **应用场景**:设置为1可增强数据安全性,但可能会降低性能;设置为0则牺牲安全性换取更高性能。 ##### 9. `...

    InnoDB 中文参考手册

    InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 ...

    InnoDB 事务/锁/多版本分析

    - **Group Commit:** 为了提高事务处理的效率,InnoDB引入了Group Commit机制。在MySQL 5.6和MariaDB 5.5.19-rel24及以上版本中,多个事务可以组合在一起进行一次磁盘操作,减少了I/O次数,提高了性能。 ### ...

    InnoDB事务、锁、多版本分析

    另外,Group Commit技术可以提高性能,通过批量提交多个事务,减少磁盘I/O。 接下来是InnoDB的锁机制。InnoDB提供了多种锁类型,如行级锁(记录锁)、表级锁和自增序列锁。锁的等待和死锁检测是通过复杂的算法来...

    XtraDB、InnoDB 内部结构示意图

    innodb_flush_log_at_trx_commit参数控制了InnoDB如何刷新事务日志。通常,InnoDB使用一个后台线程“log thread”在磁盘上通过fsync()命令来刷新日志。文章还提到了Redo日志文件组中文件的数量,通常是2到3个。 9. ...

    InnoDB_Log_Structures

    - `innodb_flush_log_at_trx_commit`:决定日志何时刷新到磁盘。 #### 5. 恢复和性能 InnoDB的重做日志对于数据库的恢复和性能至关重要。在数据库崩溃后,InnoDB可以重放日志来恢复未提交的事务和重做已提交的事务...

    InnoDB性能调节提示

    - **调整`innodb_flush_log_at_trx_commit`**:设置为0表示每秒刷新日志,牺牲部分事务安全性以提高性能,但请注意这可能导致数据丢失。 4. **日志文件和日志缓冲大小**: - 使用较大的日志文件(与缓冲池大小...

    MySQL技术内幕 InnoDB存储引擎.pdf

    最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...

    InnoDB: Hot Backup Manual

    - `innodb_log_files_in_group=…`:每个InnoDB日志文件组中的日志文件数量。 - `innodb_log_file_size=…`:每个InnoDB日志文件的大小。 #### 二、创建备份 本节将详细介绍如何使用ibbackup创建完整的压缩与非...

    MySQL Innodb 索引原理详解

    ### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...

    mysql innodb恢复数据工具.rar

    这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...

    mysql-innodb

    InnoDB支持事务处理,这意味着它可以执行提交(commit)、回滚(rollback)和故障恢复。这种功能使得InnoDB能够在系统崩溃或异常情况后,保证数据的一致性和完整性。 2. **行级锁定**: 与表级锁定相比,InnoDB...

    InnoDB 中文参考手册(CHM)

    事务的回滚(ROLLBACK)和提交(COMMIT)操作确保了数据在异常情况下的安全。 3. **行级锁定** InnoDB实现了行级锁定,相较于页级或表级锁定,这允许更高的并发性能,因为只锁定涉及的特定行,减少了锁定资源的...

Global site tag (gtag.js) - Google Analytics