linux系统中buff/cache占用过高?不明白为何过高?

前言

近期一台服务器运行中查看内存容量时发现buff/cache占用过高,几乎占用百分之70

概念

什么是buffer/cache?
buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

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

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

处理

如何回收cache?
Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。

但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。

在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches 
1

方法是:

echo 1 > /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。

官网KB

[c-alert type=”info”]
由于linux系统会尽量多地使用物理内存进行数据的缓存以提高IO吞吐率,具体体现在 buff/cache 会有较高的占用率。这种现象一般出现在高IO吞吐需求业务的机器上,如数据库。这是一种正常现象。
[/c-alert]

更多相关信息,您可以参考下面KB:

What is cache in “free -m” output and why is memory utilization high for cache?
https://access.redhat.com/solutions/67610

原创文章,作者:AIRF,如若转载,请注明出处:http://www.ai-rf.com/index.php/2022/12/05/linux%e7%b3%bb%e7%bb%9f%e4%b8%adbuff-cache%e5%8d%a0%e7%94%a8%e8%bf%87%e9%ab%98%ef%bc%9f%e4%b8%8d%e6%98%8e%e7%99%bd%e4%b8%ba%e4%bd%95%e8%bf%87%e9%ab%98%ef%bc%9f/

(0)
AIRFAIRF
上一篇 2022年12月4日
下一篇 2022年12月7日

相关推荐

  • 探索与筑梦:我的博客网站进化传奇

    引言 在这片浩渺的数字宇宙里,每一个网站都是一个独特的星球,闪烁着创造者梦想的光芒。这不仅是一部技术探险的编年史,更是一段用热爱与坚韧书写的心灵之旅。让我们一同回溯,从一张空白的H…

    2024年6月15日
  • 40 个简单又有效的 Linux Shell 脚本示例

    历史上,shell 一直是类 Unix 系统的本地命令行解释器。它已被证明是 Unix 的主要功能之一,并发展成为一个全新的主题。Linux 提供了各种功能强大的 shell,包括…

    JAVA_JavaScript 2023年11月20日
  • 为什么建议使用UUID进行挂载硬盘

    UUID简介 通用唯一识别码(英语:Universally Unique Identifier,简称UUID),UUID为Linux系统中的存储设备提供唯一的标识字符串,不管这个设…

    Linux 2023年1月6日
  • Centos7下载网络yum源及epel源

    正常情况下,除Redhat系统授权之后才可以正常使用网络yum配置,Centos等衍生版系统只能使用本地yum源,使用时会报错如下: 这时我们就需要先下载epel源,下载后即可正常…

    Linux 2022年10月7日
  • Linux exec指令

    Linux exec指令 exec是Linux Shell中一个非常重要的内建命令,用于替换当前shell的进程空间,执行指定命令或脚本而不启动新的子进程。理解和灵活运用exec对…

    Linux 2024年12月25日
  • Windows 2012r2激活密钥(亲测)

    windows server 2012是服务器系统,和客户端系统一样,需要使用激活码永久激活windows2012r2。server2012激活密钥有两种,分别是永久激活和kms期…

    Windows 2023年5月10日
  • 运维人员必须知道的10个系统进程

    前言 在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高,但是又不敢随意的Kill这些进程 而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些系统的辅助功能(如…

    2023年12月16日
  • UNIX系列之AIX克隆系统盘

    前景提示: 未曾有Nim环境,且网络环境原因无法使用Nim安装,故采取使用克隆盘的方式进行安装 首先使用光盘正常安装一台机器,并按照基线文档更新 完成后从其他机器拔新盘并插入,插入…

    C_C++_C# 2021年11月21日
  • linux系统启动流程

    按下系统的电源开关,过一会就可以看到Linux的登录界面了。 你是否曾经想过,从按下电源开关到登录界面出现,这后面到底发生了什么? Linux 系统在启动过程中,首先是固件(PC …

    Linux 2022年10月6日
  • /root占用空间过大但是又找不到大文件和大目录的问题

    管理员反馈/root过大但是找不到文件 使用lsof排查 使用lsof查看删除但是占用空间的进程发现都是/var目录,无法对应/root 处理办法 排除解决,换用命令:du -sh…

    2025年6月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注