当前位置: 首页 > news >正文

MySQL中sync_relay_log选项对I/O thread的影响分析

搭建好的一套从库,发现延迟很高,一直追不上,从库的bin_log没开,flush_log_at_trx_commit设置为0,简化的状态如下:

image

发现Master_Log_File,Read_Master_Log_Pos一直进展比较缓慢,一般来说内网的瓶颈不会在网络,同时一般I/O THREAD并不存再CPU密集型操作,那么瓶颈很可能在I/O,使用iotop命令查看服务器I/O情况如下:

image

发现MYSQL线程LWP号为44706 的线程I/O非常高,但是写入只有600来K,明显这种情况是不正常的。

一般来说,LINUX有KERNEL BUFFER/CACHE,write只是写入到KERNEL BUFFER/CACHE就好了;

例外就是以dirctor写入方式,这种方式依赖的是用户态缓存,还有就是写入调用了大量的fsync之类的同步kernel cache/buffer到磁盘的系统调用。

然后查看这个LWP号是否为I/O thread如下,因为5.7可以非常轻松的找到MYSQL conn_id和系统LWP之间的关系如下:

image

确实发现这个大量I/O的确实是MYSQL从库的I/O thread,那么接下来的就是进行strace看看到底为什么这么慢,strace片段如下:

image

我们发现文件描述符fd=50的文件有大量的写入而且频繁的调用fdatasync来同步磁盘,消耗时间非常可观,是MUTEX调用和write操作的N倍,我们可以通过/proc/pid目录下找到文件描述符和文件的对应关系,那么我们就看看文件描述符50到底是什么,如下:

image

确实是我们的replay log。
那么问题就确定了,就是因为replay log的写入调用了大量的fdatasync造成的I/O THREAD非常慢,那么是哪一个参数呢?
其实参数就是sync_relay_log,这个参数用来保证relay log的安全,官方文档有如下的图:

image

我们可以看到如果不设置sync_relay_log那么有可能造成relay log丢失的风险,其实上面的分析已经看到就是调用fdatasync来完成这个功能,但是
这样的代价基本是不可接受的。

官方文档有如下说明:

It is important to note the impact of sync_relay_log=1, which requires a write of to the relay log per transaction. Although this setting is the most resilient to an unexpected halt, with at most one unwritten transaction being lost, it also has the potential to greatly increase the load on storage. Without sync_relay_log=1, the effect of an unexpected halt depends on how the relay log is handled by the operating system.

A value of 1 is the safest choice because in the event of a crash you lose at most one event from the relay log. However, it is also the slowest choice (unless the disk has a battery-backed cache, which makes synchronization very fast).

每次事务都会调用fdatasync,代价太高。所以没办法修改了sync_relay_log的设置,默认值是10000,也就是10000个事务进行一次fdatasync。

原文发布时间为:2018-06-29
本文作者:八怪
本文来自云栖社区合作伙伴“ 老叶茶馆”,了解相关信息可以关注“ 老叶茶馆”。

相关文章:

  • IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库...
  • 13、jmeter抓包之浏览器请求
  • HDU 5969 最大的位或【贪心/按位或/思维】
  • Linux内核中的锁——知识点
  • 浅谈Service Mesh体系中的Envoy
  • 3 .5 数据库引擎优化顾问
  • 在 Windows 中安装 Laravel 5.1.X
  • Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
  • 2017年开发语言排名
  • 玩转X-CTR100 l STM32F4 l HC-SR04超声波测距
  • 前端存储 - localStorage
  • Xamarin Essentials教程剪贴板Clipboard
  • ES6 系列之迭代器与 for of
  • CSS 全解析实战(三)-CSS 基础
  • 用栅栏(CyclicBarrier)实现高并发测试
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • angular2开源库收集
  • Apache的基本使用
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • MYSQL 的 IF 函数
  • Redis学习笔记 - pipline(流水线、管道)
  • TypeScript迭代器
  • 浮现式设计
  • 开源地图数据可视化库——mapnik
  • 正则表达式小结
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • #100天计划# 2013年9月29日
  • (0)Nginx 功能特性
  • (003)SlickEdit Unity的补全
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .apk 成为历史!
  • .net core 6 集成和使用 mongodb
  • .net 使用ajax控件后如何调用前端脚本
  • .NET学习全景图
  • @Not - Empty-Null-Blank
  • @Resource和@Autowired的区别
  • [ JavaScript ] JSON方法
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++]C++入门--引用
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [Flexbox] Using order to rearrange flexbox children