Linux 内存高速缓存(cache)类型分析

在Liunx内存管理机制中,除了对目录项(dentry,Linux文件系统中某个inode的链接)进行缓存外,

还采取了两种高速缓存,即Buffer Cache和Page Cache,前者针对磁盘块的读写,后者针对文件inode的

读写。通过增加这些Cache,有效缩短 I/O时间。

先通过free命令查看内存使用情况:

                 free -m

                    total       used       free     shared    buffers     cached

Mem:         32176      30032       2144          0        249      25938

-/+ buffers/cache:       3844      28332

Swap:            0          0          0

返回结果中,buffer和cache说明两种前面提及的两种高速缓存使用内存情况,其中:

Buffers :说明缓存块设备读写的内存大小(buffer cache),这部分缓存主要用于

目录项、inode等文件系统元数据。如果ls一个包含很多内容的目录,可以

发现这个值明显增大。

Cache   :说明用于缓存文件系统读写的内存大小(page cache),这部分缓存主要用于

打开的文件,如果 cache 的值很大,说明缓存的文件较多,在进行读写时,命

中率也将提高,如果频繁访问到的文件大部分被缓存,则必然减少磁盘的读IO。

It is similar like “Buffers”, only this time it caches pages from file reading.

两种cache处理数据采用策略是不同的,具体如下:

buffer采用先进先出策略,cache则采用最少使用原则(LRU),即对于buffer缓存来说,

当缓存的内容达到其最大容量时,最先缓存的内容被清空,对于cache来说,当缓存的内容达到

其最大容量时,最少被访问的内容被清空。

释放不同高速缓存的方法是通过修改/proc文件系统相关参数,/proc是Linux虚拟文件系统,

通过对其进行读写操作实现与用户空间和内核空间的通信。即通过修改/proc中的内容,对当前kernel

的行为做出调整。内存缓存释放是通过调整/proc/sys/vm/drop_caches的值实现。

具体规则如下:

1)释放page cache

                     echo 1 > /proc/sys/vm/drop_caches
              2)是否VFS目录项和文件系统inodes
echo 2 > /proc/sys/vm/drop_caches
3)释放 pagecache,VFS目录向和inodes
echo 3 > /proc/sys/vm/drop_caches
        其实在具体的应用中,不需要手动是否内存高速缓存,因为linux提供了相关机制来实现对这些高速
的最优控制,除非你看着不爽。其实查看实际的可以内存不是看free返回的第一行,而是看第二行,即

-/+ buffers/cache:       3844      28332

        其中3844是实际已经使用的内存大小,28332是可用内存大小,前面的 -/+ buffers/cache是指:
        实际使用内存=used-buffers-cached
        实际可用内存=free+buffers-cached

Tagged: ,

Comments are closed.