面试知识库
进阶

PageCache机制#

一句话答案#

Page Cache 是 OS 将磁盘文件缓存在内存中的页,读写先走缓存,Kafka 高性能的重要原因之一。

核心要点

读: 先查 Page Cache → 命中直接返回 → 未命中从磁盘加载并缓存

写: 先写 Page Cache(脏页)→ 后台 pdflush 异步刷盘

应用: Kafka 高性能的重要原因之一(顺序写 Page Cache + sendfile)

面试回答(2分钟版)

Page Cache是操作系统级别的磁盘文件缓存机制,它把磁盘上的文件内容按页为单位缓存在内存中。读文件时先查Page Cache,命中就直接从内存返回,未命中才从磁盘加载进来并缓存;写文件时先写入Page Cache形成脏页,由后台的pdflush线程异步刷盘,这样读写都能获得接近内存的速度。Kafka高性能的一个重要原因就是充分利用了Page Cache:生产者的消息顺序追加写入日志文件,天然命中Page Cache的顺序写优化;消费者读取时如果消息还在Page Cache中就直接从内存读取,再配合sendfile零拷贝直接把数据从Page Cache发送到网卡。需要注意的是Page Cache是OS管理的不是应用层缓存,它和应用层的Buffer Pool(比如MySQL的InnoDB Buffer Pool)不是一回事。另外异步刷盘存在断电丢数据的风险,如果对数据可靠性要求极高可以用fsync强制同步刷盘,但会显著影响性能。

追问与易错

追问方向:

  • “脏页刷盘策略?”→ 后台 pdflush/writeback 线程定期刷盘(dirty_expire_centisecs 控制过期时间)+ 脏页比例超阈值触发(dirty_ratio)+ 手动 fsync/fdatasync 强制刷
  • “PageCache 会导致数据丢失吗?”→ 会,异步刷盘意味着断电时脏页未持久化会丢失;需要高可靠性的场景用 fsync 强制同步刷盘(如数据库 WAL),但性能代价大
  • “Kafka 为什么依赖 PageCache?”→ 生产者顺序追加写天然利用 PageCache 顺序写优化;消费者读取时消息通常还在 PageCache 中直接从内存返回,配合 sendfile 零拷贝发送到网卡

易错点:

  • ❌ PageCache 等于应用层缓存——是 OS 级别的
  • ❌ fsync 频繁调用没问题——开销大影响性能