问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么当磁盘IO成瓶颈之后数据库的性能急剧下降

发布网友 发布时间:2022-04-10 15:40

我来回答

2个回答

热心网友 时间:2022-04-10 17:10

自从使用阿里云以来,我们遇到了三次故障(一、二、三),这三次故障都与磁盘IO高有关。第一次故障发生在跑zzk.cnblogs.com索引服务的云 服务器上,当时的Avg.Disk Read Queue Length高达200多;第二次故障发生在跑images.cnblogs.com静态文件的云服务器上,当时的Avg.Disk Read Queue Length在2左右(后来分析,对于图片站点这样的直接读文件进行响应的应用,Disk Read Queue Length达到这个值会明显影响响应速度);第三次故障发生在跑数据库服务的云服务器上,当时的Avg. Disk Write Queue Length达到4~5,造成很多的数据库写入操作超时。

热心网友 时间:2022-04-10 18:28

      为什么当磁盘IO成瓶颈之后, 数据库的性能不是达到饱和的平衡状态,而是急剧下降。为什么数据库的性能有非常明显的分界点,原因是什么?

      相信大部分做数据库运维的朋友,都遇到这种情况。 数据库在前一天性能表现的相当稳定,数据库的响应时间也很正常,但就在今天,在业务人员反馈业务流量没有任何上升的情况下,数据库的变得不稳定了,有时候一个最简单的insert操作, 需要几十秒,但99%的insert却又可以在几毫秒完成,这又是为什么了?

        dba此时心中有无限的疑惑,到底是什么原因呢? 磁盘IO性能变差了?还是业务运维人员反馈的流量压根就不对? 还是数据库内部出问题?昨天不是还好好的吗?

        当数据库出现响应时间不稳定的时候,我们在操作系统上会看到磁盘的利用率会比较高,如果观察仔细一点,还可以看到,存在一些读的IO. 数据库服务器如果存在大量的写IO,性能一般都是正常跟稳定的,但只要存在少量的读IO,则性能开始出现抖动,存在大量的读IO时(排除配备非常高速磁盘的机器),对于在线交易的数据库系统来说,大概性能就雪崩了。为什么操作系统上看到的磁盘读IO跟写IO所带来的性能差距这么大呢? 

        如果亲之前没有注意到上述的现象,亲对上述的结论也是怀疑。但请看下面的分解。

        在写这个文章之前,作者阅读了大量跟的IO相关的代码,如异步IO线程的相关的,innodb_buffer池相关的,以及跟读数据块最相关的核心函数buf_page_get_gen函数以及其调用的相关子函数。为了将文章写得通俗点,看起来不那么累,因此不再一行一行的将代码解析写出来。

     咱们先来提问题。 buf_page_get_gen函数的作用是从Buffer bool里面读数据页,可能存在以下几种情况。

      提问. 数据页不在buffer bool 里面该怎么办? 

     回答:去读文件,将文件中的数据页加载到buffer pool里面。下面是函数buffer_read_page的函数,作用是将物理数据页加载到buffer pool, 图片中显示

buffer_read_page函数栈的顶层是pread64(),调用了操作系统的读函数。

buf_read_page的代码

   如果去读文件,则需要等待物理读IO的完成,如果此时IO没有及时响应,则存在堵塞。这是一个同步读的操作,如果不完成该线程无法继续后续的步骤。因为需要的数据页不再buffer 中,无法直接使用该数据页,必须等待操作系统完成IO .

      再接着上面的回答提问:

       当第二会话线程执行sql的时候,也需要去访问相同的数据页,它是等待上面的线程将这个数据页读入到缓存中,还是自己再发起一个读磁盘的然后加载到buffer的请求呢?   代码告诉我们,是前者,等待第一个请求该数据页的线程读入buffer pool。

      试想一下,如果第一个请求该数据页的线程因为磁盘IO瓶颈,迟迟没有将物理数据页读入buffer pool, 这个时间区间拖得越长,则造成等待该数据块的用户线程就越多。对高并发的系统来说,将造成大量的等待。 等待数据页读入的函数是buf_wait_for_read,下面是该函数相关的栈。


    通过解析buf_wait_for_read函数的下层函数,我们知道其实通过首先自旋加锁pin的方式,超过设定的自旋次数之后,进入等待,等待IO完成被唤醒。这样节省不停自旋pin时消耗的cpu,但需要付出被唤起时的开销。

    再继续扩展问题: 如果会话线程A 经过物理IO将数据页1001读入buffer之后,他需要修改这个页,而在会话线程A之后的其他的同样需要访问数据页1001的会话线程,即使在数据页1001被入读buffer pool之后,将仍然处于等待中。因为在数据页上读取或者更新的时候,同样需要上锁,这样才能保证数据页并发读取/更新的一致性。

     由此可见,当一个高并发的系统,出现了热点数据页需要从磁盘上加载到buffer pool中时,造成的延迟,是难以想象的。因此排在等待热点页队列最后的会话线程最后才得到需要的页,响应时间也就越长,这就是造成了一个简单的sql需要执行几十秒的原因。

再回头来看上面的问题,mysql数据库出现性能下降时,可以看到操作系统有读IO。 原因是,在数据库对数据页的更改,是在内存中的,然后通过检查点线程进行异步写盘,这个异步的写操作是不堵塞执行sql的会话线程的。所以,即使看到操作系统上有大量的写IO,数据库的性能也是很平稳的。但当用户线程需要查找的数据页不在buffer pool中时,则会从磁盘上读取,在一个热点数据页不是非常多的情况下,我们设置足够大的innodb_buffer_pool的size, 基本可以缓存所有的数据页,因此一般都不会出现缺页的情况,也就是在操作系统上基本看不到读的IO。  当出现读的IO时,原因时在执行buf_read_page_low函数,从磁盘上读取数据页到buffer pool, 则数据库的性能则开始下降,当出现大量的读IO,数据库的性能会非常差。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水笔在手上画画会不会被衣服搽掉下来 老人每天大便次数很多量不多也不稀,每天还会拉三四次水应经三个月了... 从大连飞机场怎么去大连经济开发区5彩城K区的大连金港大酒店 除了打 ... 请问从大连周水子国际机场到经济技术开发区怎么走最省钱? 中国古代名刀总录中国古代十大名刀 怎样把qq安装到iphone里面 苏科大什么梗 苏科大叫什么名字 lol苏科大是苏州科技大学的吗 lol苏州科技大学为什么这么厉害 优尔精医用降温贴是不是保健品? 百度有钱花是骗子吗? 你们旗下有没有百度有钱花这个公司 我需要贷款,别人让办营业执照,开对公账户,给我贷款,可是用我的帐户洗钱,我该怎么办?需要担责吗? 欠有钱花几千块钱,对方说还本金就得直接打钱到公司的对公账户,这种能信吗? 那首歌里有一句歌词是:这是我的命、被抛弃的命、歌名是? 被抛弃也不在刻意挽留是什么歌? 请问有什么像<被抛弃的人>这样的伤感歌曲? 被爱情抛弃的时候适合听什么歌曲? 被男情人抛弃了都有什么歌曲? 有什么伤感的流行歌曲 适合被女朋友抛弃的歌曲 急需 急需 急!!!!!!!!!!!!!!!!!!!!!! 一个人孤独的时候感觉被世界抛弃了,想听些伤感歌曲,谁能推荐? 失恋的人,被抛弃的人想听伤心的歌曲,有哪些符合现在的心情? 谁有被女人抛弃了听的歌呀........ 有没有适合男生被抛弃后听的歌? 推荐几首心情低落伤心,被所有人抛弃后听的歌。要伤感点的。 什么歌适合被人抛弃的时候听? 关于放弃的悲伤歌曲 被世界抛弃的歌曲 求各位帮忙,提供一些描写女人被抛弃的歌,还有女人要成长自强的歌,谢谢 一个被女生抛弃的男生该听什么样的歌曲??有什么伤感的歌推荐吗??? 苦累蒸多长时间 豆角苦累的家常做法大全怎么做好吃视频 豆角苦累家常做法,正宗豆角苦累怎么做 苦累怎么做好吃,蒸苦累的家常做法 豆角苦累(音译)怎么做如何做好吃 什么菜可以做苦累 苦累,苦累的做法,苦累怎么做 fnafworld全人物怎么解锁 哪一个应用市场可以什么fnaf游戏都能下 FNAF World新手怎么玩 新手攻略 FNAF world 如何调难度? 怎么改fnafworld的文件 FNAF WORLD人物角色如何获取? fnafar特快专递下载新版怎么展示 oppo手机怎么玩fnafar? FNAF电影什么时候出 iphone新系统右上角黄点 乌鱼怎么做好吃 川味 乌鱼怎么做汤 乌鱼怎么做才好吃?