目录
- 前言
- 一、Cache
- 二、Buffer
- 三、Linux 系统中的 Cache 与 Buffer
- 总结
前言
内存的作用是什么?简单的理解,内存的存在是为了解决高速传输设备
与低速传输设备
之间数据传输速度不和谐
而设立的中间层(学过计算机网络的应该都知道,这就类似于端到端通信链路的吞吐量问题,吞吐量取决于小的那一端,同时也是存在瓶颈的一端)。我们都知道,计算机硬件中主要由三大部分构成,即 CPU、内存、磁盘,如今的计算机系统的 CPU 运算读写速率是非常高的,内存其次,而磁盘的读写却相较 CPU 和内存却是很慢的(尽管是现如今的 SSD 盘)。
一、Cache
什么是 Cache 呢?字面意思就是“缓存”
。首先 CPU 执行程序的指令是从内存中取出的,计算后的结果也是要写回内存,而在 CPU 将计算结果写回内存时,内存的响应速度跟不上 CPU 的写入速度的话,CPU 只能等待,这样一来就白白浪费了 CPU 资源(无法为等待服务的进程服务)。
然而,我们计算的数据是最终是要落盘的,此时又出现了一个问题,内存的读写速度明显是要大于磁盘的读写速度的。因此,如果程序/CPU 直接读取磁盘中的数据时,显然是更慢的。因此,就诞生了内存,我们可以把内存想象为左右两边有不同的数据传输速率(如下图),内存左边提供一个与 CPU 传输速率接近的传输接口,右边提供一个与磁盘传输速率接近的传输接口。
然后程序每次去磁盘读取数据,首先程序的这个请求(需求)会先通知内存,说我要去读取磁盘中的数据,内存收到请求后会以大致相同的速率从磁盘读取了程序需要的数据,内存从磁盘拿到数据后就会将数据发送给程序,同时内存自己会保存一份数据,如果下次程序在去磁盘读取相同数据时就直接读内存中的数据即可,因为程序到内存这里读取速度是很快的,就不会存在大量的 CPU 资源浪费。因此,我们可发现内存实际上提供了一个缓存能力,这个缓存就是我们说的 Cache。
因此 Cache(缓存)发生在 CPU/程序的读数据阶段。
二、Buffer
那 Buffer 又是什么呢?字面意思就是“缓冲”
。我们说了,CPU 计算的结果最终是要落盘的,即程序产生的应用数据最终是要写入物理磁盘的。而我们又说了 CPU 的计算/传输速率是远远高于磁盘的,如果没有内存来做缓冲,那 CPU/程序要一直等待数据被写入磁盘,这同样也导致 CPU 资源的浪费了。
于是,有没有这样一直方法,程序的数据先写入某个缓冲里面(如下图),写完后程序就去干其他事情去了,至于数据落盘,就由这个缓冲根据操作系统机制最终写入磁盘(如 Linux 系统中就有一个守护进程去定期清空缓冲内容,即将内容写入磁盘),或你手动执行 sync 命令将这部分缓冲的数据写入磁盘(而无需等待操作系统自动写入)。因此,我们可发现内存实际上也提供了一个缓冲能力,这个缓冲就是我们说的 Buffer。
因此 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 的基本情况:
上图中 buff/cache 表示缓存
与缓冲
的总容量大小,即这部分数据包含了程序要读取的数据与程序要写入磁盘的数据。
那我们如何释放 buff/cache 呢?
注意:释放前我们必须要先执行一下 sync 指令(切记切记),让缓冲的数据写入磁盘后我们在释放 buff/cache 容量,否则释放后本来要写入磁盘的重要数据都被你释放了。
1、手动数据写入磁盘
sync
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 容量
释放后的 buff/cache 容量
echo 1 > /proc/sys/vm/drop_caches
那么问题又来了,实际应用中这三个命令我们如何选择呢?
选择哪个命令取决于你的需求和系统性能。如果你希望尽量释放内存并且不关心性能,可以使用第一个命令。如果你想释放一些内存但仍然保持较好的性能,可以使用第二个命令。如果你只想释放可回收的页并最大程度地保持性能,可以使用第三个命令。
总结
作为专业的 Linux 系统管理/维护人员,我们对 Linux 的结构、性能一定是要掌握的,包括对 Linux 系统的基础优化也是要掌握的。如果有能力的话,我建议看看 Linux 系统底层相关知识。
—END