频繁读写文件导致内存使用率过高 |
您所在的位置:网站首页 › linux鍱3820f2a001f › 频繁读写文件导致内存使用率过高 |
最近接到一个客户反馈,说是服务器内存使用过高,总内存16G,使用top命令查看可用内存已经不足1G了。 客户环境服务器为linux,部署了3个tomcat,每个tomcat均有大量的日志产生。 让客户使用free -m检查一下 此处有必要解释一下free命令返回的各个参数的意思(直接转了)。 解释: total:是总的物理内存 used:使用中的内存 free:完全空闲的内存 shared:多个进程共享的内存 buffers:写缓存,在写入磁盘之前,先把数据缓存一段时间,可以释放 cache:读缓存,读取过的文件,会缓存一段时间。可以释放 -buffers/cache:应用程序实际使用中的内存大小,等于used-buffers-cached(Mem列的三个数) +buffers/cache:可供使用的内存总量,等于free+buffers+cached(Mem列的三个数) Swap:不解释,都能看懂的可用看到cache已经达到10G了。是什么导致cache如此之大呢? 网上可用查到解释: 什么是Cache Memory(缓存内存): 当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。 其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory也是有办法的。 为了确认这种情况是由于文件读写造成的,以及该情况下不影响程序正常运行(cache能正确自动释放),特进行试验。 环境准备内存8G,我准备了一个近2G的文件。下面进行cp操作并检查cached的数值。 通过测试可以发现可用内存越来越少,cached的内存越来越大,经过几次cp之后可用内存已经只有142m了。 此时我启动了3个tomcat,然后再kill掉这3个tomcat进程。 tomcat进程启动没有报内存溢出,把3个tomcat进程kill掉之后free明显多了(原先被文件读写占用的cached内存在free不足的时候回收了被tomcat占用,在tomcat被kill之后释放出来)。 结论: 1、linux系统在文件读写时会写入内存缓存,导致“看上去”可用内存会减少。 2、cached掉的内存不用担心,在需要内存时会释放出来。 3、cached掉的内存在需要释放时也不是全部释放的,而是一部分一部分的释放的。
附手动释放cached内存的方式: 如何释放Cache Memory(缓存内存): 用下面的命令可以释放Cache Memory:To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches 注意,释放前最好sync一下,防止丢失数据。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |