| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux的Page Cache -> 正文阅读 |
|
[系统运维]Linux的Page Cache |
1. Page Cache何为Page Cache为了了解Page Cache我们可以看一下Linux的文件I/O系统 从图中可以看出,Page Cache是由Linux内核进行管理的,而且通过mmap以及bffered I/O将文件读取到内存空间实际上都是读取到Page Cache上的。 如何查看系统的Page Cache?通过读取
上述等式两边都是Page Cache
Page 是内存管理分配的基本单位,Page Cache是由多个Page所构成的。Page在操作系统中通常都是为4KB大小,Page Cache的大小为4KB的整数倍。 另外一方面,并不是所有的Page都被认为是Page Cache Linux系统中可供访问的两种内存:
为啥不直接将Page Cache称为block cache
对比一下file-backed pages和Anonymous pages在swap机制下的性能 内存是一种珍惜资源,当内存不够用的时候,内存管理单元MMU(memory Managment Unit)需要提供调度算法回收相关的内存空间。内存空间挥手的方式通常就是swap机制,将内存中的数据交换到持久化设设备上的过程。 File-backed pages(Page Cache)的回收代价比较低,因为:
Page Cahe主要难点在于脏页回盘(后面进行说明) Anonymous pages内存回收代价是比较高的。这时因为Anonymous pages通常随机地写入持久化设备。另外一方面,无论是否有写操作,为了确保数据不丢失,Anonymous pages在进行swap时必须持久化到磁盘上。 swap与缺页中断swap机制是指物理内存不够用的时候,内存管理单元MMU(memory Managment Unit)需要提供调度算法来回收相关的内存空间,然后将清理出来的内存空间给当前的内存申请方。 swap机制存在的原因是Linux系统提供了虚拟内存管理机制,每个一个进程都认为其独占内存空间,因此所有的进程的内存空间之和远远大于物理内存,所有进程的内存空间之和超过物理内存的分部分需要交换到磁盘上。 操作系统以page为单位管理内存,当进程发现需要访问的数据不再内存时,操作系统可能会将数据以页的方式加载到内存中。上述的整个过程被称之为缺页中断,当操作系统发生缺页中断时,就会通过系统调用将page再次读取到内存中。 但主内存的空间是有限的,当主内存中不包含可以使用的空间时,操作系统会从内存中选择合适的内存页驱逐回磁盘,为新的内存页让出位置,选择待驱逐页的过程在操作系统中叫做页面替换(page replacement),替换操作又会触发swap机制。 如果物理内存足够大,那么可能不需要 Swap 机制,但是 Swap 在这种情况下还是有一定优势:对于有发生内存泄漏几率的应用程序(进程),Swap 交换分区更是重要,这可以确保内存泄露不至于导致物理内存不够用,最终导致系统崩溃。但内存泄露会引起频繁的 swap,此时非常影响操作系统的性能。 Linux可以通过swappiness参数控制swap机制,范围[0-100],实现控制swap的优先级:
为什么buffers也是Page Cache的一部分 这是因为当匿名页(Inactive(anon) 以及 Active(anon))先被交换(swap out)到磁盘上后,然后再加载回(swap in)内存中,由于读入到内存后原来的 Swap File 还在,所以 SwapCached 也可以认为是 File-backed page,即属于 Page Cache。这个过程如 Figure 2 所示。 老一点的系统
Cached 表示当前的页缓存(Page Cache)占用量,buffers表示的是当前块缓存(buffer Cache)占用量。 Page Cache : 用于缓存文件的页数据 buffer Cache: 用于缓存块设备如磁盘的块数据 新系统
通过上述描述,我们可以 知道Page Cache与文件系统同级别的,buffer Cache是块物理上的概念,因此buffer Cache是与块设备驱动程序是同级别的。 Page Cache与buffer Cache共同的目的就是为了加速数据I/O: 写数据时首先要写到缓存,将写入的数据标记为dirty,想外部存储flash(简称回盘)。如果读取数据我们会先去缓存中读取,如果在缓存中未命中,我们再去外部存储中去读取,并将读取出来的数据加入到缓存中,并且操作系统总是积极的将所有的空闲内存都用作Page Cache和buffer Cache,当内存不够用时也会使用LRU等算法淘汰缓存。 Linux2.4之前,Page Cache与buffer Cache是完全分离的,但是块设备通常是磁盘,磁盘上的数据又大多通过文件系统来组织,这种设计方式会导致很多数据被缓存了两次。在LInux系统2.5版本之后,系统将两个快近似的融合在了一起,如果一个文件的页加载到了Page Cache,那么同时Buffer Cache只需要维护块指向页的指针就可以了。只有那些没有文件表示的块,或者绕过文件系统直接操作(dd命令)的块,才会真正的放到Buffer Cache里。后文所说的Page Cache基本上是Page Cache与buffer Cache的统称。 Page Cache的预读操作系统会为基于Page Cache的读缓存机制提供预读机制(PAGE_READAHEAD) 举个例子:用户想通过系统调用获取磁盘上文件的一段数据
经过上述操作,我们只是想通过read读取4KB的内容,但是系统预读取了16KB的内容。 2. Page Cache与文件持久化的一致性&可靠性现在LInux的Page Cache正如其名,是对磁盘上Page的内存缓存,同时可以用于读写操作。任何系统引入缓存,就会引发一致性问题:内存中的数据与磁盘中的数据不一致,例如后端常见的Redis缓存和MySQL数据库的一致性问题 吞吐量与数据一致性是一对不可调和的矛盾(硬件一致的情况下) 什么是文件文件其实是数据和元数据的组合,文件=数据+元数据。 元数据:用来描述文件的各种属性,元数据也必须存储在磁盘上 因此,我们在保证数据一致性的时候其实包含了两个方面:数据一致+元数据一致
文件一致性发生写操作的时候,我们会把对应的数据写到Page Cache中,如果此时数据还没有刷新到磁盘中,那么内存中的数据就领先于磁盘,此时Page就被称为Dirty page。 当前的lInux有两种方式实现文件一致性:
3. Page Cache的优势与劣势优势
劣势
参考:《Linux内核详解》 视频教程飞书加入团队一起创作: 关注公众号,一起探讨学习: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 14:24:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |