Memory

Table of Contents

1. Page Cache vs. Buffer Cache

磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

假设我们通过文件系统操作文件,那么文件将被缓存到Page Cache,如果需要刷新文件的时候,Page Cache将交给Buffer Cache去完成,因为Buffer Cache就是缓存磁盘块的。

也就是说,直接去操作文件,那就是Page Cache区缓存,用dd等命令直接操作磁盘块,就是Buffer Cache缓存的东西。(note: inode等读写操作都是直接针对磁盘的,所以也是通过Buffer Cache)

see Linux Kernel Development Chapter16 页高速缓存和页回写

2. Page Fault

Wikipedia http://en.wikipedia.org/wiki/Page_fault

Page Fault分为两种,minor fault和major fault,触发时机都是在进程访问虚拟页面的时候。

  • MnPF(Minor Page Fault): 如果访问虚拟页面时候,这个页出现在物理内存但是没有被MMU(Memory Management Unit)标记为载入的话,那么称为minor fault(MnPF). 这个时候MMU只需要标记载入并且做一些操作即可。这种情况可以考虑共享内存比如glibc动态链接库:全局维护一份glibc.so的动态链接库在物理内存,可能被很多进程所映射。一个进程刚启动的话,glibc没有在虚拟内存里面,但是可能会被其他进程已经载入了物理内存。
  • MnPF另外一种更加常见的情况是page cache. 一个进程写入文件的话,另外一个进程如果要读这个文件的话,可以直接从page cache(MnPF)而非disk(MPF)上获得。
  • MPF(Major Page Fault): 如果访问虚拟页面时候,这个页面没有出现在物理内存的话,那么可能有两种可能 a.没有从程序读入 b.之前存在但是被换出到swap. 但是无论如何都需要从磁盘读取页面,并且替换当前物理内存中的页面,这个过程就是major fault(MPF). 很明显major fault比minor fault要更耗时,因为major fault需要读取磁盘。

如果按照磁盘读寻道延迟10ms,传输1page(4KB)耗时/60MB/s=0.05ms/page(参考),相当载入页面需要耗时10ms . 而如果是minor fault的话仅仅是内存操作读写1个字节约为250ns(注意和page大小无关). 这就意味着耗时major fault是minor fault 40000=40K倍 。改善这个情况手可以压缩内存使用,改善内存访问,然后关掉swap分区等。


如果这个映射可以由内存中其他的页满足,就被称作轻微缺页(minor page fault)。它可能在进程内存增长过程中发生,从可用内存中映射一个新的页面;它也可能在映射到另一个存在的页时发生,例如从共享库中读一个页。

需要访问存储设备的缺页,例如访问未缓存映射到内存的文件,被称作严重缺页(major page fault)。