linux buff/cache 过高,吃掉物理内存

这篇博客是写完之前的博客之后,发现还是有些不了解什么是linux系统中的buff/cache,所以写这篇文章总结一下。文章链接服务器内存不足导致微服务启动失败,竟然是linux buff/cache消耗内存过高导致的

背景:

在这里插入图片描述
上面这张图是我之前遇到服务器内存不足,导致的微服务启动失败问题,这个服务器是4核8G的服务器,但是buff/cache就已经是1.9G,第一反应就是这个问题。

buff/cache到底是用来干什么的?

Linux的缓存机制,会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读 写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。

Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

但是在进行了大量文件操作之后,缓存会把内存资源基本用光,虽然文件 读取效率提高了,但是物理内存会逐渐被吃光。

然来是因为服务进行了频繁的文件读写操作,但是为什么操作系统不会主动回收呢,原来是因为drop_caches的默认参数设置的就是不释放的

1
2
3
4
5
        drop_caches的值可以是0-3之间的数字,代表不同的含义:
        0:不释放(系统默认值)
        1:释放页缓存
        2:释放dentries和inodes
        3:释放所有缓存

所以可能每次都得输入命令来释放buff/cache

1
2
3
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches