分类: LINUX
2010-08-19 19:13:28
页高速缓存(cache)是Linux内核实现的一种主要磁盘缓存。它主要减少对磁盘的I/O操作。具体的讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。
页高速缓存是由RAM中的物理页组成的,缓存中每一页都对应着磁盘中的多个块。每当内核开始执行一个页I/O操作时(通常是对普通文件中页大小的块进行磁 盘操作),首先会检查需要的数据是否在高速缓存中,如果在,那么内核就直接使用高速缓存中的数据,从而避免访问磁盘。
我们可以看一下页高速缓存封装的操作和数据,在页I/O操作中,比如执行read()和write()时,页缓存最常被用到。每次页I/O操作都要处理数据的全部页面,这就需要对一个以上的磁盘块进行操作,所以页高速缓存实际缓存的是页面大小的文件块。
块I/O操作每次操作一个单独的磁盘块,比如读写索引节点就是一个典型的块I/O操作。内核提供bread()底层函数从磁盘读取单个块,通过缓冲,这些磁盘块被映射到内存中相应的页面上,这样,也就被缓存到页高速缓存里了。
由此看来,我们可以通过块I/O缓冲区把独立的磁盘块与页告诉缓存联系在一起。
15.1 页高速缓存
顾名思义,页高速缓存的是页面。缓存中的页来自对正规文件、块设备文件和内存映射文件的读写,如此一来,页告诉缓存内疚包含了最近被访问过的文件的全部页 面。在执行I/O操作之前,比如read()操作,内核会检查数据是否已经在高速缓存中了,如果所需要数据确实在高速缓存中,那么内核可以马上从缓存中得 到所需要的页,而不需要从磁盘中读取数据。
15.4 pdflush后台例程
由于页高速缓存的缓存作用,写操作实际上会被延迟。当页告诉缓存中的数据比后台存储的数据更新时,那么该数据就被称作脏数据。在内存中累积起来的脏页最终必须被写回磁盘。在以下两种情况发生时,脏页被写回磁盘:
(1)当空闲内存低于一个特定的阀值时,内核必须将脏页写回磁盘,以便释放内存。
(2)当脏页在内存中驻留时间超过一个特定的阀值时,内核 必须将超时的脏页写回磁盘,以确保脏页不会无限期的驻留在内存中。
首先,pdflush线程在系统中的空闲内存低于一个特定的阀值时,将脏页刷新回磁盘。特定的内存阀值可以通过drity_background_ratio sysctl系统调用设置。
其次,pdflush后台例程会被周期性唤醒,将那些在内存中驻留时间过长的脏页写出,确保内存中不会有长期存在的脏页。
系统管理员可以在/proc/sys/vm中设置回写的相关参数,也可以通过sysctl系统调用来设置他们。