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没有在虚拟内存里面,但是可能会被其他进程已经载入了物理内存。 #note: 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分区等。

comments powered by Disqus