free命令大家都经常使用,
taotaoma@tma-laptop1:~/kernel/linux-2.6$ free
total used free shared buffers cached
Mem: 5918476 1675260 4243216 0 157664 819004
-/+ buffers/cache: 698592 5219884
Swap: 0 0 0
各个内容的显示应该还算是简单明了的,唯一比较让人困惑的两项就是buffers和cached。一般的认识都是说buffers指的是元数据的数量,而cached是指文件的page cache的数量。那么真的是这样么?
其实现在的linux内核中对于缓存的管理都是以page的形式进行的,也就是说在系统底层只存在各种page,这些page保存在不同的tree 中,buffer这个概念实际上已经过时了,但是为了保持对过往系统的兼容性,linux内核中还保留了这个概念,并仍然用它来代表文件系统中的一些所谓的元数据,但是由于已经没有buffer了,那么free该怎么显示buffers呢?内核巧妙的利用了一个特性,那就是文件系统在读取元数据的时候一般都是通过它所对应的块设备来进行,也就是说元数据存储的page一般都是保存在块设备对应的tree中,而一般文件的page cache则是保存在它的宿主文件的tree中。有了这个假设,我们就可以通过统计所有在块设备的tree上的page来得出系统的buffers数量。
这一块对应的代码是这样的(以2.6.32的代码为例):
free是通过读取/proc/meminfo里面的数据来显示的,而/proc/meminfo的具体实现代码在Linux内核中的fs/proc/meminfo.c里面。
sysinfo.bufferram是通过函数si_meminfo得到的,查看si_memeinfo可以看到这样一行:
val->bufferram = nr_blockdev_pages();
而对应的函数就很简单了
long nr_blockdev_pages(void)
{
struct block_device *bdev;
long ret = 0;
spin_lock(&bdev_lock);
list_for_each_entry(bdev, &all_bdevs, bd_list) {
ret += bdev->bd_inode->i_mapping->nrpages;
}
spin_unlock(&bdev_lock);
return ret;
}
遍历所有的块设备,然后把所有的块设备tree上的pages数目加起来,然后返回,是不是一目了然呢!
问题到这里真的就结束了么?非也非也,这样的算法明显很不精确,因为如果我直接操作裸设备,那内核如何区分呢?大家可以做一个简单的测试。
echo 3 > /proc/sys/vm/drop_caches
free
dd if=/dev/sda of=/dev/null bs=1M count=1000
free (buffer的数量增加了1000M)
相信大家一定都看到了buffers的剧烈增长了吧!由于你像文件系统一样直接通过块设备来读取设备的内容,所以内核把你这次操作读取的page都算作了buffers,也就从侧面验证了free命令中计算buffers所用的算法。
写数据到文件系统的文件中:
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=200Mfile bs=100M count=2
free (cache的数量增加了200M, buffer几乎不变)
读文件系统的文件
echo 3 > /proc/sys/vm/drop_caches
if=14GB_largefile of=/dev/null bs=200M count=2
free (cached增加了13G多,buffers增加了10M左右)
结论:文件系统中的文件读写 对 caches消耗的影响很大。
而裸设备对
相关推荐
### Linux内存中Buffer与Cache的区别 #### 概述 Linux操作系统在管理内存资源时采用了高效且灵活的方法。当我们使用`free`命令查看系统的内存使用情况时,可能会注意到一个现象:即使系统似乎没有运行太多的应用...
### Linux内存管理中的Buffer与Cache区别详解 #### 一、引言 在现代操作系统中,内存管理是一项极其重要的任务,特别是在Linux这样的多用户多任务环境中。Linux系统在内存管理方面采取了许多高效的策略来提高系统...
当数据库需要读取或修改数据时,它会尝试首先从Buffer Cache中查找,而不是直接访问速度较慢的磁盘。这种机制大大提高了数据存取的效率,减少了I/O操作,进而提升了整体数据库性能。 Buffer Cache的工作原理是基于...
Linux 操作系统中内存 buffer 和 cache 的区别 在 Linux 操作系统中,内存 buffer 和 cache 是两个重要的概念,它们都是占用内存的,但是它们的作用和特点却不同。本文将详细介绍内存 buffer 和 cache 的概念、区别...
### Linux操作系统中内存buffer和cache的区别 #### 一、引言 在Linux操作系统中,内存管理是一项关键的技术,它直接影响到系统的性能和稳定性。本文将详细介绍Linux系统中内存buffer和cache的区别及其工作原理,...
用户可以通过sync命令强制将Buffer Cache中的未写入数据写入磁盘,以确保数据安全。 总之,Linux的Swap和Buffer Cache机制是内存管理的重要组成部分,它们在提供更大的内存使用空间和提高磁盘I/O效率的同时,也需...
在标题和描述中提到的问题,即"Linux下buff/cache占用过高",这是一个常见的系统性能优化问题,尤其是对于运行Java应用或者其他资源密集型服务的云服务器而言。这里我们将深入探讨buff/cache的作用、为何会占用过多...
预读机制预测用户可能需要的数据,提前从磁盘加载到Cache中,减少等待时间。而替换策略则决定何时将不再使用的Cache项替换出来,以腾出空间给新数据。Linux内核通常使用LRU(最近最少使用)算法来决定哪些Page或...
4. **LRU(Least Recently Used)算法**:Linux内核采用LRU策略来决定何时替换Page Cache或Disk Cache中的页面。这个算法的基本思想是,最近最少使用的页面最有可能在未来一段时间内不再被访问,因此应优先替换。LRU...
缓存(Cache)主要包含两种类型:页高速缓存(Page Cache)和块设备缓存(Buffer Cache)。页高速缓存用于存储文件系统的数据,当程序读取文件时,内核会尝试从缓存中直接获取,从而提高数据访问速度。块设备缓存则...
本文档提供了一项针对 Linux 缓冲区缓存(Buffer Cache)在运行 Oracle OLTP(在线事务处理)工作负载时的性能分析研究。通过一系列测试收集了缓冲区缓存命中率及测试运行时间数据,为理解该系统复杂操作提供了宝贵...
此外,理解Linux内核的缓冲区缓存机制(比如Page Cache和DMA Buffer)也是至关重要的,这些机制可以帮助系统更高效地处理I/O操作,减少CPU与外设之间的交互次数,从而提高整体性能。 总之,Linux缓冲区是优化系统...
为了提升文件系统访问速度,Linux内核会利用空闲内存来缓存文件数据(称为Page Cache)和其他类型的缓存(如Buffer Cache)。这样做的目的是减少磁盘I/O操作,从而提高系统性能。 然而,在某些情况下,用户可能会...
`buffer_head`是Linux内核中用于描述和管理块设备数据与内存缓冲区之间映射关系的关键结构。它的设计与演化反映了Linux内核在面对不断增长的性能和功能需求时,如何逐步优化和改进。通过`buffer_head`与`bio`、SLAB...
当程序需要访问某个文件时,如果该文件的数据已经在Cache中,那么系统可以直接从内存中获取,避免了较慢的磁盘读取,极大地提高了数据访问速度。Cache并不区分读取和写入,它既可以缓存读取的数据,也可以缓存待写入...
在文件层面上的数据会缓存到Page Cache中,Page Cache中的数据需要刷新时,会交给Buffer Cache。 Buffer Cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到Buffer Cache中...
Linux操作系统中内存buffer和cache的区别.docx Linux服务器环境搭建(设置).pdf linux简明维护手册.pdf Linux系统命令及其使用详解.doc Linux系统性能监控工具.doc Linux系统整体性能监控工具详解.doc nmon on Linux ...
Linux的buffer cache机制在RAID中扮演关键角色,它缓存数据以提高I/O性能。Buffer cache将数据暂存于内存中,减少对磁盘的直接访问,加快读写速度。 在实现机制上,Software RAID通常利用md(multiple devices)子...
匿名页和文件页是Linux内存管理中的一种概念,用于描述进程的虚拟地址空间中不同的内存区域。 缺页异常是Linux内存管理中的一种机制,用于处理MMU在翻译虚拟地址时出现的错误。 EPT(Extended Page-Table ...
- **为何占用高**:如果一个程序频繁地读写文件,那么这些数据会被缓存到buffer/cache中,即使该程序结束运行,这些缓存也不会立即被释放,而是保留起来供其他程序使用。这有助于提高后续程序的执行效率。 - **是否...