mysql group commit_量化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次,看输出

r1.jpg

可以看到n_write和flush的比例为1:1.

因为单线程就无所谓”group” 了

b)       并发线程压力

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

r21.jpg

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

c)       并发更新

启动50个线程,线k执行 update tb set c=c+1 where id=k

r3.jpg

现在能看出效果了,差不多是3:1.

另外顺便提下, 多线程更新同一行的性能真是太低了。(商品热卖?)

d)       100并发更新

r4.jpg

与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年 线上无报警,节假不加班 呀。

觉得文章有用?立即:

和朋友一起 共学习 共进步!

猜想失败,您看看下面的文章有用吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值