更新时间:2020-12-15 17:44:16 来源:极悦 浏览1491次
磁盘缓存出现的原因大概有两个:一是访问磁盘的速度远慢于访问内存的速度,通过在内存中缓存磁盘内容可以提高访问速度;二是根据程序的局部性原理,数据一旦被访问过,就很有可能在短时间内再次被访问,所以在内存中缓存磁盘内容可以提高程序运行速度。简而言之,Linux磁盘缓存机制是为提高系统对磁盘中资源的访问速度。
接下来我们先来详细讲解一下Linux磁盘缓存机制的两大原因:
1.局部性原理
程序局部性原理:程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域,具体来说,局部性通常有两种形式:时间局部性和空间局部性。
时间局部性:被引用过一次的存储器位置在未来会被多次引用。
空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
2.页缓存
Linux系统中为了减少对磁盘的IO操作,会将打开的磁盘内容进行缓存,而缓存的地方则是物理内存,进而将对磁盘的访问转换成对内存的访问,有效提高程序的速度。Linux的缓存方式是利用物理内存缓存磁盘上的内容,称为页缓存(page cache)。
页缓存是由内存中的物理页面组成的,其内容对应磁盘上的物理块。页缓存的大小会根据系统的内存空闲大小进行动态调整,它可以通过占用内存以扩张大小,也可以自我收缩以缓解内存使用压力。
在虚拟内存机制出现以前,操作系统使用块缓存系列,但是在虚拟内存出现以后,操作系统管理IO的粒度更大,因此采用了页缓存机制,页缓存是基于页的、面向文件的缓存机制。
在这次遇到的线上故障中,根本原因在于在业务逻辑中使用了临时文件做缓存,一个临时文件创建后如果在短时间内删除,这时候对这个文件的操作都是在页缓存内进行,不会实际回写到磁盘。当程序出现问题响应变慢时,临时文件存活时间变长,就可能会使其被回写到磁盘上,导致磁盘压力过大,进而影响整个系统。
Linux系统在读取文件时,会优先从页缓存中读取文件内容,如果页缓存不存在,系统会先从磁盘中读取文件内容更新到页缓存中,然后再从页缓存中读取文件内容并返回。大致过程如下:
1)进程调用库函数read发起读取文件请求
2)内核检查已打开的文件列表,调用文件系统提供的read接口
3)找到文件对应的inode,然后计算出要读取的具体的页
4)通过inode查找对应的页缓存,如果页缓存节点命中,则直接返回文件内容;如果没有对应的页缓存,则会产生一个缺页异常(page fault)。这时系统会创建新的空的页缓存并从磁盘中读取文件内容,更新页缓存,然后重复第4步
5)读取文件返回
所以说,所有的文件内容的读取,无论最初有没有命中页缓存,最终都是直接来源于页缓存。
Linux系统磁盘故障的根本原因在于在业务逻辑中使用了临时文件做缓存,一个临时文件创建后如果在短时间内删除,这时候对这个文件的操作都是在页缓存内进行,不会实际回写到磁盘。当程序出现问题响应变慢时,临时文件存活时间变长,就可能会使其被回写到磁盘上,导致磁盘压力过大,进而影响整个系统。我们搞懂了Linux磁盘缓存机制,此类问题也就迎刃而解了。想要学习更多Linux相关的知识,本站的Linux教程无疑是你最佳的选择,短期帮你快速提升Linux系统的知识水平,锻炼你的实战能力。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习