频繁读写文件导致内存使用率过高

最近接到一个客户反馈,说是服务器内存使用过高,总内存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能正确自动释放),特进行试验。

环境准备

频繁读写文件导致内存使用率过高_第1张图片

内存8G,我准备了一个近2G的文件。下面进行cp操作并检查cached的数值。

频繁读写文件导致内存使用率过高_第2张图片

通过测试可以发现可用内存越来越少,cached的内存越来越大,经过几次cp之后可用内存已经只有142m了。

此时我启动了3个tomcat,然后再kill掉这3个tomcat进程。

频繁读写文件导致内存使用率过高_第3张图片

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一下,防止丢失数据。

你可能感兴趣的:(虚拟机)