描述
Page Cache本身是操作系统的概念. ES只是很自然的用到了这个概念.
操作系统视角
从操作系统的角度, page cache也称为disk cache, 是操作系统对硬盘(HDD or SSD)的缓存. OS 使用当前空闲的RAM来保存page cache, 用来加速对硬盘的访问. page cache在内核实现, 对应用程序几乎是透明的.
一般操作系统会把全部空闲的内存用作page cache. 因为被分配用作page cache的内存非常容易就可以被重新声明为可被应用使用的空闲内存, 这个过程几乎没有性能损耗, 操作系统甚至可以直接把用作page cache的内存报告为空闲内存.
ES视角
因为Lucene的segment文件都是不可变的, 因此可以非常好的利用page cache.
在以下这些时候, page cache会失效, 需要重新读取硬盘:
- 当产生新段的时候(提交新段, 段合并).
- 内存满了, 有些page cache被kernel通过类似LRU的算法释放了.
- 操作系统重启.
缓存内容
page cache的缓存内容就是索引文件.
可配置项
可以配置page cache预先读取. 主要是解决操作系统重启后造成的page cache失效问题. 如果使用这一项的话需要确保内存足够装下所有索引文件.
详情参考:
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/preload-data-to-file-system-cache.html
Q&A
- page cache怎么集成到ES的?
- ES, Lucene这些都属于运行在操作系统上的应用程序, 而page cache是操作系统级别的, 从ES, Lucene的视角是不需要特意使用page cache的. 当Lucene读取索引文件的时候, 会自动使用page cache做索引文件的缓存.
- page cache的存储粒度是什么?
- 存储粒度是每个索引的文件, 如.nvd, .dvd等.
- page cache什么时候失效?
- 当产生新段的时候(提交新段, 段合并).
- 内存满了, 有些page cache被kernel通过类似LRU的算法释放了.
- 操作系统重启.
- page cache的淘汰算法是怎么样的?
- 据说是用了类似LRU的算法, 如果要了解详情, 应该需要看操作系统内核的实现.