• 一文带你了解 Linux 的 Cache 与 Buffer


    image-20231011115401306



    前言

    内存的作用是什么?简单的理解,内存的存在是为了解决高速传输设备低速传输设备之间数据传输速度不和谐而设立的中间层(学过计算机网络的应该都知道,这就类似于端到端通信链路的吞吐量问题,吞吐量取决于小的那一端,同时也是存在瓶颈的一端)。我们都知道,计算机硬件中主要由三大部分构成,即 CPU、内存、磁盘,如今的计算机系统的 CPU 运算读写速率是非常高的,内存其次,而磁盘的读写却相较 CPU 和内存却是很慢的(尽管是现如今的 SSD 盘)。

    一、Cache

    什么是 Cache 呢?字面意思就是“缓存”。首先 CPU 执行程序的指令是从内存中取出的,计算后的结果也是要写回内存,而在 CPU 将计算结果写回内存时,内存的响应速度跟不上 CPU 的写入速度的话,CPU 只能等待,这样一来就白白浪费了 CPU 资源(无法为等待服务的进程服务)。

    然而,我们计算的数据是最终是要落盘的,此时又出现了一个问题,内存的读写速度明显是要大于磁盘的读写速度的。因此,如果程序/CPU 直接读取磁盘中的数据时,显然是更慢的。因此,就诞生了内存,我们可以把内存想象为左右两边有不同的数据传输速率(如下图),内存左边提供一个与 CPU 传输速率接近的传输接口,右边提供一个与磁盘传输速率接近的传输接口。

    然后程序每次去磁盘读取数据,首先程序的这个请求(需求)会先通知内存,说我要去读取磁盘中的数据,内存收到请求后会以大致相同的速率从磁盘读取了程序需要的数据,内存从磁盘拿到数据后就会将数据发送给程序,同时内存自己会保存一份数据,如果下次程序在去磁盘读取相同数据时就直接读内存中的数据即可,因为程序到内存这里读取速度是很快的,就不会存在大量的 CPU 资源浪费。因此,我们可发现内存实际上提供了一个缓存能力,这个缓存就是我们说的 Cache。

    image-20231011102014528

    因此 Cache(缓存)发生在 CPU/程序的读数据阶段。

    二、Buffer

    那 Buffer 又是什么呢?字面意思就是“缓冲”。我们说了,CPU 计算的结果最终是要落盘的,即程序产生的应用数据最终是要写入物理磁盘的。而我们又说了 CPU 的计算/传输速率是远远高于磁盘的,如果没有内存来做缓冲,那 CPU/程序要一直等待数据被写入磁盘,这同样也导致 CPU 资源的浪费了。

    于是,有没有这样一直方法,程序的数据先写入某个缓冲里面(如下图),写完后程序就去干其他事情去了,至于数据落盘,就由这个缓冲根据操作系统机制最终写入磁盘(如 Linux 系统中就有一个守护进程去定期清空缓冲内容,即将内容写入磁盘),或你手动执行 sync 命令将这部分缓冲的数据写入磁盘(而无需等待操作系统自动写入)。因此,我们可发现内存实际上也提供了一个缓冲能力,这个缓冲就是我们说的 Buffer。

    image-20231011110416128

    因此 Buffer(缓冲)发生在 CPU/程序的写数据阶段。

    三、Linux 系统中的 Cache 与 Buffer

    在 Linux 操作系统中,Page Cache 对应的就是 Cache。Page Cache 是文件系统层级的缓存,从磁盘中读取的内容都会缓存在 Cache 中,这样程序读取磁盘内容时,读取的是 Cache 中缓存的内容,加快了数据读取速率。

    在 Linux 操作系统中,Buffer Cache 对应的就是 Buffer。Buffer Cache 是磁盘等块设备的缓冲,这部分缓冲的数据是要写入磁盘的,但要注意的是,缓冲中的数据不是即时写入物理磁盘的,而是在操作系统空闲或 Buffer 达到一定大小时写入到磁盘中。同时也会存在一定风险,如果突然断电或手动关机,那缓冲中的数据就会丢失。因此,为了防止数据丢失,在正常关机前应该执行一下 sync 命令,让位于 Buffer 的数据立刻写入到物理磁盘中。

    如下图,这就是 Linux 系统中 buff/cache 的基本情况:

    image-20231011111942256

    上图中 buff/cache 表示缓存缓冲的总容量大小,即这部分数据包含了程序要读取的数据与程序要写入磁盘的数据。

    那我们如何释放 buff/cache 呢?

    注意:释放前我们必须要先执行一下 sync 指令(切记切记),让缓冲的数据写入磁盘后我们在释放 buff/cache 容量,否则释放后本来要写入磁盘的重要数据都被你释放了。

    1、手动数据写入磁盘

    sync
    
    • 1

    2、释放 buff/cache

    这里分为三个释放级别

    • echo 1 > /proc/sys/vm/drop_caches

      释放页缓存中的所有页,包括可回收的页,不可回收的页以及页表页。这意味着它会释放大部分页缓存,使系统可以在需要时重新加载文件数据。

    • echo 2 > /proc/sys/vm/drop_caches

      释放页缓存中的不可回收的页和页表页,但会保留可回收的页。这允许系统释放一些内存,同时保持可回收的页以提高性能。

    • echo 3 > /proc/sys/vm/drop_caches

      只释放可回收的页缓存,不会触及不可回收的页或页表页。这可以帮助系统释放一些内存,同时尽量保持可回收的页以提高性能。

    释放前的 buff/cache 容量

    image-20231011115753358

    释放后的 buff/cache 容量

    echo 1 > /proc/sys/vm/drop_caches
    
    • 1

    image-20231011115830461

    那么问题又来了,实际应用中这三个命令我们如何选择呢?

    选择哪个命令取决于你的需求和系统性能。如果你希望尽量释放内存并且不关心性能,可以使用第一个命令。如果你想释放一些内存但仍然保持较好的性能,可以使用第二个命令。如果你只想释放可回收的页并最大程度地保持性能,可以使用第三个命令。

    总结

    作为专业的 Linux 系统管理/维护人员,我们对 Linux 的结构、性能一定是要掌握的,包括对 Linux 系统的基础优化也是要掌握的。如果有能力的话,我建议看看 Linux 系统底层相关知识。

    —END

  • 相关阅读:
    这种动态规划你见过吗——状态机动态规划之股票问题(下)
    CADD课程学习(3)-- 靶点药物相互作用
    先冲了!下载量超30W的阿里「从零开始学架构」,堪称教学天花板
    CSS的基础
    VBA技术资料MF144:将PDF首页作为对象插入工作表
    【解决】mysqladmin flush-hosts
    挑战10个最难的Java面试题(附答案)【上】
    车载SBC芯片概论
    Java中13 种锁的实现方式有哪些?
    python数据分析-房价数据集聚类分析
  • 原文地址:https://blog.csdn.net/IT_ZRS/article/details/133765279