从数据库层面去看linux的操作系统

2 篇文章 0 订阅
1 篇文章 0 订阅

从数据库层面去看Linux操作系统的存储系统原理
Linux的存储系统分为VFS层、文件系统层、Page Cache缓存层、通用Block层、IO调度层、Block设备驱动层、Block设备层,如下图:
在这里插入图片描述

当MySQL发起一次数据页的随机读写,或者一次redo log日志文件的顺序读写的时候,实际上会把磁盘IO请求交给Linux操作系统的VFS层。
在这里插入图片描述

VFS层的作用:根据对哪个目录中的文件执行的磁盘IO操作,就把IO请求交给具体的文件系统。
一个系统是可以存在不同的文件系统,常见的设置文件系统的场景:挂载磁盘、格式化u盘等。所以在linux系统中,可能不同的目录就是由不同的文件系统管理的,这时VFS层就需要根据要对哪个目录下的文件发起的IO读写请求,把请求转交给对应的文件系统。(如步骤①)

接着文件系统会在Page Cache这个基于内存的缓存中查看要读写的数据是否在里面。(如步骤②)。如果已经有了就基于os cache执行读写,如果没有就继续往下一层走,把这个请求交给通用Block层,这一层会把对文件的IO请求转换为Block IO请求。(如步骤③)

在IO请求转换成Block IO请求之后,会把这个Block IO请求交给IO 调度层,(如步骤④),这一层会涉及到一个默认的算法:CFQ完全公平调度算法。

假设一个场景:数据库执行的多个SQL语句同时执行了IO操作。
第一个sql,如:update t1 set name = xxx where id = 1,可能只需要更新磁盘上的一个Block中的数据就可以了。
第二个sql,如:select * from t1 where name like “%xx%”,这条sql可能会需要IO读取磁盘上的大量数据。
如果是基于CFQ公平调度算法,会导致先执行第二条sql语句的读取大量数据的IO操作,第一条sql的更新少量数据的IO操作会进行等待。

如果数据量比较多,耗时较长,等待的时间较长的情况下,有一个思路:是将CFQ完全公平调度算法调整为 deadline IO调度算法,这个算法的核心思想是:任何一个IO操作都不能一直不停的等待,在指定的时间范围内,都必须去执行。(可以作为一个IO调优思路)

IO调度层完成之后,会决定哪个IO请求先执行,哪个IO请求后执行,然后把执行的IO请求交给Block设备驱动层。(如步骤⑤)

经过驱动层把IO请求发给Block设备层,也就是真正的存储硬件。(如步骤⑥)

最后硬件设备完成了IO读写操作之后,把响应按上面的层反向依次返回,最终MySQL得到本次IO读写操作的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值