freem中的cache是什么?为什么会占用那么高
环境红帽企业 Linux(所有版本) JBoss 企业应用程序平台 (EAP) - 所有版本 Issue什么是 cache 在 free -m 输出以及为什么内存利用率高 cache ? 如何通过分析 Heap 创建新的 JBoss 服务器实例所需的内存容量 free JBoss 中的命令输出,如果已经有一个 JBoss 实例在运行? 为什么缓存使用了大量内存? 缓存中经常充分利用物理内存 解决
"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 页并重新利用它们。