Linux命令 之 free (buffer与cache区别 )

本文详细介绍了Linux内核中的buffer(缓冲)和cache(缓存)概念,阐述了它们在内存管理中的作用。重点区分了buffer与cache的区别,并通过free命令展示了如何查看和理解系统的内存使用情况,包括物理内存、缓存内存和交换分区的使用状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://zhumeng8337797.blog.163.com/blog/static/100768914201110244740147/    点击打开链接
从本质上讲,
    buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。 
    cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计的,也就是平常见到的一级缓存、二级缓存、三级缓存。(top命令中查看的cache不是指一级缓存/二级缓存/三级缓存,而是指Cache Memory


buffer:
   缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
cache:
   当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。 其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。 如果你希望手动去释放Cache Memory也是有办法的。

一、free命令

free 命令相对于top 提供了更简洁的查看系统内存使用情况,用来显示内存的使用情况,使用权限是所有用户
语法:
     free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]
常用参数详解
-b, -k,-m,-g:分别以字节( bytes、KB、MB、GB)为单位显示内存使用情况
-s  delay:显示每隔多少秒数来显示一次内存使用情况(与-c一起使用)
-c:按每隔几秒显示内存使用情况时的刷新次数(与-s一起使用)
-t:显示内存总和列。
-o:不显示缓冲区调节列
-V:free的版本
  # free -m
                   total       used     free     shared    buffers     cached
Mem:          3034      2938      96           0          101          1300
-/+ buffers/cache:   1536       1497
Swap:         1983      71        1912
Total:         5018       3010     2008
  Mem:表示物理内存统计
  -/+ buffers/cached:表示物理内存的缓存统计
  Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
  系统的总物理内存:3034M,但系统当前真正可用的内存并不是第一行free 标记的 96M,它仅代表未被分配的内存。
  我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
  total1:表示物理内存总量。
  used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
  free1:未被分配的内存。
  shared1:共享内存,一般系统不会用到,这里也不讨论。
  buffers1:系统分配但未被使用的buffers 数量。
  cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
  used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。
  free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
  可以整理出如下等式:
      total1 = used1 + free1
      total1 = used2 + free2
      used1 = buffers1 + cached1 + used2
      free2 = buffers1 + cached1 + free1


二、buffer与cache的区别

理解linux内存管理,需要深入了解linux内存的各个参数含义和规则,下面介绍一下Linux操作系统中内存buffer和cache的区别。

buffer 与cache 的区别:
A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

更详细的解释参考:Difference Between Buffer and Cache

Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。

Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

Free中的buffer和cache:(它们都是占用内存):

buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。

对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?

我们使用的LinuxWindows可不太一样,用top命令得出来的可能不是真实使用的内存,用free命令第二行才是系统真实使用的内存。如 果发现PHP-CGI把你的内存占满了可不要惊慌哦。

Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有很多人在争辩和猜想这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正确的结 论,在我工作的这一段时间,page cache和buffer cache的概念曾经困扰过我,但是仔细分析一下,这两个概念实际上非常的清晰。如果能够了解到这两个cache的本质,那么我们在分析io问题的时候可 能会更加得心应手。

Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。
简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。
补充一点,在文件系统层 每个设备都会分配一个def_blk_ops的文件操作方法,这是设备的操作方法,在每个设备的inode下面会存在一个 radix tree,这个radix tree下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。如果设备做了文件系统,那么会生成一个 inode,这个inode会分配ext3_ops之类的操作方法,这些方法是文件系统的方法,在这个inode下面同样存在一个radix tree,这里会缓存文件的page页,缓存页的数量在top程序的cache一栏进行统计。从上面的分析可以看出,2.6内核中的buffer cache和page cache在处理上是保持一致的,但是存在概念上的差别,page cache针对文件的cache,buffer是针对磁盘块数据的cache,仅此而已。

现在不都是只有page cache了吗? buffer pages其实也是page cache里面的页。只是多了一层抽象,通过buffer_head来进行一些访问管理。对,从Linux算法实现的角度,page cache和buffer cache目前是一样的,但是从功能抽象和具体应用来讲,这两者还是存在区别的,这一点可以从top工具的统计信息中看得出来,关注一下buffer和 cache这两个统计量。
增加一些资料:
A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.


<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、付费专栏及课程。

余额充值