【背景】

之前我们碰到一些MySQL的性能问题,比如服务器日志备份时可能会导致慢查询增多,一句简单的select或insert语句可能执行几秒,IO负载较高的服务器更容易出现并发线程数升高,CPU上升等问题。

最近学习了MySQL InnoDB IO相关的部分内核原理,可以帮我们了解服务器IO瓶颈对MySQL性能的影响,下面以MySQL5.7.23的源码为例

【原理】

1、InnoDB实现了同步IO和异步IO两种文件读写方式

(1、)对于读操作,通常用户线程触发的数据请求都是同步读,其他后台线程触发的是异步读。

(2、)对于写操作,InnoDB是WAL模式,先写日志,延迟写数据页;

redo log的写操作大部分是异步写,主要在下面场景下触发

<1、>redo log buffer空间不足时;

<2、>当参数innodb_flush_log_at_trx_commit设置为1时,每次事务提交都会做一次fsync,相当于是同步写;

<3、>master线程每秒做一次redo fsync;

<4、>checkpoint

<5、>实例shutdown时

<.6、>binlog切换时

Page cleaner线程负责脏页的刷新操作,其中double write buffer的写磁盘是同步写,数据文件的写入是异步写。

2、同步读写操作通常由用户线程来完成,下面先分析同步读

当用户线程执行一句SQL时,如果请求的数据页不在buffer pool中,就需要将文件中的数据页加载到buffer pool中,

从函数buf_read_page可以看到这里是同步读操作,如果IO有瓶颈,响应延迟,那么该线程就会被阻塞。

从函数buf_page_init_for_read可以看到,在读数据页时会加X锁

这时如果有其他用户线程请求相同的数据页时,从函数buf_wait_for_read看到,尝试获取X锁,就会处于阻塞状态。

当服务器IO成为瓶颈,发生上面的问题时,就会出现SQL执行变慢

问题进一步恶化,大量慢查询,运行中的线程处于等待状态,占用了Innodb线程(innodb_thread_concurrency我们的配置大部分是0或64,实际上通常是CPU的逻辑核数40)

对于并发较高的系统,会导致其他大量的线程处于等待队列中,并发线程过高又会导致上下文切换频繁,CPU上升。

3、一个同步写的例子

前面做过一个测试,执行500W条insert语句

用source执行insert脚本,TPS大约在每秒700,后面并行同时执行3个insert脚本,TPS达到每秒2000左右,IO %util已经接近100%

由于此时参数innodb_flush_log_at_trx_commit设置为1时,每次事务提交都会做一次fsync,相当于是同步写,IO已达到瓶颈,TPS处理能力无法提高。

当将参数innodb_flush_log_at_trx_commit临时调整为2,改为后台进程进行异步写,并行执行8个insert脚本,TPS达到每秒约1W左右,IO %util约在8%。

实现逻辑可以关注log_write_up_to函数

【应用场景】

1、当服务器IO出现瓶颈,会导致MySQL性能大幅下降,因此建议尽可能的利用服务器内存资源,将实例的innodb_buffer_pool_size设置为物理内存的70%左右;

2、合理的拆分,尽可能的让一个实例的热点数据都可以缓存在innodb buffer pool中

3、对于某些场景下执行脚本,或初始化数据时,可以将innodb_flush_log_at_trx_commit临时设置为2,能大幅提升导入性能。

参考资料:

http://mysql.taobao.org/monthly/2017/03/01/

http://mysql.taobao.org/monthly/2016/02/02/

http://mysql.taobao.org/monthly/2017/07/10/

服务器IO瓶颈对MySQL性能的影响的更多相关文章

  1. 修改numa和io调度优化mysql性能

    一.NUMA设置单机单实例,建议关闭NUMA,关闭的方法有三种:1.硬件层,在BIOS中设置关闭:2.OS内核,启动时设置numa=off:3.可以用numactl命令将内存分配策略修改为interl ...

  2. 网站瓶颈分析—MYSQL性能分析

    一.关于慢查询设置和分析 查找慢查询参数 mysql> show variables like 'long%'; +-----------------+----------+ | Variabl ...

  3. MySQL性能管理及架构设计:第2章 什么影响了MySQL性能

    第2章 什么影响了MySQL性能 2-1 影响性能的几个方面 1.服务器的硬件 2.服务器的操作系统 3.数据库的存储引擎 4.数据库的参数配置 5.数据库表结构设计和SQL语句的编写和优化 2-2 ...

  4. mysql性能优化学习笔记

    mysql性能优化 硬件对数据库的影响 CPU资源和可用内存大小 服务器硬件对mysql性能的影响 我们的应用是CPU密集型? 我们的应用的并发量如何? 数量比频率更好 64位使用32位的服务器版本 ...

  5. (转)MySQL配置文件mysql.ini参数详解、MySQL性能优化

    本文转自:http://www.cr173.com/html/18331_1.html my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数 ...

  6. MySQL配置文件mysql.ini参数详解、MySQL性能优化

    my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.  ...

  7. 10个常见触发IO瓶颈的高频业务场景

    摘要:本文从应用业务优化角度,以常见触发IO慢的业务SQL场景为例,指导如何通过优化业务去提升IO效率和降低IO. 本文分享自华为云社区<GaussDB(DWS)性能优化之业务降IO优化> ...

  8. 影响mysql性能的因素

    一.服务器硬件. CPU不够快,内存不够多,磁盘IO太慢. 对于计算密集型的应用,CPU越可能去影响系统的性能,此时,CPU和内存将越成为系统的瓶颈. 当热数据大小远远超过系统可用内存大小时,IO资源 ...

  9. 经验:什么影响了数据库查询速度、什么影响了MySQL性能 (转)

    一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定 ...

随机推荐

  1. node.js 开发简易的小爬虫

    node.js  开发简易的小爬虫 最近公司开发一款医药类的软件,所以需要一些药品的基础数据,所以本人就用node.js写一个简易的小爬虫,并写记录这个Demo以供大家参考. 一.开发前的准备: 1, ...

  2. 20145215《网络对抗》shellcode注入&Return-to-libc攻击深入

    20145215<网络对抗>shellcode注入&Return-to-libc攻击深入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻 ...

  3. 使用Arraylist将数组中元素随机均等乱序分为N个子数组

    使用Arraylist将数组中元素随机均等乱序分为N个子数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 为了将数组中的元素 随机地 ,均等地, 不重复地 ,划分到N个子数组中 使用Arr ...

  4. POJ - 3436 ACM Computer Factory(最大流)

    https://vjudge.net/problem/POJ-3436 题目描述:  正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...

  5. php银行卡校验

    前言银行金卡,维萨和万事达.银联品牌,如果是贷记卡或准贷记卡,一定为16位卡号.而借记卡可以16-19位不等.美国运通卡则不论金卡或是白金卡.普通卡,都是15位卡号.16-19 位卡号校验位采用 Lu ...

  6. JavaScript继承详解(一)

    面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++.C#.Java)的开发经验. 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则 ...

  7. 【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包

    [题目]#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop [题意]给定一个长度为n的物品序列,每个物品有价值.不超过m的重量.要求支持以下三种操作:1.物品价值区间加减,2.物 ...

  8. 第11月第11天 avplayer循环播放

    1. /* Setting actionAtItemEnd to None prevents the movie from getting paused at item end. A very sim ...

  9. 论参数self

    此篇文章仅适用于py3.在py2中,a.fuc(x)中的参数x必须是 类a的实例对象,而py3则可以是任意对象.参考绑定方法和非绑定方法 当一个对象添加了一个方法,并且此方法的第一个参数为self,或 ...

  10. bellman-ford算法(判断有没有负环)

    #include <iostream> #include <vector> #include<string> #include<cstring> usi ...