磁盘缓存出现的原因大概有两个:一是访问磁盘的速度远慢于访问内存的速度,通过在内存中缓存磁盘内容可以提高访问速度;二是根据程序的局部性原理,数据一旦被访问过,就很有可能在短时间内再次被访问,所以在内存中缓存磁盘内容可以提高程序运行速度。简而言之,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系统的知识水平,锻炼你的实战能力。

linux缓存详解,Linux磁盘缓存机制详解相关推荐

  1. Linux mem 1.3 分页寻址(Paging)机制详解

    文章目录 1. X86手册定义 1.1 paging modes 1.2 `4-LEVEL PAGING`和`5-LEVEL PAGING`模式 1.2.1 `4-LEVEL PAGING` 1.2. ...

  2. linux命令清理磁盘空间,linux环境下清理系统磁盘空间命令详解

    提示 1:清理残余的配置文件 一般而言,当我们从 Ubuntu 系统中删除了一个软件之后,该软件的残余配置文件并没有被删除.如果你确信以后不再使用该软件,那么保留其配置文件实在没有必要,所以我们大可一 ...

  3. mysql刷盘机制详解

    目录 刷盘机制总览 log buffer(innodb的,由存储引擎分配) binlog cache(由server分配) buffer pool 自适应刷脏页Adaptive Flushing 刷盘 ...

  4. 浏览器Disk Cache磁盘缓存及其协商缓存、及原生App和浏览器实现缓存的差异

    浏览器Disk Cache磁盘缓存及其协商缓存.及原生App和浏览器实现缓存的差异 目录 浏览器Disk Cache磁盘缓存及其协商缓存.及原生App和浏览器实现缓存的差异 1.Memory Cach ...

  5. Glide 缓存策略 内存缓存和磁盘缓存

    感恩原创:http://www.cnblogs.com/baiqiantao/p/6808457.html Glide 缓存策略 内存缓存和磁盘缓存 官方文档:https://github.com/b ...

  6. linux 统计_聊聊 Linux 的内存统计

    写在前面 本文主要分析 Linux 系统内存统计的一些指标以及进程角度内存使用监控的一些方法. 开始阅读这篇文章前,请先简单阅读下面的几篇文章. <进程眼中的线性地址空间> <线程眼 ...

  7. linux 编译缓存,Linux磁盘缓存(disk cache)详解

    在Linux系统里通过free命令,我们经常可以看到类似下面的输出: $ free -m total used free shared buffers cached Mem: 24097 21665 ...

  8. 清理linux服务器缓存,详解Linux手动释放缓存的方法

    详解Linux手动释放缓存的方法 发布时间:2020-08-20 07:53:27 来源:脚本之家 阅读:87 作者:闪电王国 栏目:服务器 Linux释放内存的命令: sync echo 1 > ...

  9. 一文了解Linux磁盘缓存机制

    前言 最近遇到了一起跟磁盘相关的线上故障,借此总结一下之前不太了解的Linux磁盘缓存相关的知识. 总的来说磁盘缓存出现的原因大概有两个:第一是访问磁盘的速度远慢于访问内存的速度,通过在内存中缓存磁盘 ...

最新文章

  1. Android p2p service,android – WifiP2pDnsSdServiceInfo.newInstance中的可用服务类型
  2. linux c 之sigsuspend 进程阻塞
  3. C++ 中const的用法,特别是用在函数前面与后面的区别!
  4. 2张表,轻松搞定你的收入问题
  5. 数值计算 插值与拟合
  6. Python 爬虫: 抓取花瓣网图片
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的社区物业管理系统
  8. c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)
  9. 添加常见 URL Scheme 列表,方便快速查询⓶QA:URL Scheme适配好为何仍然报错
  10. 针对主流浏览器的CSS-HACK写法及IE常用条件注释
  11. java json web token_一分钟简单了解JSON Web Token
  12. 原理+代码实战:SUID提权渗透
  13. 文件已被其他应用程序锁定该怎么解决
  14. 无线路由器服务器连接线,有线路由器接无线路由器怎么设置
  15. ad一张图纸绘制多图_ad原理图绘制基础
  16. 【侯捷 C++ 面向对象高级开发】课程笔记以及个人注释(附带课程资源)
  17. 触发字检测 trigger word detection
  18. 孙陶然:切合实际是设定目标的基础
  19. html标签中的style=visibility:visible
  20. 电源并联均流电路的几种最常见分析方法

热门文章

  1. 安卓学习专栏——安卓报错android.support.v4.widget.DrawerLayout飘红
  2. 苹果电脑如何强制删除mac上面的恶意软件?
  3. 【手把手教你】使用Python对股价的Heikin Ashi蜡烛图进行可视化
  4. 【读书笔记】刘擎西方现代思想讲义——一场观念的探险
  5. outlook邮件撤回 outlook邮件如何撤回-来自三人行慕课
  6. 基于SpringBoot+Mybatis开发的前后端ERP系统Saas平台
  7. 解读《电信重组公告》:3G发牌仍然无期限
  8. 运营干货| 用户触达36计,和用户来次亲密接触
  9. 使用外部时钟,通过TIM21_CH1,对STM32L0XX内部的RC时钟(HSI/MSI等)进行校准
  10. 面试42场拿下微软、蚂蚁、头条offer的方法论(干货)