我的编程空间,编程开发者的网络收藏夹
学习永远不晚

有哪些Linux磁盘缓存相关知识

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

有哪些Linux磁盘缓存相关知识

本篇内容介绍了“有哪些Linux磁盘缓存相关知识”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

最近遇到了一起跟磁盘相关的线上故障,借此总结一下之前不太了解的Linux磁盘缓存相关的知识。

总的来说磁盘缓存出现的原因大概有两个:第一是访问磁盘的速度远慢于访问内存的速度,通过在内存中缓存磁盘内容可以提高访问速度;第二是根据程序的局部性原理,数据一旦被访问过,就很有可能在短时间内再次被访问,所以在内存中缓存磁盘内容可以提高程序运行速度。

局部性原理

程序局部性原理:程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域,具体来说,局部性通常有两种形式:时间局部性和空间局部性。

时间局部性:被引用过一次的存储器位置在未来会被多次引用。

空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。

页缓存

Linux系统中为了减少对磁盘的IO操作,会将打开的磁盘内容进行缓存,而缓存的地方则是物理内存,进而将对磁盘的访问转换成对内存的访问,有效提高程序的速度。Linux的缓存方式是利用物理内存缓存磁盘上的内容,称为页缓存(page cache)。

页缓存是由内存中的物理页面组成的,其内容对应磁盘上的物理块。页缓存的大小会根据系统的内存空闲大小进行动态调整,它可以通过占用内存以扩张大小,也可以自我收缩以缓解内存使用压力。

在虚拟内存机制出现以前,操作系统使用块缓存系列,但是在虚拟内存出现以后,操作系统管理IO的粒度更大,因此采用了页缓存机制,页缓存是基于页的、面向文件的缓存机制。

页缓存的读取

Linux系统在读取文件时,会优先从页缓存中读取文件内容,如果页缓存不存在,系统会先从磁盘中读取文件内容更新到页缓存中,然后再从页缓存中读取文件内容并返回。

大致过程如下:

  • 进程调用库函数read发起读取文件请求

  • 内核检查已打开的文件列表,调用文件系统提供的read接口

  • 找到文件对应的inode,然后计算出要读取的具体的页

  • 通过inode查找对应的页缓存,1)如果页缓存节点命中,则直接返回文件内容;2)如果没有对应的页缓存,则会产生一个缺页异常(page fault)。这时系统会创建新的空的页缓存并从磁盘中读取文件内容,更新页缓存,然后重复第4步

  • 读取文件返回

所以说,所有的文件内容的读取,无论最初有没有命中页缓存,最终都是直接来源于页缓存。

页缓存的写入

因为页缓存的存在,当一个进程调用write时,对文件的更新仅仅是被写到了文件的页缓存中,让后将对应的页标记为dirty,整个过程就结束了。Linux内核会在周期性地将脏页写回到磁盘,然后清理掉dirty标识。

由于写操作只会把变更写入页缓存,因此进程并不会因此为阻塞直到磁盘IO发生,如果此时计算机崩溃,写操作的变更可能并没有发生在磁盘上。所以对于一些要求比较严格的写操作,比如数据系统,就需要主动调用fsync等操作及时将变更同步到磁盘上。读操作则不同,read通常会阻塞直到进程读取到数据,而为了减少读操作的这种延迟,Linux系统还是用了“预读”的技术,即从磁盘中读取数据时,内核将会多读取一些页到页缓存中。

回写线程

页缓存的回写是由内核中的单独的线程来完成的,回写线程会在以下3种情况下进行回写:

  • 空闲内存低于阈值时。当空闲内存不足时,需要释放掉一部分缓存,由于只有不脏的页才能被释放,所以需要把脏页都回写到磁盘,使其变为可回收的干净的页。

  • 脏页在内存中处理时间超过阈值时。这是为了确保脏页不会无限期的留在内存中,减少数据丢失的风险。

  • 当用户进程调用sync和fsync系统调用时。这是为了给用户进程提供强制回写的方法,满足回写要求严格的使用场景。

回写线程的实现

名称版本说明
bdflush2.6版本以前bdflush 内核线程在后台运行,系统中只有一个 bdflush 线程,当内存消耗到特定阀值以下时,bdflush 线程被唤醒。kupdated 周期性的运行,写回脏页。 但是整个系统仅仅只有一个 bdflush 线程,当系统回写任务较重时,bdflush 线程可能会阻塞在某个磁盘的I/O上,导致其他磁盘的I/O回写操作不能及时执行。
pdflush2.6版本引入pdflush 线程数目是动态的,取决于系统的I/O负载。它是面向系统中所有磁盘的全局任务的。 但是由于 pdflush 是面向所有磁盘的,所以有可能出现多个 pdflush 线程全部阻塞在某个拥塞的磁盘上,同样导致其他磁盘的I/O回写不能及时执行。
flusher线程2.6.32版本以后引入flusher 线程的数目不是唯一的,同时flusher线程不是面向所有磁盘的,而是每个flusher线程对应一个磁盘

页缓存的回收

Linux中页缓存的替换逻辑是一个修改过的LRU实现,也称为双链策略。和以前不同,Linux维护的不再是一个LRU链表,而是维护两个链表:活跃链表和非活跃链表。处于活跃链表上的页面被认为是“热”的且不会被换出,而在非活跃链表上的页面则是可以被换出的。在活跃链表中的页面必须在其被访问时就处于非活跃链表中。两个链表都被伪LRU规则维护:页面从尾部加入,从头部移除,如同队列。两个链表需要维持平衡–如果活跃链表变得过多而超过了非活跃链表,那么活跃链表的头页面将被重新移回到非活跃链表中,一遍能再被回收。双链表策略解决了传统LRU算法中对仅一次访问的窘境。而且也更加简单的实现了伪LRU语义。这种双链表方式也称作LRU/2。更普遍的是n个链表,故称LRU/n。

“有哪些Linux磁盘缓存相关知识”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

有哪些Linux磁盘缓存相关知识

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

有哪些Linux磁盘缓存相关知识

本篇内容介绍了“有哪些Linux磁盘缓存相关知识”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言最近遇到了一起跟磁盘相关的线上故障,借此总
2023-06-25

Linux系统磁盘的知识点有哪些

这篇文章主要讲解了“Linux系统磁盘的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统磁盘的知识点有哪些”吧!1、 磁盘分类目前市场上的磁盘分类有:IDE磁盘(多用
2023-06-27

Linux集群的相关知识点有哪些

今天小编给大家分享一下Linux集群的相关知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、 目前网站架构一般分
2023-06-26

Spring Cache相关知识有哪些

这篇文章将为大家详细讲解有关Spring Cache相关知识有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介 Spring 从 3.1 开始定义了 org.springframework.cach
2023-06-15

HashMap相关知识点有哪些

本篇内容介绍了“HashMap相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HashMap 和 HashSet 是 Java
2023-06-17

YARN相关知识点有哪些

本篇内容介绍了“YARN相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!YARN产生背景为什么会产生YRAN?这个与MapRe
2023-06-19

Java IO相关知识有哪些

这篇文章主要介绍了Java IO相关知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、IO底层是怎么回事?操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源
2023-06-15

linux磁盘格式化与管理知识点有哪些

这篇文章主要介绍linux磁盘格式化与管理知识点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先我们来认识下Linux上的文件系统 /:根目录 /bin:二进制,可执行命令 /sbin:可执行
2023-06-13

Linux磁盘管理和Shell编程知识点有哪些

这篇文章主要介绍“Linux磁盘管理和Shell编程知识点有哪些”,在日常操作中,相信很多人在Linux磁盘管理和Shell编程知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux磁盘管理和S
2023-06-15

Linux命令相关的基本知识有哪些

这篇文章给大家分享的是有关Linux命令相关的基本知识有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文约定对于每一个命令,大致分为如下三个部分功能简单介绍该命令功能。举例给出该命令最常使用的例子。描述详细
2023-06-05

centos 5.x 大硬盘管理相关知识有哪些

这篇文章给大家介绍centos 5.x 大硬盘管理相关知识有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、进入系统执行:#parted /dev/sdb2、建立磁盘label:mklabel GPT3、按p键,
2023-06-10

React的相关知识点有哪些

这篇文章主要介绍“React的相关知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React的相关知识点有哪些”文章能帮助大家解决问题。React与传统MVC的关系轻量级的视图层库!A J
2023-06-03

编程热搜

目录