"free -m" 命令的输出结果中的 Cache 是什么?,我来为大家科普一下关于cache大小与cache存取时间的关系?下面希望有你要的答案,我们一起来看看吧!

cache大小与cache存取时间的关系(free-m中的cache是什么为什么会占用那么高)

cache大小与cache存取时间的关系

环境Issue解决

"free -m" 命令的输出结果中的 Cache 是什么?

它表示当前被 Page chche 占用的内存容量,即 RAM 容量。Page cache 是被放到 RAM 上的曾经读或写操作所用到的文件或实际数据的副本。

拥有缓存机制有什么好处?当执行读或者写操作的时候,内核首先将所要的数据放到 RAM。

读取操作: 去磁盘找到数据 --> 把数据从磁盘存到 RAM --> 执行读操作

写操作: - 去磁盘找到数据 --> 把数据从磁盘存到 RAM --> 执行写操作 --> 把修改的数据复制到磁盘

  • 不论是访问外部存储还是本地存储,总是慢于直接访问 RAM,因为磁盘读取速度慢于 RAM 的读取速度。如果某文件持续地被读取或者修改,访问磁盘是一种资源消耗。在 Cache 的帮助下,文件会在 RAM 保存一段时间,这样就不用每次都去磁盘读或者修改数据。经过一段时间后,Cache 上的数据会被同步到磁盘。
  • 把文件存到 RAM 里大大提高了处理速度,因为与从本地磁盘访问文件相比,它减少了大量的文件访问时间。这也间接地提高了计算机的整体性能。

下面的示例演示了缓存如何提高整体性能:

[root@sourcedb ~]# cat >aaa #写入文件aaa adfa adfa adfa ^C [root@sourcedb ~]# [root@sourcedb ~]# cat aaa #查看内容 adfa adfa adfa [root@sourcedb ~]# sync [root@sourcedb ~]# echo 3 > /proc/sys/vm/drop_caches #清空cache 如果您系统的 IO 操作频繁,我们不建议您使用这条命令。请不要在生产环境中使用以下命令。 [root@sourcedb ~]# time cat aaa adfa adfa adfa real 0m0.018s #实际为0.018s user 0m0.000s sys 0m0.006s [root@sourcedb ~]# time cat aaa adfa adfa adfa real 0m0.001s #实际为0.001s 从缓存中读取速度明显大于0.018 user 0m0.000s sys 0m0.001s 因此,只要有空闲内存,内核将始终尝试利用它来将所需文件保存为缓存。

如果没有可用 RAM 并且新进程需要可用 RAM,会发生什么情况? 当一个新的进程需要 RAM 的空页时,内核会检查 cache 是否有空页,并且把 cache 里的文件同步到本地磁盘,从而收回空页,释放 RAM 给新的进程

有关“free -m”命令输出的详细说明:-

# free -m total used free shared buffers cached Mem: 3753 3455 298 0 144 664 -/ buffers/cache: 2645 1107 <<-- Actual Free RAM Swap: 4095 75 4020

  • 上述实例中,RAM 内存总量为 3753 MB。其中 3455 MB 被占用,298 MB 为剩余容量。
  • 在 "free -m" 输出结果中,cache 和 buffers 也被算作实际占用的 RAM 容量,但这并不符合事实。
  • 在被占用的 3455 MB 内存中,一部分被用作 cache 或 buffer。如上所述,当没有空余的 RAM 容量分配给新进程时,就可以回收 cache 和 buffer 的内存。所以我们可以把 "Cache" 和 "buffer" 看作空余 RAM。因此可以根据以下公式计算实际剩余 RAM 的容量。
  • Actual Free RAM = "free" "buffers" "cached" = 298 144 664 = 1106 在 "free -m" 命令输出的第二行的 "free" 值约为 1107。

为什么 cache 要占用那么多的内存?

  • 对于一个 Linux 虚拟内存管理器来说这是正常现象。为了理解为什么在正常情况下cache内存那么高,您必须先了解linux是如何处理 I/O的。当某用户读或者写文件时,它实际上是修改主内存的副本。内核会在磁盘里创建一个副本,必要时会对其修改。被这些副本所占用的内存就叫做 cached memory。
  • 当用户进程发起读或者写操作时,就会消耗 cache 内存。内核会查找用户正在操作的文件副本,如果没有的话,它会在 cache 里分配出一个新的页面,并且从磁盘里读出相应的数据填充它。如果用户只是读这个文件,这一页会被标注成 "clean" cache 页。然而,只要用户写该文件,这一页会被标注成 "dirty"。出现在 ps 里被称做 pdflush 的内核线程会定期被唤醒,并将所有标记为 dirty 的页面复制到磁盘,然后把它们标记为 clean。注意该页面只能被重新标记为 clean,由于之后可能会对该文件做进一步的 IO 操作,该页面被重新写回时并不会被释放。
  • 当内核需要内存时,cache 页才会被释放。我们没有必要把 cache 页转换成空页,因为从磁盘读取 cache 页可以加快 IO 速率,而且释放一个 cache 页和分配一个空页一样简单,此外一个空页对于系统执行也没有任何作用。如果 cache 页占满了内存,当下一次内核需要内存时,它会简单地逐出最近最少使用的 clean 页并重新利用它们。
,