freem中的cache是什么?为什么会占用那么高
环境红帽企业Linux(所有版本)JBoss企业应用程序平台(EAP)所有版本Issue什么是cache在freem输出以及为什么内存利用率高cache?如何通过分析Heap创建新的JBoss服务器实例所需的内存容量freeJBoss中的命令输出,如果已经有一个JBoss实例在运行?为什么缓存使用了大量内存?缓存中经常充分利用物理内存解决
freem命令的输出结果中的Cache是什么?
它表示当前被Pagechche占用的内存容量,即RAM容量。Pagecache是被放到RAM上的曾经读或写操作所用到的文件或实际数据的副本。
拥有缓存机制有什么好处?当执行读或者写操作的时候,内核首先将所要的数据放到RAM。
读取操作:去磁盘找到数据把数据从磁盘存到RAM执行读操作
写操作:去磁盘找到数据把数据从磁盘存到RAM执行写操作把修改的数据复制到磁盘
不论是访问外部存储还是本地存储,总是慢于直接访问RAM,因为磁盘读取速度慢于RAM的读取速度。如果某文件持续地被读取或者修改,访问磁盘是一种资源消耗。在Cache的帮助下,文件会在RAM保存一段时间,这样就不用每次都去磁盘读或者修改数据。经过一段时间后,Cache上的数据会被同步到磁盘。把文件存到RAM里大大提高了处理速度,因为与从本地磁盘访问文件相比,它减少了大量的文件访问时间。这也间接地提高了计算机的整体性能。
下面的示例演示了缓存如何提高整体性能:〔rootsourcedb〕cataaa写入文件aaaadfaadfaadfaC〔rootsourcedb〕〔rootsourcedb〕cataaa查看内容adfaadfaadfa〔rootsourcedb〕sync〔rootsourcedb〕echo3procsysvmdropcaches清空cache如果您系统的IO操作频繁,我们不建议您使用这条命令。请不要在生产环境中使用以下命令。〔rootsourcedb〕timecataaaadfaadfaadfareal0m0。018s实际为0。018suser0m0。000ssys0m0。006s〔rootsourcedb〕timecataaaadfaadfaadfareal0m0。001s实际为0。001s从缓存中读取速度明显大于0。018user0m0。000ssys0m0。001s因此,只要有空闲内存,内核将始终尝试利用它来将所需文件保存为缓存。
如果没有可用RAM并且新进程需要可用RAM,会发生什么情况?当一个新的进程需要RAM的空页时,内核会检查cache是否有空页,并且把cache里的文件同步到本地磁盘,从而收回空页,释放RAM给新的进程
有关freem命令输出的详细说明:freemtotalusedfreesharedbufferscachedMem:375334552980144664bufferscache:26451107ActualFreeRAMSwap:4095754020上述实例中,RAM内存总量为3753MB。其中3455MB被占用,298MB为剩余容量。在freem输出结果中,cache和buffers也被算作实际占用的RAM容量,但这并不符合事实。在被占用的3455MB内存中,一部分被用作cache或buffer。如上所述,当没有空余的RAM容量分配给新进程时,就可以回收cache和buffer的内存。所以我们可以把Cache和buffer看作空余RAM。因此可以根据以下公式计算实际剩余RAM的容量。ActualFreeRAMfreebufferscached2981446641106在freem命令输出的第二行的free值约为1107。
为什么cache要占用那么多的内存?对于一个Linux虚拟内存管理器来说这是正常现象。为了理解为什么在正常情况下cache内存那么高,您必须先了解linux是如何处理IO的。当某用户读或者写文件时,它实际上是修改主内存的副本。内核会在磁盘里创建一个副本,必要时会对其修改。被这些副本所占用的内存就叫做cachedmemory。当用户进程发起读或者写操作时,就会消耗cache内存。内核会查找用户正在操作的文件副本,如果没有的话,它会在cache里分配出一个新的页面,并且从磁盘里读出相应的数据填充它。如果用户只是读这个文件,这一页会被标注成cleancache页。然而,只要用户写该文件,这一页会被标注成dirty。出现在ps里被称做pdflush的内核线程会定期被唤醒,并将所有标记为dirty的页面复制到磁盘,然后把它们标记为clean。注意该页面只能被重新标记为clean,由于之后可能会对该文件做进一步的IO操作,该页面被重新写回时并不会被释放。当内核需要内存时,cache页才会被释放。我们没有必要把cache页转换成空页,因为从磁盘读取cache页可以加快IO速率,而且释放一个cache页和分配一个空页一样简单,此外一个空页对于系统执行也没有任何作用。如果cache页占满了内存,当下一次内核需要内存时,它会简单地逐出最近最少使用的clean页并重新利用它们。