Linux PageCache

759 阅读4分钟

什么是PageCache

Page cache(页缓存)是操作系统中常见的一种缓存机制用于提高系统对磁盘访问的性能。它是将磁盘上的数据加载到内存中,并在需要时直接从内存读取数据,而不必每次都去读取磁盘。

PageCache要点

  1. 缓存层级:Page Cache 所占用的内存位于操作系统的内核空间中,通常与其他缓存层级(如CPU缓存、磁盘缓存)分开管理。这样的分层结构有助于提供不同层级的读取性能。
  2. 缓存策略:Page Cache 是基于缓存策略来工作的。常见的策略有 Least Recently Used (LRU)、Least Frequently Used (LFU) 等。根据策略,操作系统会决定哪些文件数据应该被保留在缓存中,哪些应该被淘汰。
  3. 异步写回:Page Cache 采用异步写回机制,即将被修改的文件数据先写入缓存,而非立即写入磁盘。当缓存空间不足或达到一定条件时,操作系统会触发异步写回,将脏数据(已修改但未写回磁盘的数据)写入磁盘。
  4. 文件映射:Page Cache 可以通过内存映射文件(Memory-Mapped Files)的方式实现,将磁盘上的文件直接映射到进程的地址空间中。这样,文件的读取操作就可以直接在缓存中进行,无需额外的数据拷贝。
  5. 与应用程序交互:应用程序通过文件系统的 API(如 POSIX API 或 Java 的 I/O 类)与 Page Cache 进行交互。应用程序可以通过读取和写入文件的方式访问缓存中的文件数据。

Page Cache 在磁盘 I/O 的效率方面起到了重要作用,对于许多读取密集型的应用程序(如数据库、Web 服务器等)尤为关键。它提供了一种高效的机制,将常用的文件数据缓存在内存中,减少了磁盘读取的延迟,提高了系统的整体性能。

PageCache读写流程

读取流程

  1. 应用程序向操作系统发起文件读取请求,指定读取的文件和位置。
  2. 操作系统首先会检查 Page Cache 中是否已经存在所需数据的页(通常是4KB或更大的数据块)。如果存在,则直接将数据从 Page Cache 返回给应用程序。
  3. 如果所需数据不在 Page Cache 中,操作系统则向存储设备(如磁盘)发出读取请求,将数据读入到 Page Cache 中的空闲页中。
  4. 一旦数据被加载到 Page Cache 中,操作系统将数据从 Page Cache 复制到应用程序的内存空间中,完成读取过程。

写入流程

  1. 应用程序向操作系统发起文件写入请求,指定写入的文件和位置,并提供需要写入的数据。
  2. 操作系统首先将数据写入到 Page Cache 中的一个或多个页,更新对应的页标志位表示该页已被修改。
  3. 操作系统会以异步方式将脏数据(已修改但未写回磁盘的数据)定期或在适当的时机,通过写回机制将数据从 Page Cache 写入到磁盘中。
  4. 一旦数据被成功写入磁盘,操作系统将通知应用程序写入操作已完成。

注意点

  • Page Cache 的写入是以页为单位进行的,而不是以单个字节或文件块为单位。这意味着,即使应用程序只修改了一个字节,操作系统也会将整个页(通常是4KB)标记为脏数据并进行写回。

查看PageCache使用情况

  1. 'free -g'命令,cache列就是pagecache占用大小 image.png
  2. 'sar -B 1'命令,监控pagecache指标 image.png
  • pgpgin/s: 每秒从磁盘读取到内存中的页面数量(以页为单位)。
  • pgpgout/s: 每秒从内存写入到磁盘的页面数量(以页为单位)。
  • fault/s: 每秒产生的缺页错误数量。
  • majflt/s: 每秒产生的主要(major)缺页错误数量,需要从磁盘读取页面。
  • pgfree/s: 每秒释放的空闲页面数量。
  • pgscank/s: 每秒扫描的页面数量。
  • pgscand/s: 每秒被扫描并且决定需要移动的页面数量。
  • pgsteal/s: 每秒被移动到换入队列的页面数量。
  • %vmeff: 页面换入效率。