磁盘缓存PageCache

引入Cache层的母的是为了提高linux操作系统对磁盘访问的性能,

Cache层在内存中缓存了磁盘上的部分数据,当数据的请求到达时,如果在Cache中存在该数据且是最新的,则直接将数据传递给用户程序,免除了对底层磁盘的操作,

在linux实现中,文件Cache分为两个层面,一个是PageCache , 另一个是Buffer Cache , 每一个PageCache包含若干BufferCache,PageCache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候,BufferCache则主要用来设计 用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。

磁盘Cache有两大功能,预读和回写,预读其实就是利用了局部性原理,具体过程是,对于每个文件的第一个读请求,系统读入所请求的页面并读入紧随其后的少数几个页面(通常是三个页面),这时的预读成为同步预读,对于第二次读请求,如果所读页面不在Cache中,即不在前次预读的页中,则表明文件访问不是顺序访问,系统继续采用同步预读,如果所读页面在Cache中,则表明前次预读命中,操作系统把预读页的大小扩大一倍,此时预读过程时异步的,应用程序可以不等预读完成即可返回,只要后台慢慢读页面即可,这时的阅读成为异步预读,任何接下来的读请求都会处于两种情况之一,第一种情况是所请求的页面处于预读的页面中,这时继续进行异步预读;第二种情况是所请求的页面处于预读页面之外,这时系统就要进行同步预读。

回写是通过暂时将数据存在Cache里,然后统一异步写到磁盘中,通过这种异步的数据IO模式解决了程序中的计算速度和数据存储速度不匹配的鸿沟,减少了访问底层存储介质的次数,使存储系统的性能大大提高。linux2.6内核之前,采用pdflush机制将脏页面真正写到磁盘中,什么时候开始回写呢,下面两种情况,脏页面会回写到磁盘:

1。在空闲内存低于一个特定的阈值时,内核必须将脏页面写回磁盘,以便释放内存

2.当脏页在内存中驻留超过一定的阈值时,内核必须将超市的脏页写回磁盘,以确保脏页不会无限期的驻留在内存中

 

回写开始后,pdflush会持续写数据,直到满足一下两个条件:

1。已经有指定的最小数目的页被写回磁盘

2.空闲内存页已经回升,超过了阈值

linux2.6内核之后,放弃了原有的pdflush机制改为了bdi_writeback机制,bdi_writeback机制主要解决了原有pdflush机制存在的一个问题,在多磁盘系统中,pdflush管理了所有磁盘的Cache,从而导致一定程度的IO瓶颈,bdi_writeback机制为每个磁盘都创建了一个线程,专门负责这个磁盘的Pagecache的刷新工作,从而实现了每个磁盘的数据刷新在线程级的分离,提高了IO性能。

回写机制存在的问题时回写不及时引发数据丢失(可由sync|fsync解决),回写期间读IO性能很差
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值