linux buff/cache

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux buff/cache相关的知识,希望对你有一定的参考价值。

参考技术A

要理解下面内容,最好对操作系统存储有一定的了解,包括缺页中断等对于物理内存的使用方式和cpu操作硬盘的大概过程等。

linux存在系统buff/cache和CPU cache不同的缓存机制,系统的buff/cache是用于提高硬件IO的操作效率,cpu cache的左右是提高cpu操作内存的效率,这摘抄部分关于系统cache的内容,关于cpu内容的后续会补上。

我们在用户层面上对磁盘文件的各种访问,体现在内核里,则最终转化为针对磁盘(块设备)的一系列I/O操作。

扇区是块设备的基本单元,也是最小的寻址单元,但是内核却并不是按照扇区来执行磁盘操作,而是于扇区之上又抽象出了一个“块”的概念。内核执行的所有磁盘操作都是按照块来进行的,每个块的大小必须数倍于扇区,而且不能超过一个页面的长度,所以块通常的大小是512Byte、1KB或者4KB。

内核只能基于块来访问物理文件系统,所以与扇区是块设备的最小寻址单元相对应,块也被称为是文件系统的最小寻址单元。一个磁盘块被调入内存时,它需要存储在一个缓冲区中,这个缓冲区就是块在内存中的表示,它在内核中使用structbuffer_head来描述。每个块在内存中都与一个缓冲区相对应,同时都拥有一个buffer_head对象。

内核只能基于块来访问物理文件系统,所以与扇区是块设备的最小寻址单元相对应,块也被称为是文件系统的最小寻址单元。一个磁盘块被调入内存时,它需要存储在一个缓冲区中,这个缓冲区就是块在内存中的表示,它在内核中使用structbuffer_head来描述。每个块在内存中都与一个缓冲区相对应,同时都拥有一个buffer_head对象。

因为内核基于块来访问物理文件系统,而磁盘块与内存中的缓冲区又是一一对应的映射关系,所以为了提高对磁盘的存取效率,内核引入了缓冲区缓存的机制,将通过VFS访问的块的内容缓存在内存中。

在旧版本的内核中,page cache和buffer cache是两个独立的缓存, 前者缓存页,后者缓存块,但是一个磁盘块可以在两个缓存中同时存在,因此除了耗费了额外的内存外,还需要对两个缓存中的内容进行同步操作。 从2.4.10内核开始,buffer cache不再是一个独立的缓存,如图10.8所示的那样,它被包含在page cache中,通过page cache来实现。 对于4KB大小的page来说,根据不同的块大小,它可以包含1~8个缓冲区。

摘自《linux内核修炼之道》

Linux 服务器buff/cache清理

使用Top命令查看内存及缓冲区使用情况

当磁盘频繁产生IO时会导致buff/cache占用很高的内存,导致可用物理内存很少

但是当真正需要内存时,缓冲区内存会自动释放.

如果需要清理可以用

cache清理   sync;echo 3 > /proc/sys/vm/drop_caches

前面加sync 是为了防止内容丢失

free pagecache:echo 1 >/proc/sys/vm/drop_caches

To free dentries and inodes:echo 2 >/proc/sys/vm/drop_caches

二者都清理就是  sync;echo 3 > /proc/sys/vm/drop_caches

以上是关于linux buff/cache的主要内容,如果未能解决你的问题,请参考以下文章

buff/cache设置上线

linux内存在buff/cache中

Linux [buff/cache]内存缓存占用过高分析和优化

pre cache 占用高 jvm

Linux内核中sk_buff结构详解

Linux内核中sk_buff结构详解