Linux_free(buffer与cache区别)

本文深入解析Linux中buffers与cache的区别,包括它们各自的作用、与内存使用的关系,以及内存交换条件与方式。重点阐述了buffers与cached的区别,并通过实验验证了它们在内存管理中的实际应用。

Linux_free(buffer与cache区别)

一、free命令
[root@xen_202_12 /]# free -m
             total       used       free     shared    buffers     cached
Mem:          3072       2459        612          0        207       1803
-/+ buffers/cache:        447       2624
Swap:         1913          0       1913

第2行:
total 内存总数: 3072
used 已经使用的内存数: 2459
free 空闲的内存数: 612
shared 当前已经废弃不用,总是0
buffers: Buffer Cache内存数: 13220
cached: Page Cache内存数: 2720160

关系:total = used + free

第3行:
-/+ buffers/cache的意思:
-buffers/cache 的内存数: 447 (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 2624 (等于第1行的 free + buffers + cached)
注:此处的内存数在用上面式子计算后,在大小上有一点点出入(还不知道是什么原因)。

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

第4行单独针对交换分区。

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(如read,write,getdents)的时间。

第2行(mem)的used/free与第3行(-/+ buffers/cache) used/free的区别:
这两个的区别在于使用的角度.第2行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是612MB,已用内存是2059MB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第3行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是可用的,因为buffer/cached是为了提高文件读取的性能而设,当应用程序要用到内存的时候,buffer/cached会很快地被回收。所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.

如上例:
2624= 612+207+1803


二、buffers与cached的区别:

buffers是用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages。
cached用来给文件做缓冲。
即:buffers是用来存储目录里面有什么内容,权限等等,而cached用来记忆我们打开的文件.


如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man kill ,你就可以明显的感觉到第二次的开打的速度快很多。
实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。
#free
#man kill
#free
#man kill
#free
比较一下free先后显示的buffers的大小。
另一个实验:
#free
#ls /dev
#free
比较一下两个的大小,当然这个buffers随时都在增加,但有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

因为Linux会将暂时不使用的内存作为文件和数据缓存,以提高系统性能,当应用程序需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles)  

内存交换条件及方式:

当可用内存少于额定值的时候,就会开始进行交换.
如何看额定值(RHEL4.0)
#cat /proc/meminfo
交换将通过三个途径来减少系统中使用的物理页面的个数:
1.减少缓冲与页面cache的大小;
2.将系统V类型的内存页面交换出支;
3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。
事实上,少量地使用swap是不会影响到系统性能的。


如果感兴趣可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。

参考内核代码:

arch/i386/mm/init.c
fs/proc/proc_misc.c
include/linux/swap.h
mm/filemap.c
fs/buffer.c

另外还可以参考O'REILLY的书《Understanding the LINUX KERNEL》。 

原文地址:http://hi.baidu.com/kong_kongyi/item/10356d152d845ba8feded5f5

转载于:https://www.cnblogs.com/cloudma/articles/linux-free.html

<think>嗯,用户这次问的是Linux内存管理中buffercache区别,这是个经典问题。从引用内容看,用户已经查阅了一些资料,但可能对概念仍有混淆。需要把专业术语转化成容易理解的语言。 用户上次询问的是Linux单用户模式,这次突然转向内存管理,可能是工作中遇到性能问题。考虑到ta能引用技术文档,应该是有一定Linux基础的系统管理员或开发人员。 核心要讲清楚三点:一是数据流向(磁盘←→内存←→应用),二是读写场景差异,三是实际性能影响。引用[3]的解释最准确:Buffer是磁盘块的缓存,Cache是文件内容的缓存。这个区分很关键。 特别要注意引用[5]提到的细节:Buffer其实也用于读磁盘,Cache也用于写文件。这点容易让人困惑,需要举例说明。比如用dd命令直接写磁盘块会经过Buffer,而用vim修改文件则通过Cache。 用户可能真正想知道的是:服务器内存被大量占用时,该优先清理Buffer还是Cache?这需要补充说明内核自动回收机制,但当前问题没问就不展开。 数学公式方面,只需用$...$标注简单符号,比如内存大小$S_{buffer}$。复杂公式反而不利于理解这个主题。最后要生成相关问题帮用户深化学习,比如如何手动释放Cache。</think>在 Linux 内存管理中,**Buffer** 和 **Cache** 都是内存的临时存储区域,用于提升 I/O 性能,但核心区别在于**数据来源和用途**: --- ### 一、核心区别总结 | **特性** | **Buffer (缓冲区)** | **Cache (缓存)** | |----------------|----------------------------------------|--------------------------------------| | **数据来源** | **原始磁盘块**(直接操作磁盘扇区) | **文件内容**(通过文件系统读取/写入) | | **主要用途** | 协调磁盘内存的**读写速度差异** | 减少对**慢速存储设备(如磁盘)的重复访问** | | **典型场景** | - 合并多次小写入为单次大写入<br>- 预读磁盘数据 | - 缓存频繁访问的文件内容<br>- 加速文件读写 | | **数据粒度** | 磁盘块(通常 4KB) | 文件页(通常 4KB) | | **回收优先级** | 内核优先释放 | 内核尽量保留(因重复利用率高) | --- ### 二、技术细节详解 #### 1. **Buffer:磁盘块的临时中转站** - **作用原理**: 当应用**直接读写磁盘块**(如 `dd` 命令操作裸设备)时,数据会暂存于 Buffer。 例如:将 100 个 1KB 的小写操作合并为 1 次 100KB 的大写操作,减少磁盘寻道时间[^3]。 - **数学表示**: 设磁盘写入延迟为 $t_d$,内存操作延迟为 $t_m$($t_d \gg t_m$),通过 Buffer 合并 $n$ 次写操作,总耗时从 $n \cdot t_d$ 降至 $t_d + n \cdot t_m$。 #### 2. **Cache:文件内容的加速层** - **作用原理**: 当应用通过**文件系统**读写文件时(如 `cat file.txt`),文件内容被缓存到 Cache。 例如:首次读取文件需访问磁盘,后续读取直接从 Cache 获取,速度提升 100 倍以上[^3]。 - **数据复用**: 若文件被多次访问,Cache 命中率 $H$ 越高,平均访问时间 $T_{avg}$ 越低: $$T_{avg} = H \cdot t_m + (1-H) \cdot (t_m + t_d)$$ --- ### 三、实际场景对比 | **操作** | **涉及组件** | **原因** | |------------------------|--------------|--------------------------------------------------------------------------| | `dd if=/dev/sda1 of=file` | **Buffer** | 直接读写磁盘块,需缓冲数据以匹配磁盘物理特性 | | `vim file.txt` | **Cache** | 通过文件系统修改文件,内容先写入 Cache(延迟写回磁盘) | | `cp largefile /tmp` | **Cache** | 复制文件时,源文件内容被缓存到 Cache,加速后续读取 | | 数据库裸盘操作 | **Buffer** | 绕过文件系统直接操作磁盘,依赖 Buffer 优化 I/O | --- ### 四、性能监控命令 ```bash # 查看 Buffer/Cache 占用 $ free -h total used free shared buff/cache available Mem: 16G 5.1G 1.2G 320M 9.7G 10G # 详细内存统计 $ cat /proc/meminfo Buffers: 1024 kB # Buffer 大小 Cached: 8192 kB # Cache 大小 ``` --- ### 五、关键注意事项 1. **内存回收策略**: - 当应用需要内存时,内核**优先释放 Buffer**(因其数据可直写回磁盘) - **Cache 释放较谨慎**(可能影响正在运行的程序性能)[^5]。 2. **读写混合场景**: BufferCache 可能协同工作,例如写文件时: `应用 → Page CacheCache) → Buffer → 磁盘`[^3][^5]。 3. **性能瓶颈诊断**: - Buffer 使用率高 → 磁盘写压力大(检查磁盘 I/O) - Cache 命中率低 → 文件重复访问率低(优化访问模式或增加内存)[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值