这个问题是来自一位朋友@春波,我通过pstack最终确认问题,涉及到两个参数的设置,我将从源码进行解释,如果有误还请见谅。


一、问题展示

1、简单插入需要1秒

语句截图如下:

耗时截图如下:

2、profile展示

实际上这里的query end是一个非常有用的信息,基本确认是在order_commit函数上的等待。

二、问题初次分析

在我遇到的案例中有大事物造成的小事物commit慢的情况,且状态也是query end,但是这里问题显然不太一样,如果是大事物造成的会是偶尔出现commit慢的情况而这里是稳定出现等待1秒的情况。但是我还是要朋友采集了binlog的大事物信息使用我的一个工具如下:

小工具可以分析binlog 的一些信息比如:
1、是否有长期未提交的事物
2、是否有大事物
3、每个表生成了多少日志
4、生成速度。
使用:
./infobin  mysql-bin.001793 20 2000000 10 -t >log1793.log第一个20 是分片数量
第二个2000000 是大于2M左右的事物定义为大事物
第三个10 是大于10秒未提交的事物定义为长期未提交的事物
下载地址:
http://pan.baidu.com/s/1jHIWUN0只能用于binlog 不能用于relaylog。最好将binlog拷贝其他机器执行,不要在生产服务器跑
最好是5.6 5.7 row格式binlog

这个工具是我用C写的不依赖其他工具解析binlog获取有用信息的工具,也很多朋友在用。占时没有开源,其实也很简单就是分析binlog的event来获取有用信息。
得到的简化结果如下:

-------------Now begin--------------
Check Mysql Version is:5.7.19-log
Check Mysql binlog format ver is:V4
Warning:Check This binlog is not closed!
Check This binlog total size:87546667(bytes)
Note:load data infile not check!
-------------Total now--------------
Trx total[counts]:42771
Event total[counts]:251792
Max trx event size:9268(bytes) Pos:78378238[0X4ABF4FE]
Avg binlog size(/sec):16745.729(bytes)[16.353(kb)]
Avg binlog size(/min):1004743.688(bytes)[981.195(kb)]
...
--Large than 2000000(bytes) trx:
(1)Trx_size:54586527(bytes)[53307.156(kb)] trx_begin_p:359790[0X57D6E] trx_end_p:54946317[0X3466A0D]
Total large trx count size(kb):#53307.156(kb)
....
---(79)Current Table:froad_cbank_anhui.cb_sms_log::Insert:binlog size(824224(Bytes)) times(3135)Update:binlog size(2046042(Bytes)) times(3841)Delete:binlog size(0(Bytes)) times(0)Total:binlog size(2870266(Bytes)) times(6976)
---(80)Current Table:test.2018products::Insert:binlog size(54586359(Bytes)) times(6647)Update:binlog size(0(Bytes)) times(0)Delete:binlog size(0(Bytes)) times(0)Total:binlog size(54586359(Bytes)) times(6647)
---Total binlog dml event size:73212228(Bytes) times(65090)

实际上我们很容易看到binlog整个才80M左右确实包含一个大事物如下,大约占用了50M多

--Large than 2000000(bytes) trx:
(1)Trx_size:54586527(bytes)[53307.156(kb)] trx_begin_p:359790[0X57D6E] trx_end_p:54946317[0X3466A0D]
Total large trx count size(kb):#53307.156(kb)

但是大事物只会在提交的那一刻影响其他事物的提交且状态为query end参考我早期的一篇文章
http://blog.itpub.net/7728585/viewspace-2133674/

我们先排除大事物导致的的问题。那么到底是什么问题呢,有朋友说可能是半同步,但是不使用半同步的情况下也一样。且我觉得半同步的导致慢的状态应该不是query end 占时没有测试。

三、确认问题

没有办法只能使用pstack进行分析,幸运的是这个问题确实简单如下的pstack栈帧:

显然我的猜测没有问题确实是ordered_commit上出的问题,直接打开源码找到如下:

/* Shall introduce a delay. */stage_manager.wait_count_or_timeout(opt_binlog_group_commit_sync_no_delay_count,opt_binlog_group_commit_sync_delay,Stage_manager::SYNC_STAGE);

这段代码位于flush阶段之后 sync阶段之前,目的在于通过人为的设置delay来加大整个group commit组的事物数量,从而减少进行磁盘刷盘sync的次数。这块代码虽然以前看过但是没用过这两个参数也就直接跳过了。

四、stage_manager.wait_count_or_timeout函数分析和参数分析

这个函数还是非常简单如下逻辑 看注释即可:

void Stage_manager::wait_count_or_timeout(ulong count, ulong usec, StageID stage)
{ulong to_wait=DBUG_EVALUATE_IF("bgc_set_infinite_delay", LONG_MAX, usec);/*For testing purposes while waiting for inifinityto arrive, we keep checking the queue size at regular,small intervals. Otherwise, waiting 0.1 * infiniteis too long.*/ulong delta=DBUG_EVALUATE_IF("bgc_set_infinite_delay", 100000, //此处将等待时间分割 将使用 max<ulong>(1, (to_wait * 0.1)));  //binlog_group_commit_sync_delay*0.1 和 1之间的 大的那个值作为时间分割 (单位 1/1000000 秒)//binlog_group_commit_sync_delay是 (1000000)1秒则时间分割为0.1s(100000)while (to_wait > 0 && (count == 0 || static_cast<ulong>(m_queue[stage].get_size()) < count)) //进行主体循环退出条件为 1、binlog_group_commit_sync_delay设置的时间消耗完{                                                                                             //2本组事物数量>binlog_group_commit_sync_no_delay_count my_sleep(delta);//每次休眠delta时间如果是1秒则每次休眠0.1秒to_wait -= delta;//进行总时间-delta 时间 }
}

从源码我们分析一下参数binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count的含义:

  • binlog_group_commit_sync_delay:通过人为的设置delay来加大整个group commit组的事物数量,从而减少进行磁盘刷盘sync的次数,但是受到binlog_group_commit_sync_no_delay_count的限制,单位1/1000000秒。最大值1000000也就是1秒
  • binlog_group_commit_sync_no_delay_count:如果delay的时间内如果group commit中的事物数量达到了这个设置就直接跳出等待,而不需要等待binlog_group_commit_sync_delay的时间,单位group commit中事物的数量。

举个列子比如我binlog_group_commit_sync_delay设置为10,binlog_group_commit_sync_no_delay_count设置为10,整个group commit将在这里等待,达到2个条件中的1个将会退出等待:

  • 等待达到了1/100000 秒
  • group commit中事物数量达到了10

四、问题库设置

最后叫朋友查看了他们库的设置如下:

居然binlog_group_commit_sync_delay设置为了最大值1000000也就是1秒,这也就解释了为什么简单的insert都会等待1秒了,且状态为query end。

五、总结

  • 整个问题的排除最终还是依赖的pstack,这也再一次体现了它的重要性。栈帧是不会骗人的只有不懂的
  • 要对query end代表的什么比较清楚
  • 至此我知道了2种query end(或者显示commit为starting)状态下小事物提交慢的可能
    1、某个大事物提交引起偶尔的提交慢

2、binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count 设置不正确引起提交慢

这个问题是来自一位朋友@春波,我通过pstack最终确认问题,涉及到两个参数的设置,我将从源码进行解释,如果有误还请见谅。


一、问题展示

1、简单插入需要1秒

语句截图如下:

耗时截图如下:

2、profile展示

实际上这里的query end是一个非常有用的信息,基本确认是在order_commit函数上的等待。

二、问题初次分析

在我遇到的案例中有大事物造成的小事物commit慢的情况,且状态也是query end,但是这里问题显然不太一样,如果是大事物造成的会是偶尔出现commit慢的情况而这里是稳定出现等待1秒的情况。但是我还是要朋友采集了binlog的大事物信息使用我的一个工具如下:

小工具可以分析binlog 的一些信息比如:
1、是否有长期未提交的事物
2、是否有大事物
3、每个表生成了多少日志
4、生成速度。
使用:
./infobin  mysql-bin.001793 20 2000000 10 -t >log1793.log第一个20 是分片数量
第二个2000000 是大于2M左右的事物定义为大事物
第三个10 是大于10秒未提交的事物定义为长期未提交的事物
下载地址:
http://pan.baidu.com/s/1jHIWUN0只能用于binlog 不能用于relaylog。最好将binlog拷贝其他机器执行,不要在生产服务器跑
最好是5.6 5.7 row格式binlog

这个工具是我用C写的不依赖其他工具解析binlog获取有用信息的工具,也很多朋友在用。占时没有开源,其实也很简单就是分析binlog的event来获取有用信息。
得到的简化结果如下:

-------------Now begin--------------
Check Mysql Version is:5.7.19-log
Check Mysql binlog format ver is:V4
Warning:Check This binlog is not closed!
Check This binlog total size:87546667(bytes)
Note:load data infile not check!
-------------Total now--------------
Trx total[counts]:42771
Event total[counts]:251792
Max trx event size:9268(bytes) Pos:78378238[0X4ABF4FE]
Avg binlog size(/sec):16745.729(bytes)[16.353(kb)]
Avg binlog size(/min):1004743.688(bytes)[981.195(kb)]
...
--Large than 2000000(bytes) trx:
(1)Trx_size:54586527(bytes)[53307.156(kb)] trx_begin_p:359790[0X57D6E] trx_end_p:54946317[0X3466A0D]
Total large trx count size(kb):#53307.156(kb)
....
---(79)Current Table:froad_cbank_anhui.cb_sms_log::Insert:binlog size(824224(Bytes)) times(3135)Update:binlog size(2046042(Bytes)) times(3841)Delete:binlog size(0(Bytes)) times(0)Total:binlog size(2870266(Bytes)) times(6976)
---(80)Current Table:test.2018products::Insert:binlog size(54586359(Bytes)) times(6647)Update:binlog size(0(Bytes)) times(0)Delete:binlog size(0(Bytes)) times(0)Total:binlog size(54586359(Bytes)) times(6647)
---Total binlog dml event size:73212228(Bytes) times(65090)

实际上我们很容易看到binlog整个才80M左右确实包含一个大事物如下,大约占用了50M多

--Large than 2000000(bytes) trx:
(1)Trx_size:54586527(bytes)[53307.156(kb)] trx_begin_p:359790[0X57D6E] trx_end_p:54946317[0X3466A0D]
Total large trx count size(kb):#53307.156(kb)

但是大事物只会在提交的那一刻影响其他事物的提交且状态为query end参考我早期的一篇文章
http://blog.itpub.net/7728585/viewspace-2133674/

我们先排除大事物导致的的问题。那么到底是什么问题呢,有朋友说可能是半同步,但是不使用半同步的情况下也一样。且我觉得半同步的导致慢的状态应该不是query end 占时没有测试。

三、确认问题

没有办法只能使用pstack进行分析,幸运的是这个问题确实简单如下的pstack栈帧:

显然我的猜测没有问题确实是ordered_commit上出的问题,直接打开源码找到如下:

/* Shall introduce a delay. */stage_manager.wait_count_or_timeout(opt_binlog_group_commit_sync_no_delay_count,opt_binlog_group_commit_sync_delay,Stage_manager::SYNC_STAGE);

这段代码位于flush阶段之后 sync阶段之前,目的在于通过人为的设置delay来加大整个group commit组的事物数量,从而减少进行磁盘刷盘sync的次数。这块代码虽然以前看过但是没用过这两个参数也就直接跳过了。

四、stage_manager.wait_count_or_timeout函数分析和参数分析

这个函数还是非常简单如下逻辑 看注释即可:

void Stage_manager::wait_count_or_timeout(ulong count, ulong usec, StageID stage)
{ulong to_wait=DBUG_EVALUATE_IF("bgc_set_infinite_delay", LONG_MAX, usec);/*For testing purposes while waiting for inifinityto arrive, we keep checking the queue size at regular,small intervals. Otherwise, waiting 0.1 * infiniteis too long.*/ulong delta=DBUG_EVALUATE_IF("bgc_set_infinite_delay", 100000, //此处将等待时间分割 将使用 max<ulong>(1, (to_wait * 0.1)));  //binlog_group_commit_sync_delay*0.1 和 1之间的 大的那个值作为时间分割 (单位 1/1000000 秒)//binlog_group_commit_sync_delay是 (1000000)1秒则时间分割为0.1s(100000)while (to_wait > 0 && (count == 0 || static_cast<ulong>(m_queue[stage].get_size()) < count)) //进行主体循环退出条件为 1、binlog_group_commit_sync_delay设置的时间消耗完{                                                                                             //2本组事物数量>binlog_group_commit_sync_no_delay_count my_sleep(delta);//每次休眠delta时间如果是1秒则每次休眠0.1秒to_wait -= delta;//进行总时间-delta 时间 }
}

从源码我们分析一下参数binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count的含义:

  • binlog_group_commit_sync_delay:通过人为的设置delay来加大整个group commit组的事物数量,从而减少进行磁盘刷盘sync的次数,但是受到binlog_group_commit_sync_no_delay_count的限制,单位1/1000000秒。最大值1000000也就是1秒
  • binlog_group_commit_sync_no_delay_count:如果delay的时间内如果group commit中的事物数量达到了这个设置就直接跳出等待,而不需要等待binlog_group_commit_sync_delay的时间,单位group commit中事物的数量。

举个列子比如我binlog_group_commit_sync_delay设置为10,binlog_group_commit_sync_no_delay_count设置为10,整个group commit将在这里等待,达到2个条件中的1个将会退出等待:

  • 等待达到了1/100000 秒
  • group commit中事物数量达到了10

四、问题库设置

最后叫朋友查看了他们库的设置如下:

居然binlog_group_commit_sync_delay设置为了最大值1000000也就是1秒,这也就解释了为什么简单的insert都会等待1秒了,且状态为query end。

五、总结

  • 整个问题的排除最终还是依赖的pstack,这也再一次体现了它的重要性。栈帧是不会骗人的只有不懂的
  • 要对query end代表的什么比较清楚
  • 至此我知道了2种query end(或者显示commit为starting)状态下小事物提交慢的可能
    1、某个大事物提交引起偶尔的提交慢

2、binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count 设置不正确引起提交慢

作者微信:

MySQL:简单insert 一秒原因排查相关推荐

  1. MySQL · 案例分析 · RDS MySQL线上实例insert慢常见原因分析

    概述 insert慢是经常被问到的问题,笔者尝试在本文中对这个问题做一个分类梳理,列举的线上例子会做简化,希望对读者有所启发. 注意:因为阿里云MySQL线上实例还是以RDS 5.6为主体,本文的分析 ...

  2. mysql千万级数据查询select、插入insert慢 可能原因总结

    mysql千万级数据查询select.插入insert慢 可能原因总结 表连表查询 并 insert ,insert into -select -from- insert into T1(XX,XX) ...

  3. MySQL 主从同步延迟的原因及解决办法

    首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 MySQL 主从同步延迟的原因及解决办法 hao_yunfeng 2018-09-04 23 ...

  4. 压测导致mysql数据库CPU很高_排查压测问题引发的系统性能调优过程

    前言:今天测试部门的小梦找到我,委屈巴巴的说我写的接口有问题,因为她对这个接口进行压力测试时,发现系统的吞吐量一直上不去,并且 应用服务器 (部署接口项目的服务器) 的CPU.内存等资源的使用率也一直 ...

  5. MySQL CPU 使用率高的原因和解决方法(来自aliyun官方文档)

    MySQL CPU 使用率高的原因和解决方法 更新时间:2017-03-17 13:25:52   分享: 用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将 ...

  6. 揪出MySQL延迟上千秒的元凶

    揪出MySQL延迟上千秒的元凶 背景 Part1:写在最前 MySQL的延迟告警想必大家一定不陌生,MySQL引起从库延迟的原因有很多,从硬件上讲可能是网卡,磁盘,内存达到瓶颈,从数据库层面来讲,可能 ...

  7. php留言本在线制作,Flash+php+mysql简单留言本制作

    推荐:Flash底片特效的制作在AS3中显示对象都有一个transform属性,设置这个属性可以改变显示对象的大小,旋转,颜色等特性.transform属性还有它自已的属性, 其中的colorTran ...

  8. mysql保存中文乱码的原因和解决办法

    当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心.   也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类似 ...

  9. MYSQL从节点延迟问题原因及解决

    MYSQL从节点延迟问题原因及处理方法 mysql 因为异步同步,只能达到最终一致性,而无法达到实时一致性,所以理论是有延迟在所难免. 在mysql 5.7 版本实现了多线程同步,缓解了延迟问题,但不 ...

最新文章

  1. php正则替换%3cbr%3e_php利用正则替换过滤掉js(script)代码
  2. 吴恩达:我们说人工智能时,实际在说些什么?
  3. 全球与中国立式胶体磨市场发展现状调研及前景需求分析报告2022-2027年版
  4. 爬虫神器:超炫酷的自动化工具 Selenium
  5. 精通JavaScript攻击框架:AttackAPI
  6. FFMPEG结构体分析
  7. android 7.0 禁止 imei,Android一些适配
  8. oracle 移动日志文件,Oracle数据库移动数据文件、日志文件和控制文件
  9. Java使用自定义包
  10. 华三交换机配置access命令_H3C交换机配置命令大全
  11. WORD限制别人只能填写窗体而不能修改文档其他内容?
  12. mysql5.5主从同步复制配置
  13. 【LeetCode】【字符串】题号:*299. 猜数字游戏
  14. SQL解析处理和扩展开发工具 Java
  15. LCL三相pwm整流器(逆变器)
  16. php mac开启socket,mac上nginx以socket的方式连接php-fpm出现502错误?
  17. 压缩包密码破解工具-ARCHPR
  18. 执行maven install命令报java不支持diamond语法
  19. sql重启oracle数据库,oracle重启数据库sql
  20. 阿里云企业邮箱2019

热门文章

  1. 排序 - 冒泡法(改进)
  2. PHP为什么以及什么时候使用单例模式?
  3. AndroidManifest详解
  4. 20120621第一天_复习与测试
  5. SQL SERVER 2008中用C#定义压缩与解压缩函数
  6. html5 canvas 画的简易时钟
  7. windows2003+iis6.0+php(fastcgi)5.3+wincache+memcached
  8. vue 本地环境API代理设置和解决跨域
  9. CockroachDB学习笔记——[译]在CockroachDB中如何让在线模式更改成为可能
  10. Ubuntu上安装配置JDK