目录
什么是 Buffer/Cache?
在 Linux 内存管理中,Buffer
和 Cache
是两个重要的概念。它们的作用如下:
Buffer Cache(缓冲区缓存):
在 Linux 2.4 中,
Buffer
主要用于缓存尚未写入磁盘的数据。在 Linux 2.6 及之后版本中,
Buffer
被用作块设备层的缓存,负责裸设备相关的缓存操作。
Page Cache(页面缓存):
在 Linux 2.4 中,
Cache
主要用于缓存从磁盘读取的数据。在 Linux 2.6 及之后版本中,
Page Cache
统一了文件层的缓存,负责文件系统的缓存工作。
简单来说:
Buffer
负责块设备的缓存。Page Cache
负责文件系统的缓存。
Buffer 的具体职责
Buffer
主要用于块设备的读写操作。它作为缓存来使用,确保对块设备的操作更加高效。例如,在格式化文件系统时,Buffer
会缓存这些操作。
当对文件进行写操作时,Buffer
会标记哪些部分被修改,并在后续的脏数据回写(writeback)过程中,只写回修改的部分,而不是整个页面。
Cache 的具体职责
Page Cache
主要用于文件系统的读写操作。当进程对文件进行读写时,Page Cache
会缓存这些数据,以提高访问速度。此外,mmap
系统调用也会使用 Page Cache
来将文件映射到内存。
由于 Page Cache
负责文件类型的缓存,因此它也处理大部分块设备文件的缓存工作。
如何回收 Buffer/Cache?
Linux 内核会在内存不足时自动触发内存回收,但这并不是没有成本的。特别是当 Page Cache
中存在未同步的数据时,内核需要先将这些数据写回到磁盘,这会导致 I/O 操作增加。
你可以通过以下命令手动清除缓存:
echo 1 > /proc/sys/vm/drop_caches # 清除页面缓存
echo 2 > /proc/sys/vm/drop_caches # 清除目录项和 inode
echo 3 > /proc/sys/vm/drop_caches # 清除页面缓存、目录项以及 inode
需要注意的是,这些命令只能在执行时生效,过一段时间后内存又会被占用。如果你希望长期保持较低的内存占用,可以考虑调整内核参数或优化应用程序的内存使用。