24

之前已经问过这个问题,但不想再次更新同一个线程,因为它是一个旧线程。

想在free命令输出中的“缓冲区”和“缓存”列中澄清自己。

这是我的理解...

缓冲区是数据存在于内存中但尚未刷新到磁盘的地方。数据将由bdflush守护进程定期刷新到磁盘,或者我们可以通过运行sync命令手动完成。

另一方面,缓存是加载到内存中但保留在内存中的程序/数据,因此如果再次需要,它将很快可用。

为了理解缓冲区的概念,我尝试了以下实验......

这是free我桌面上的命令阅读

[zama@localhost ~]$ 免费 -m
             缓存的已用空闲共享缓冲区总数
电话:2897 465 2431 0 30 230
-/+ 缓冲区/缓存:204 2692
交换:4000 0 4000

[zama@localhost ~]$ 同步

[zama@localhost ~]$ 免费 -m
             缓存的已用空闲共享缓冲区总数
电话:2897 466 2431 0 30 230
-/+ 缓冲区/缓存:205 2691
交换:4000 0 4000

在这里我看不到执行sync命令后缓冲区减少了。

接下来我尝试了以下...尝试将一个巨大的文件写入磁盘。

[zama@localhost ~]$ dd if=/dev/zero of=test bs=1024k 

正如预期的那样,缓存的值应该会增加,并且 free 正在确认这一点..

@localhost ~]# 免费 -m
             缓存的已用空闲共享缓冲区总数
电话:2897 1466 1430 0 32 1127
-/+ 缓冲区/缓存:306 2590
交换:4000 0 4000

我再次执行了sync命令,然后使用free. 我可以看到缓冲区值从freecommand 的输出中减少了。缓存没有减少。这意味着我执行ddcoomand 后 RAM 中的脏页已刷新到磁盘。

@localhost ~]# 免费 -m
             缓存的已用空闲共享缓冲区总数
电话:2897 1466 1430 0 10 1127
-/+ 缓冲区/缓存:306 2590
交换:4000 0 4000

然后我更新了drop_cache内核参数,以便删除缓存 vlaue

[root@localhost ~]# cat /proc/sys/vm/drop_caches
0

[root@localhost ~]# echo "1" > /proc/sys/vm/drop_caches

[root@localhost ~]# cat /proc/sys/vm/drop_caches
1

free现在确认缓冲区和缓存值都已删除。

[root@localhost ~]# free -m
             缓存的已用空闲共享缓冲区总数
内存:2897 299 2597 0 1 74
-/+ 缓冲区/缓存:224 2672
交换:4000 0 4000

因此,我最初的声明“缓冲区”是尚未刷新到磁盘的 RAM 数据看起来是正确的。

请指导我是否朝着正确的方向前进。

4

5 回答 5

26

free 命令中的列标题有些贴错标签,至少从 linux 用户(与开发人员相反)的角度来看是这样。以下是对标题含义的说明:

总计:是的,这是总内存。

used: 这可能是最混乱的列。这是应用程序使用的内存和其他“临时”(缓冲区+缓存)使用的内存的混合,如果需要,实际可用。所以从技术上讲,内存确实被使用了,但是如果应用程序需要,大部分内存都是可用的。如果 linux 系统可用,则借用“临时”使用的内存以帮助提高系统性能,否则系统会更频繁地从磁盘读取。许多这种类型的内存显示在“缓存”列下。如果应用程序需要内存,Linux 系统会放弃此内存。

自由: 是的,这个纯粹的自由和未被触及的记忆。

shared: 专门分配给多个进程使用的内存

缓冲区:为帮助某些进程而留出的临时内存

缓存: 操作系统可用和“借用”的内存,以帮助加速许多 linux 操作系统操作。如果应用程序需要,系统会放弃此内存。

以-/+ buffers/cache开头的行通常比第一行Mem更有帮助。空闲-/+ 缓冲区/缓存的交集本质上就是“可用”内存。

于 2014-05-08T12:42:38.037 回答
3

Linux vm 子系统将任何空闲或未使用或未分配的内存视为缓冲区/缓存

因此,运行echo 1 > /proc/sys/vm/drop_caches指示内核删除或清理页面缓存(page-cache)、dentries(slab-cache)和inode(在slab-cache中),并导致内存被回收和可用。

干净的数据缓存页面不是设计释放的。如果要分配额外的内存(malloc/calloc/brk/sbrk 和朋友),内核可以轻松地回收它们,同时它们包含来自磁盘的有用数据,如果需要,可以再次节省磁盘 I/O。

sync命令仅将内存中的任何脏页提交到磁盘,它不会释放缓冲区/缓存。删除缓冲区/缓存的唯一方法是使用echo "1" > /proc/sys/vm/drop_caches或内核回收应用程序请求的新分配的数据页

pdflush已通过使用每个支持设备信息 (BDI) 的刷新线程来替换。

于 2014-07-10T04:06:20.923 回答
3

我一直理解的方式是,内存的缓冲区是用于临时存储从设备(包括磁盘)读取或写入的数据,而内存的缓存区是为了加快未来从设备读取的速度。

于 2012-03-15T19:48:17.123 回答
3

引用RHEL

Linux 总是尝试使用 RAM 来加速磁盘操作,方法是将可用内存用于缓冲区(文件系统元数据)和缓存(具有文件或块设备的实际内容的页面)。


serverFault引用

shared// buffers:cached这显示了用于特定目的的内存使用情况,这些值包含在 的值中used

第二行给出调整后的第一行值。它给出了used减去 sumbuffers+cached的原始值和 free 加上 sum 的原始值buffers+cached,因此它的标题。这些新值通常比第一行的值更有意义。

最后一行Swap提供有关交换空间使用情况的信息。例如,临时移动到磁盘的内存内容。

于 2014-11-07T09:06:38.440 回答
1

这是我的理解:缓冲区告诉您为维护块设备保留了多少内存,但缓存告诉您有多少内存用于文件内容。

于 2014-02-10T05:13:04.740 回答