首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
开篇词 | 如何让Linux内核更好地服务应用程序?
01 基础篇 | 如何用数据观测Page Cache?
02 基础篇 | Page Cache是怎样产生和释放的?
03 案例篇 | 如何处理Page Cache难以回收产生的load飙高问题?
04 案例篇 | 如何处理Page Cache容易回收引起的业务性能问题?
05 分析篇 | 如何判断问题是否由Page Cache产生的?
06 基础篇 | 进程的哪些内存类型容易引起内存泄漏?
07 案例篇 | 如何预防内存泄漏导致的系统假死?
08 案例篇 | Shmem:进程没有消耗内存,内存哪去了?
09 分析篇 | 如何对内核内存泄漏做些基础的分析?
10 分析篇 | 内存泄漏时,我们该如何一步步找到根因?
11 基础篇 | TCP连接的建立和断开受哪些系统配置影响?
12 基础篇 | TCP收发包过程会受哪些配置项影响?
13 案例篇 | TCP拥塞控制是如何导致业务性能抖动的?
14 案例篇 | TCP端到端时延变大,怎样判断是哪里出现了问题?
15 分析篇 | 如何高效地分析TCP重传问题?
16 套路篇 | 如何分析常见的TCP问题?
17 基础篇 | CPU是如何执行任务的?
18 案例篇 | 业务是否需要使用透明大页:水可载舟,亦可覆舟?
19 案例篇 | 网络吞吐高的业务是否需要开启网卡特性呢?
20 分析篇 | 如何分析CPU利用率飙高问题 ?
21 | 我是如何使用tracepoint来分析内核Bug的?
当前位置:
首页>>
技术小册>>
Linux内核技术实战
小册名称:Linux内核技术实战
### 02 基础篇 | Page Cache是怎样产生和释放的? 在深入探讨Linux内核中的Page Cache机制之前,我们先简要回顾一下其基本概念和重要性。Page Cache,即页面缓存,是Linux内核中用于缓存磁盘数据到内存中的一种高效机制。它极大地提高了文件系统的读写性能,减少了对磁盘的直接访问次数,因为磁盘访问相比内存访问要慢得多。本章节将详细解析Page Cache的产生、管理以及释放过程,帮助读者深入理解Linux内核中的这一核心功能。 #### 一、Page Cache的产生 Page Cache的产生主要发生在以下几种情况中: ##### 1.1 读取文件操作 当用户程序或内核自身需要读取存储在磁盘上的文件数据时,Linux内核会首先检查Page Cache中是否已经缓存了所需的数据。如果没有(即发生缓存未命中),内核会触发磁盘I/O操作,将数据从磁盘读取到内存中,并存储在Page Cache中。这一过程中,内核会尽可能多地读取相邻的数据块(称为“预读”),以期望未来的读取操作能够直接从缓存中命中,进一步提高效率。 ##### 1.2 写入文件操作 对于写操作,情况略有不同。写数据到文件时,Linux通常采取“写时复制”(Copy-on-Write, COW)策略来优化性能。即,当数据被写入时,内核首先检查Page Cache中是否有足够的空间来存储新数据。如果有,新数据会被直接写入Page Cache中对应的页面,并且标记这些页面为“脏”(Dirty),表示它们的数据还未被写回到磁盘上。这种延迟写回磁盘的机制减少了磁盘I/O操作,提升了性能。 ##### 1.3 内核缓存数据 除了文件系统的数据,内核自身也会利用Page Cache来缓存各种类型的数据,如内核模块的加载、网络缓冲区等。这些数据的缓存同样遵循Page Cache的管理原则,以提高系统的整体性能。 #### 二、Page Cache的管理 Page Cache的管理涉及多个方面,包括缓存的分配、查找、更新和同步等。 ##### 2.1 缓存分配 Linux内核通过伙伴系统(Buddy System)来管理物理内存页面的分配。当需要为Page Cache分配空间时,内核会请求伙伴系统提供足够的连续物理页面。这些页面随后被映射到虚拟地址空间,并初始化为适当的状态(如干净或脏),以供后续使用。 ##### 2.2 缓存查找 查找Page Cache通常涉及对内存中的页表以及特定于文件系统的数据结构(如inode和dentry)的遍历。Linux内核通过哈希表或红黑树等高效数据结构来加速这一过程,确保在复杂的文件系统中也能快速定位到缓存的数据。 ##### 2.3 缓存更新 当Page Cache中的数据被修改时(如通过写操作),这些页面会被标记为脏。内核会跟踪脏页面的数量,并在适当的时机(如脏页面数量达到一定阈值或系统空闲时)触发回写操作,将这些数据同步到磁盘上。 ##### 2.4 缓存同步 缓存同步是确保数据一致性的关键步骤。Linux内核通过几种机制来实现这一点,包括定期的回写任务(如kswapd守护进程和pdflush/flush/writeback线程)、以及通过fsync()和fdatasync()等系统调用强制同步特定文件或文件系统的数据。 #### 三、Page Cache的释放 随着系统的运行,Page Cache会逐渐占用大量的内存资源。为了保持系统的稳定性和响应性,Linux内核需要有效地管理Page Cache的释放。 ##### 3.1 内存压力与回收 当系统内存不足时(如通过内存分配请求失败触发OOM killer或达到特定水位线),内核会启动内存回收过程。这一过程包括多个步骤,如回收可回收的slab分配器对象、扫描并回收LRU(最近最少使用)列表中的页面等。对于Page Cache而言,脏页面会被优先考虑回写到磁盘以释放内存,而干净页面则可以直接从内存中移除。 ##### 3.2 缓存淘汰策略 Linux内核采用了一系列复杂的缓存淘汰策略来决定哪些页面应该被释放。这些策略包括但不限于LRU、时钟算法(Clock Algorithm)及其变种(如第二次机会算法)、以及针对特定工作负载优化的策略(如针对大文件传输的FIFO策略)。通过这些策略,内核能够在保证系统性能的同时,有效地管理Page Cache的大小。 ##### 3.3 缓存压缩与去重 在一些较新的Linux内核版本中,还引入了缓存压缩和去重技术来进一步减少内存占用。这些技术通过压缩存储在Page Cache中的数据或识别并合并重复的数据块来减少内存使用,从而在有限的物理内存资源下支持更大的缓存容量。 #### 四、总结 Page Cache作为Linux内核中提高文件系统性能的重要机制,其产生、管理和释放过程涉及多个复杂的子系统和技术。通过深入了解这些过程,我们可以更好地理解Linux内核的内存管理策略,以及如何通过优化Page Cache的使用来提升系统性能。在实际应用中,合理配置和调整Page Cache的相关参数和策略,对于确保系统的稳定性和高效性至关重要。
上一篇:
01 基础篇 | 如何用数据观测Page Cache?
下一篇:
03 案例篇 | 如何处理Page Cache难以回收产生的load飙高问题?
该分类下的相关小册推荐:
从零开始学微服务
Docker容器实战部署
etcd基础入门与实战
系统性能调优必知必会
Linux性能优化实战
云计算那些事儿:从IaaS到PaaS进阶(四)
云计算Linux基础训练营(下)
从 0 开始学架构
架构师成长之路
Redis入门到实战
Ansible自动化运维平台
构建可视化数据分析系统-ELK