从免费命令中理解"缓冲区"和"缓存"

Zam*_*ues 20 memory linux-kernel free-command

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

想要从free命令输出中的"缓冲区"和"缓存"列中澄清自己.

这就是我的理解......

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

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

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

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

[zama@localhost ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          2897        465       2431          0         30        230
-/+ buffers/cache:        204       2692
Swap:         4000          0       4000

[zama@localhost ~]$ sync

[zama@localhost ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          2897        466       2431          0         30        230
-/+ buffers/cache:        205       2691
Swap:         4000          0       4000

执行sync命令后,我无法看到缓冲区减少.

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

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

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

@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          2897       1466       1430          0         32       1127
-/+ buffers/cache:        306       2590
Swap:         4000          0       4000

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

@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          2897       1466       1430          0         10       1127
-/+ buffers/cache:        306       2590
Swap:         4000          0       4000

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

[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
             total       used       free     shared    buffers     cached
Mem:          2897        299       2597          0          1         74
-/+ buffers/cache:        224       2672
Swap:         4000          0       4000

因此,我的初始声明"缓冲区"是尚未刷新到磁盘的RAM数据看起来是正确的.

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

小智 24

free命令中的列标题有点贴错标签,至少从linux用户的角度来看(而不是开发人员).以下是对标题含义的澄清:

总计:是的,这是总公羊.

used: 这可能是最混乱的专栏.这是应用程序使用的内存和其他"临时"(缓冲区+缓存)使用的内存的混合,如果需要,它实际上是可用的.因此从技术上讲,内存是真正被使用的,但是如果应用程序需要,大部分内存都可用.如果Linux系统可以使用"临时"使用的内存来帮助加快系统性能,否则系统会更频繁地从磁盘读取.大多数此类内存都显示在"缓存"列下.如果应用程序需要内存,则Linux系统会释放此内存.

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

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

缓冲区:用于帮助某些进程的临时内存

cache: 操作系统可用并"借用"的内存,以帮助加速许多Linux OS操作.如果应用程序需要,系统会释放该内存.

- /+ buffers/cache开头的行通常比第一个Mem行更有用.free- /+缓冲区/缓存的交集基本上就是"可用"内存的交集.