量化InnoDB group commit的效果

标签: MySQL优化设计 group commit | 发表时间:2013-03-01 05:17 | 作者:OurMySQL
出处:http://ourmysql.com

前几天有位开发的同学问了个问题,InnoDB的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= 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年 线上无报警,节假不加班 呀。

相关文章

标签: ,

相关 [量化 innodb group] 推荐:

量化InnoDB group commit的效果

- - OurMySQL
前几天有位开发的同学问了个问题,InnoDB的group commit效果如何. 之前说好了回头给看下,结果险些拖过年. Group commit 背景.         InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit). 如果设置为1,每次事务提交都至少需要写一次redolog.

kafka consumer group offset

- - 开源软件 - ITeye博客
     kafka0.9及以前版本kafka offset 保存在zookeeper, 因频繁读写zookeeper性能不高;从0.10开始,主题分区offset存储于kafka独立主题中.     管理监控kafka主题及分区offset至关重要,原网上很开源流行工具KafkaOffsetMonitor、kafka-manager,旧版offset保存于zookeeper,kafka consumer无相应API,从kafka0.10.1.1以后提供相应API读取主题分区offset(也可以调用KafkaClient API,kafka管理API由scala语言编写).

solr中facet、group查询

- - 编程语言 - ITeye博客
项目(评论)中使用solr查询的时候,有个场景需求:. 1、获取某个商品下评论的级别数量统计(比如该商品下一到五颗星的评论数量各有多少);. 最终经过讨论,使用了solr中的group和facet完成. 先说下solr中保存的文档数据结构,如下:. .

Mysql InnoDB锁

- - 数据库 - ITeye博客
抄自:http://www.cnblogs.com/qq78292959/archive/2013/01/30/2882745.html. Mysql常用存储引擎的锁机制. MyISAM和MEMORY采用表级锁(table-level locking). BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁.

Mapreduce实例-分组排重(group by distinct)

- - CSDN博客云计算推荐文章
需要实现以下几个类,代码太多,列了下主要代码,可根据排重数据的特征判读是否需要添加combiner来提速. job.setPartitionerClass(MyPartitioner.class); map略. combiner(根据需要添加) reduce中的实现:. 作者:liuzhoulong 发表于2013-9-5 22:17:26 原文链接.

Lucene5学习之Group分组统计

- - ITeye博客
        Group即分组,类似SQL里的group by功能,Lucene中分组是通过内置的几种Collector结果集收集器实现的,有关group的结果集收集器都在org.apache.lucene.search.grouping包及其子包下,.  包含group关键字的Collector都是有关Group分组的结果收集器,如果你只需要统计如下这些分组信息:.

Hive高级查询(group by、 order by、 join等)

- - CSDN博客推荐文章
所有值不全为NULL时,加1操作 count(1). 不管有没有值,只要有这条记录,值就加1 count(col) col列里面的值为null,值不会加1,这个列里面的值不为NULL,才加1. sum(可转成数字的值) 返回bigint. avg(可转成数字的值)返回double. distinct不同值个数.

关于Elasticsearch里面聚合group的坑

- - ITeye博客
原来知道Elasticsearch在分组聚合时有一些坑但没有细究,今天又看了遍顺便做个笔记和大家分享一下. 我们都知道Elasticsearch是一个分布式的搜索引擎,每个索引都可以有多个分片,用来将一份大索引的数据切分成多个小的物理索引,解决单个索引数据量过大导致的性能问题,另外每个shard还可以配置多个副本,来保证高可靠以及更好的抗并发的能力.

Mysql-innodb-B+索引

- - 掘金后端
这是读书笔记,Mysql,innodb系列一共3篇. Mysql-innodb-B+索引(本篇). Mysql-innodb-锁(预计20200523). Mysql-innodb-事务预计20200530). CREATE TABLE `aid_***_detail` ( //省略所有字段 PRIMARY KEY (`id`), KEY `range_idx` (`range_id`,`is_delete`,`range_detail_num`,`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4复制代码.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.