Linux操作系统中内存buffer和cache的区别 && free 参数说明

本文深入解析Linux系统中内存使用情况,特别是通过free命令查看物理内存、缓存内存及交换分区的状态,并探讨buffers与cache的区别。
我们一开始,先从Free命令说起。
free 命令相对于top 提供了更简洁的查看系统内存使用情况:
$ free
                     total  used   free  shared  buffers  cached
Mem:         255268 238332 16936 0 85540 126384
-/+ buffers/cache:  26408  228860
Swap:        265000   0    265000
Mem:表示物理内存统计 
-/+ buffers/cached:表示物理内存的缓存统计 
Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
我们使用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  shared1  buffers1  cached1
Mem:         255268 238332 16936         0            85540     126384
                                   used2  free2
-/+ buffers/cache:  26408  228860
 
Swap:        265000   0    265000
total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 + used2
 
free2 = buffers1 + cached1 + free1
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
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?
[b]cache 和 buffer的区别:[/b]
[b]Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。[/b]由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
[b]Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。[/b]通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小
 
buffer更靠近存储设备,或者直接就是disk的缓冲区;
cache则是mem的缓冲区;
~~~~~~~~~~~~~~~~~~~~~~~~~~

因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。
先说下free命令怎么看内存

[root@yuyii proc]# free
total used free shared buffers cached
Mem: 515588 295452 220136 0 2060 64040
-/+ buffers/cache: 229352 286236
Swap: 682720 112 682608

其中第一行用全局角度描述系统使用的内存状况:
total——总物理内存
used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
free——完全未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached——缓存,用于已打开的文件
note:
total=used+free
used=buffers+cached (maybe add shared also)

第二行描述应用程序的内存使用:
前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
note:
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cached

第三行表示swap的使用:
used——已使用
free——未使用

cache释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

说明,释放前最好sync一下,防止丢数据。

Linux操作系统中内存buffer和cache的区别  free 参数说明 - zhuzhu - 津津计较

 

Linux操作系统中内存buffer和cache的区别  free 参数说明 - zhuzhu - 津津计较

一、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是不会影响到系统性能的。


<think>我们正在讨论Linux内存管理中的freebuff/cache释放机制。根据用户的问题提供的引用,用户希望了解Linux系统中free命令显示的内存信息中,buff/cache部分的释放机制,包括自动释放手动释放的情况。 关键点: 1. free命令显示的内存信息中,bufferscache(统称为buff/cache)主要用于缓存磁盘数据,以提高文件读写效率。 2. 当系统内存紧张(即free内存不足)时,内核会自动触发内存回收,释放buff/cache中的部分内存,以满足应用程序的内存需求。 3. 手动释放buff/cache的方法是通过写入/proc/sys/vm/drop_caches文件,但需要注意这可能会导致I/O飙升,因为内核需要确保缓存数据的一致性(比如脏数据写回磁盘)。 4. 自动释放是内核内存管理的基本机制,而手动释放通常不建议在生产环境中使用,除非有特定需求。 下面我将根据引用内容,逐步解释freebuff/cache的释放机制。 ### 1. **free命令中的内存分类** 在Linux中,使用free命令可以查看内存使用情况,输出通常包含以下几列: - `total`:总物理内存- `used`:已使用的内存(包括buff/cache中正在使用的部分)。 - `free`:未被使用的内存(真正空闲,未被任何程序或缓存使用)。 - `shared`:共享内存- `buff/cache`:被内核缓冲区(buffers)页缓存(page cache)占用的内存- `available`:估计可用于启动新应用程序的内存,它等于free内存加上可回收的buff/cache部分。 根据引用[3]: > available = free + buffer + cache(理想计算方式,实际有误差) 注意:`available`是从应用程序角度看到的可用内存,它考虑了可回收的缓存。 ### 2. **buff/cache的作用** - **buffers**:用于存储磁盘块的元数据(如目录项、inode等),加速文件系统操作。 - **cache**:主要分为Page Cache(文件数据的缓存)Buffer Cache(磁盘块的缓存),现在通常统称为Page Cache。 引用[1][2]指出: > cache用来做缓存,在内存够用时加快进程对文件的读写速度。 ### 3. **自动释放机制** 当系统内存不足(即free内存即将耗尽)时,内核会触发内存回收(reclaim)机制: 1. **回收目标**:主要针对buff/cache,尤其是使用较多的cache空间。 2. **回收过程**: - 内核首先检查缓存中的数据是否与磁盘上的数据一致(即是否为“脏数据”)。 - 对于干净的缓存(clean cache,即与磁盘一致),可以直接释放。 - 对于脏数据(dirty cache),需要先写回磁盘(同步),然后才能释放。 3. **影响**:回收过程中,由于需要写回脏数据,可能导致I/O使用率飙升(引用[1][2])。 引用[1]强调: > 释放的时候,需要确认cache中的数据对应文件中的数据一致才能对cache释放,否则需要写入之后才释放。所以随着cache释放,io会飙升。 ### 4. **手动释放机制** 虽然内核会在需要时自动回收,但用户也可以手动强制释放缓存: - 通过写入`/proc/sys/vm/drop_caches`文件(引用[2][4]): ```bash echo 1 > /proc/sys/vm/drop_caches # 释放Page Cache echo 2 > /proc/sys/vm/drop_caches # 释放slab分配器中的对象(包括dentriesinode缓存) echo 3 > /proc/sys/vm/drop_caches # 同时释放12 ``` - **注意**: - 手动释放仅适用于非脏缓存(干净缓存),脏缓存不会通过这种方式释放(需要先同步)。 - 手动释放会导致缓存被清空,可能暂时降低系统性能(因为后续文件读取需要重新从磁盘加载)。 - 生产环境不建议频繁手动释放,除非在特定场景(如测试内存占用或遇到内存压力时临时处理)。 ### 5. **释放代价与建议** - **代价**:自动或手动释放缓存都可能引起I/O压力(引用[1][2])。 - **建议**: - 依赖内核自动管理:Linux内核的内存管理机制已经相当成熟,应优先让内核在内存紧张时自动回收。 - 避免手动释放:除非在明确需要立即释放内存的情况下(如性能测试或内存严重不足且自动回收未及时触发),否则不要手动释放(引用[1]:线上服务器最好不要手动释放)。 ### 6. **内存释放的监控** 可以使用以下工具监控内存释放情况: - `free -h`:动态观察freeavailable的变化。 - `vmstat 1`:查看内存回收行为(如cachebuffer的变化,以及swap活动)。 - `sar -r 1`:监控内存使用率。 ### 总结 Linux系统中的buff/cache内存会在内存不足时由内核自动回收,以满足应用程序的内存需求。回收过程伴随着I/O操作(尤其是脏数据写回),可能影响系统性能。手动释放缓存虽然可行,但通常不建议在生产环境中使用,除非有特殊需求。系统管理员应信任内核的内存管理机制,并通过监控工具观察内存使用情况。 §§相关问题§§ 1. 如何监控Linux系统中内存回收(reclaim)的实时行为? 2. 在手动释放buff/cache时,如何确保脏数据先被写回磁盘? 3. Linux内核中管理缓存的主要数据结构是什么? 4. 如何调整内核参数以改变内存回收的阈值或行为?[^1][^2][^3][^4]</think>### Linux内存管理中freebuff/cache的释放机制 #### 1. **内存分类与作用** - **free内存**:真正未被使用的物理内存,可直接分配给应用程序。 - **buff/cache内存**:由内核管理的缓存内存,用于加速系统性能: - **buffers**:缓存磁盘块元数据(如目录项、inode) - **cache**:缓存文件内容(Page Cache- **available**:应用程序视角的可用内存,计算方式为: $$\text{available} \approx \text{free} + \text{buffers} + \text{cache}$$ (实际值受内核算法影响会有偏差)[^3] #### 2. **自动释放机制** 当系统内存不足时,内核自动触发回收: 1. **触发条件**:`free`内存即将耗尽,应用程序请求新内存 2. **回收优先级**: - 优先释放`cache`(文件缓存) - 其次释放`buffers`(元数据缓存) 3. **回收过程**: - 检查缓存数据与磁盘的一致性 - 对**脏数据**(修改未同步的缓存)执行写回操作 - 释放**干净数据**(与磁盘一致的缓存) 4. **性能影响**: - 大量脏数据写回会导致I/O飙升 - 回收期间系统响应延迟增加[^1][^2] > ⚠️ **关键限制**:缓存释放必须保证数据一致性。例如修改过的文件缓存需先写回磁盘才能释放,这是I/O飙升的根本原因[^1]。 #### 3. **手动释放机制** 通过修改内核参数强制释放: ```bash # 释放Page Cache echo 1 > /proc/sys/vm/drop_caches # 释放slab缓存(含目录项/inode缓存) echo 2 > /proc/sys/vm/drop_caches # 同时释放1+2 echo 3 > /proc/sys/vm/drop_caches ``` **注意事项**: - 仅释放**干净缓存**,脏数据仍需写回 - 生产环境慎用:可能导致性能抖动[^2][^4] - 临时措施:适用于测试环境或特定维护场景 #### 4. **内核设计原理** 1. **缓存价值权衡**: - 空闲内存=浪费资源 → 内核主动用空闲内存作缓存 - 内存紧张时 → 牺牲性能释放缓存保进程运行 2. **释放策略**: - LRU(最近最少使用)算法优先释放旧缓存 - 内存水位控制:`min_free_kbytes`参数设定回收阈值 3. **特殊缓存处理**: - 共享内存(`shmem`)不可回收 - 内核 slab 缓存需特殊处理[^2] #### 5. **最佳实践建议** 1. **生产环境**: - 依赖内核自动管理,避免手动释放 - 监控`available`值而非`free` 2. **调优方向**: ```bash # 增加脏数据写回阈值(默认40%) sysctl -w vm.dirty_ratio=60 # 缩短脏数据刷新周期(默认5秒) sysctl -w vm.dirty_writeback_centisecs=500 ``` 3. **异常排查**: - `cache`持续增长:检查文件读写型进程 - `buffers`过高:排查文件系统操作频率 > 💡 **设计哲学**:Linux将空闲内存视为资源浪费,通过缓存最大化利用内存提升性能,仅在必要时回收[^3][^4]。 #### 总结 `buff/cache`的释放由内核自动触发,优先释放文件缓存(cache),需确保数据一致性导致I/O开销。手动释放仅作为临时手段,生产环境应依赖内核内存管理机制,并通过`vm.dirty_*`参数优化回收行为。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值