一文带你了解 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

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

image-20231011115830461

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

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

总结

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

—END

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LVS(Linux Virtual Server)是一种基于 Linux 系统的负载均衡集群技术,它主要用于将网络流量分发到多个服务器上,以提高系统的可靠性、可扩展性和性能。 LVS 集群一般包括四个组件:调度器(LVS 调度器)、前端服务器(负载均衡器)、后端服务器(真实服务器)和存储服务器(用于共享数据)。首先,调度器接收来自客户端的请求,然后根据配置的调度算法(如轮询、加权轮询、最小连接数等)将请求分发到多个前端服务器。前端服务器接收到请求后,通过相应的负载均衡算法将请求转发到后端的真实服务器上进行处理。在整个过程中,存储服务器用于存放共享的数据,以确保所有的真实服务器都能获取到相同的数据,并提供一致的服务。 LVS 集群的优点是能够提高网站的稳定性和可靠性,当某一台服务器出现故障时,调度器会自动将请求分发到其他可用的服务器上,从而保证服务的连续性。同时,LVS 集群还能够通过增加前端服务器和后端服务器的数量来提高系统的性能和吞吐量,以满足不断增长的用户需求。 在实际应用中,LVS 集群需要合理配置,包括选择合适的调度算法、调整每台服务器的权重、选择适当的硬件设备等。此外,还需要及时监控集群的运行状态,及时发现和解决故障,以确保整个系统的正常运行。 总的来说,LVS 负载均衡集群是一种强大而高效的集群技术,能够帮助企业提高系统的可靠性和性能,是现代互联网应用中不可或缺的重要组成部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值