1. 课程导论:页缓存(Page Cache)的基本概念、在Linux存储栈中的位置、课程目标与学习路径
1.1 什么是页缓存(Page Cache)
页缓存(Page Cache)是 Linux 内核中用于缓存磁盘文件数据的内存区域。当进程读取文件时,内核会将数据从磁盘加载到物理内存中,并以 页(Page) 为单位(通常为 4KB)进行缓存。后续对该文件同一区域的读操作将直接从内存返回,避免昂贵的磁盘 I/O。
页缓存的核心价值在于:
- 加速文件访问:内存访问速度比磁盘快数个数量级(纳秒 vs 毫秒)。
- 减少磁盘磨损:减少物理磁盘的读写次数,延长存储设备寿命。
- 支持写回策略:写操作先修改内存中的缓存页,再异步写回磁盘,提升写入性能。
关键指标:页缓存命中率是衡量系统存储性能的重要指标。命中率越高,系统对磁盘的依赖越低,整体响应速度越快。在生产环境中,页缓存通常占用了系统大部分可用内存。
1.2 页缓存与文件页、匿名页的区别
| 类型 | 来源 | 回收方式 | 典型场景 |
|---|---|---|---|
| 文件页(File-backed Page) | 磁盘文件(普通文件、块设备) | 可回收(若未脏写,直接丢弃;若脏写,先写回磁盘) | 程序代码段、配置文件、日志文件 |
| 匿名页(Anonymous Page) | 进程堆、栈、mmap 匿名映射 | 需交换到 Swap 分区才能回收 | malloc 分配的内存、局部变量 |
| 共享内存页 | 进程间通信(IPC) | 类似匿名页,需 Swap 支持 | 数据库共享缓存、消息队列 |
1.3 页缓存在 Linux 存储栈中的位置
Linux 存储栈是一个分层架构,页缓存位于 虚拟文件系统(VFS) 与 块设备层 之间,是文件系统与物理存储之间的关键缓冲层。
关键理解:页缓存位于 VFS 之下、具体文件系统之上。当应用程序通过 read() 系统调用读取文件时,VFS 首先检查页缓存中是否已有该数据页。如果命中(Cache Hit),则直接返回;如果未命中(Cache Miss),则触发磁盘 I/O 将数据加载到页缓存中。
1.4 页缓存的生命周期
- 分配(Allocation):当进程首次读取文件块时,内核分配物理页框,将磁盘数据读入该页框。
- 使用(Usage):页缓存页被多个进程共享访问,内核维护引用计数和访问位。
- 脏页标记(Dirty):如果进程修改了缓存页中的数据,该页被标记为“脏页”,需要写回磁盘。
- 回收(Reclaim):当系统内存不足时,内核通过页面回收机制(Page Reclaim)选择并释放页缓存页。
- 写回(Writeback):脏页在回收前必须写回磁盘,由内核线程
flush或pdflush异步执行。
1.5 课程目标
本课程旨在帮助学员深入理解 Linux 内核页缓存回收机制,并掌握在内存压力场景下的系统调优方法。具体目标包括:
| 目标编号 | 目标描述 | 对应章节 |
|---|---|---|
| 1 | 理解页缓存的数据结构(address_space、radix tree / xarray) | 第 2-3 章 |
| 2 | 掌握页面回收算法(LRU 链表、双链策略、refault 检测) | 第 4-6 章 |
| 3 | 学会分析内存压力指标(PSI、vmstat、sar) | 第 7-8 章 |
| 4 | 掌握内核参数调优(vm.dirty_ratio、vm.swappiness、watermark) | 第 9-12 章 |
| 5 | 能够诊断并解决真实环境中的内存回收问题 | 第 13-15 章 |
1.6 学习路径
本课程共 15 章,建议按以下路径循序渐进:
学习建议:建议学员具备基本的 C 语言阅读能力和 Linux 操作经验。每章结束后,请务必在实验环境中运行相关命令(如
cat /proc/meminfo、vmstat 1)以加深理解。第 4-6 章涉及内核源码分析,建议配合 Linux 内核源码(版本 5.x 或 6.x)一起学习。
1.7 预备知识检查
在开始本课程之前,请确认您已掌握以下基础知识:
- Linux 进程地址空间布局(代码段、数据段、堆、栈)
- 虚拟内存与物理内存的映射关系(页表、MMU)
- 基本的文件 I/O 系统调用(open、read、write、close)
- 能够使用
free、top、ps等基础监控命令
如果对上述概念不熟悉,建议先复习《Linux 内核设计与实现》或《深入理解 Linux 内核》的相关章节。