MySQL:32 Linux操作系统的存储系统软件层原理剖析以及IO调度优化原理

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:32 Linux操作系统的存储系统软件层原理剖析以及IO调度优化原理相关的知识,希望对你有一定的参考价值。

1. 操作系统的意义

所谓的操作系统,无论是Linux也好,还是Windows也好,他们本身就是软件系统。由于我们不可能直接去操作CPU、内存、磁盘这些硬件,所以必须要用操作系统来管理CPU、内存、磁盘这些硬件设备。

Windows操作系统提供了一个简单易用的可视化的操作界面,让普通人也能够操作台式电脑或者笔记本电脑内部的CPU、内存、磁盘等硬件。主要体现在编辑文件、上网、聊天等各种软件的使用,其中基于CPU执行文件编辑的操作,基于内存缓存对文件的编辑,基于磁盘编辑在文件里输入的内容,基于网卡去进行网络通信等,从而实现进行QQ聊天等功能。

Linux操作系统,不提供可视化界面,只有命令行界面,所以需要输入各种各样的命令去执行文件编辑、系统部署和运行,本质Linux操作系统在底层其实也是利用CPU、内存、磁盘和网卡这些硬件在工作。

2. 了解Linux操作系统的存储系统的好处

Linux操作系统中,利用底层的存储系统去管理该机器上的机洗硬盘、SSD固态硬盘,这些存储设备,可以在里面读取数据,或者是写入数据。

理解了该存储系统的原理,也就能理解mysql执行的数据页随机读写,redo log日志文件顺序读写的磁盘IO操作,在Linux的存储系统中是如何执行的。

3.Linux底层存储系统原理

Linux的存储系统分为VFS层、文件系统层、Page Cache缓存层、通用Block层、IO调度层、Block设备驱动层、Block设备层。如下图所示:

 首先当MySQL发起一次数据页的随机读写,或者是一次redo log日志文件的顺序读写的时候,实际上会把磁盘IO请求交给Linux操作系统的VFS层

这一层的作用,是根据你是对哪个目录中的文件执行的磁盘IO操作,把IO请求交给具体的文件系统

举个例子,在Linux中,有的目录比如/xx1/xx2里的文件其实是由NFS文件系统管理的,有的目录比如/xx3/xx4里的文件起始是由Ext3文件系统管的,那么这个时候VFS层需要根据你是哪个目录下的文件发起的读写IO请求,把请求转发给对应的文件系统。

接着文件系统会在Page Cache这个机遇内存的缓存里找你要的数据在不在里面,如果有就基于内存缓存来执行读写,如果没有就继续往下一层走,此时这个请求会交给通用Block层,在这一层会把你对文件的IO请求转换为Block IO请求。

 

接着IO请求转换为Block IO请求之后,会把这个Block IO请求交给IO调度层,在这一层里默认是用CFQ公平调度算法的。

假设此时对数据库发起了多个SQL语句同时在执行IO操作。

有一个SQL语句可能非常简单,比如 update xxx set xx1=xx2 where id=1 ,它其实可能就只要更新磁盘上的一个block里的数据就可以了。

但是有的SQL语句,比如说select * from xx where xx1 like "%xx%"可能需要IO读取磁盘上的大量数据。

那么此时如果基于公平调度算法,就会导致它先执行第二个SQL语句的读取大量数据的IO操作,耗时很久,然后第一个仅仅更新少量数据的SQL语句的IO操作,就一直在等待它,得不到执行的机会。

所以,一般建议MySQL的生产环境,需要调整为deadline IO调度算法,它的核心思想就是,任何一个IO操作都不能一直不停的等待,在指定时间范围内,必须让它去执行。

所以基于deadline IO算法,上面第一个SQL语句的更新少量数据的IO操作可能在等待一会儿之后,就会得到执行的机会,这也是一个生产环境的IO调度优化经验。

当IO请求被转交给了IO调度层之后,IO就完成调度,此时会决定哪个IO请求先执行,哪个IO请求后执行,此时可以执行的IO请求就会交给Block设备驱动层,最后经过驱动把IO请求发送给真正的存储硬件,也就是Block设备层

 

然后硬件设备完成了IO读写操作之后,不是写,就是读,最后把响应经过上面的层级反向依次返回,最终MySQL可以得到本次IO读写操作的结果。

以上就是MySQL跟Linux存储系统交互的一个原理剖析,包括里面的IO调度算法那块的一个优化的点。

以上是关于MySQL:32 Linux操作系统的存储系统软件层原理剖析以及IO调度优化原理的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储引擎

linux磁盘---文件系统

linux磁盘---文件系统

linux系统怎样将32位系统调整成64位系统

Linux系统重要目录与文件详解

64位win7系统如何安装MySQL