什么是PageCache
Page cache(页缓存)是操作系统中常见的一种缓存机制,用于提高系统对磁盘访问的性能。它是将磁盘上的数据加载到内存中,并在需要时直接从内存读取数据,而不必每次都去读取磁盘。
PageCache要点
- 缓存层级:Page Cache 所占用的内存位于操作系统的内核空间中,通常与其他缓存层级(如CPU缓存、磁盘缓存)分开管理。这样的分层结构有助于提供不同层级的读取性能。
- 缓存策略:Page Cache 是基于缓存策略来工作的。常见的策略有 Least Recently Used (LRU)、Least Frequently Used (LFU) 等。根据策略,操作系统会决定哪些文件数据应该被保留在缓存中,哪些应该被淘汰。
- 异步写回:Page Cache 采用异步写回机制,即将被修改的文件数据先写入缓存,而非立即写入磁盘。当缓存空间不足或达到一定条件时,操作系统会触发异步写回,将脏数据(已修改但未写回磁盘的数据)写入磁盘。
- 文件映射:Page Cache 可以通过内存映射文件(Memory-Mapped Files)的方式实现,将磁盘上的文件直接映射到进程的地址空间中。这样,文件的读取操作就可以直接在缓存中进行,无需额外的数据拷贝。
- 与应用程序交互:应用程序通过文件系统的 API(如 POSIX API 或 Java 的 I/O 类)与 Page Cache 进行交互。应用程序可以通过读取和写入文件的方式访问缓存中的文件数据。
Page Cache 在磁盘 I/O 的效率方面起到了重要作用,对于许多读取密集型的应用程序(如数据库、Web 服务器等)尤为关键。它提供了一种高效的机制,将常用的文件数据缓存在内存中,减少了磁盘读取的延迟,提高了系统的整体性能。
PageCache读写流程
读取流程
- 应用程序向操作系统发起文件读取请求,指定读取的文件和位置。
- 操作系统首先会检查 Page Cache 中是否已经存在所需数据的页(通常是4KB或更大的数据块)。如果存在,则直接将数据从 Page Cache 返回给应用程序。
- 如果所需数据不在 Page Cache 中,操作系统则向存储设备(如磁盘)发出读取请求,将数据读入到 Page Cache 中的空闲页中。
- 一旦数据被加载到 Page Cache 中,操作系统将数据从 Page Cache 复制到应用程序的内存空间中,完成读取过程。
写入流程
- 应用程序向操作系统发起文件写入请求,指定写入的文件和位置,并提供需要写入的数据。
- 操作系统首先将数据写入到 Page Cache 中的一个或多个页,更新对应的页标志位表示该页已被修改。
- 操作系统会以异步方式将脏数据(已修改但未写回磁盘的数据)定期或在适当的时机,通过写回机制将数据从 Page Cache 写入到磁盘中。
- 一旦数据被成功写入磁盘,操作系统将通知应用程序写入操作已完成。
注意点
- Page Cache 的写入是以页为单位进行的,而不是以单个字节或文件块为单位。这意味着,即使应用程序只修改了一个字节,操作系统也会将整个页(通常是4KB)标记为脏数据并进行写回。
查看PageCache使用情况
- 'free -g'命令,cache列就是pagecache占用大小
- 'sar -B 1'命令,监控pagecache指标
pgpgin/s: 每秒从磁盘读取到内存中的页面数量(以页为单位)。pgpgout/s: 每秒从内存写入到磁盘的页面数量(以页为单位)。fault/s: 每秒产生的缺页错误数量。majflt/s: 每秒产生的主要(major)缺页错误数量,需要从磁盘读取页面。pgfree/s: 每秒释放的空闲页面数量。pgscank/s: 每秒扫描的页面数量。pgscand/s: 每秒被扫描并且决定需要移动的页面数量。pgsteal/s: 每秒被移动到换入队列的页面数量。%vmeff: 页面换入效率。