一文带你了解 Linux 的 Cache 与 Buffer

image-20231011115401306


目录

    • 前言
    • 一、Cache
    • 二、Buffer
    • 三、Linux 系统中的 Cache 与 Buffer
    • 总结


前言

内存的作用是什么?简单的理解,内存的存在是为了解决高速传输设备低速传输设备之间数据传输速度不和谐而设立的中间层(学过计算机网络的应该都知道,这就类似于端到端通信链路的吞吐量问题,吞吐量取决于小的那一端,同时也是存在瓶颈的一端)。我们都知道,计算机硬件中主要由三大部分构成,即 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【内网穿透】Docker部署Drupal并实现公网访问

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS,适用于各种不同的网站项目,从小型个人博客到大型企业级门户网站。…

【Python】实现excel文档中指定工作表数据的更新操作

在做数值计算时,个人比较习惯利用excel文档的公式做数值计算进行对比,检查异常,虽然计算量大后,excel计算会比较缓慢,但设计简单,易排错 但一般测试过程中使用到的数据都不是最终数值,会不停根据…

红队专题-从零开始VC++远程控制软件RAT-C/S-[1]远控介绍及界面编写

红队专题 招募六边形战士队员[1]---远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境:3.界面编程新建项…

实现基于 GitLab 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢? DORA 调研报告 DORA(DevOps Research &am…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

Netty深入浅出Java网络编程学习笔记(一) Netty入门篇

目录 一、概述 1、什么是Netty 2、Netty的优势 二、入门案例 1、服务器端代码 2、客户端代码 3、运行流程 组件解释 三、组件 1、EventLoop 处理普通与定时任务 关闭 EventLoopGroup 处理IO任务 服务器代码 客户端代码 分工细化 划分Boss 和Work 增加自定义EventLoopGroup 切换…

银河麒麟安装arm架构mysql8

1. 准备工作 2. 查看麒麟系统版本 使用命令 Linux version 4.19.90-25.21.v2101.ky10.aarch64 (KYLINSOFTlocalhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Wed Sep 28 16:37:42 CST 2022可以看出这是麒麟 v10 ,aarch64 (ARM 架构的&#xff…

【d2l动手学深度学习】 Lesson 10 多层感知机 + 代码实现 试验结果对比

文章目录 1. 介绍2. 单层Softmax回归2.1 手写Softmax训练效果 2.2 调用pytorch内置的softmax回归层实现调用pytorch内置softmax实验结果总结 3. 一层感知机(MLP) Softmax实验结果 Reference写在最后 1. 介绍 在第十节课 多层感知机 的代码实现部分&…

机器学习1:k 近邻算法

k近邻算法(k-Nearest Neighbors, k-NN)是一种常用的分类和回归算法。它基于一个简单的假设:如果一个样本的k个最近邻居中大多数属于某一类别,那么该样本也很可能属于这个类别。 k近邻算法的步骤如下: 输入&#xff1a…

JVM第二讲:JVM 基础 - 字节码详解

JVM 基础 - 字节码详解 本文是JVM第二讲,JVM 基础-字节码详解。源代码通过编译器编译为字节码,再通过类加载子系统进行加载到JVM中运行。 文章目录 JVM 基础 - 字节码详解1、多语言编译为字节码在JVM运行2、Java字节码文件2.1、Class文件的结构属性2.2、…

Linux shell编程学习笔记10:expr命令 和 算术运算

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了 Linux shell编程 中的 字符串运算,今天我们研究 Linux shell编程的算术运算 ,为了方便举例,我们同时对expr命令进行…

TomCat关键技术

一、Tomcat 是什么 Tomcat 是一个 HTTP 服务器。通过前面的学习,我们知道HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式,同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端。HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 J…

hive add columns 后查询不到新字段数据的问题

分区表add columns 查询不到新增字段数据的问题; 5.1元数据管理 (1)基本架构 Hive的2个重要组件:hiveService2 和metastore,一个负责转成MR进行执行,一个负责元数据服务管理 beeline-->hiveService2/spar…

优思学院|八大浪费深度剖析

在工作流程中消除浪费是精益思想的目标。在深入探讨八大浪费之前,了解浪费的定义至关重要。浪费是指工作流程中的任何行动或步骤,这些行动或步骤不为客户增加价值。换句话说,浪费是客户不愿意为其付费的任何过程。 最初的七大浪费&#xff0…

竞赛选题 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

KdMapper扩展实现之SOKNO S.R.L(speedfan.sys)

1.背景 KdMapper是一个利用intel的驱动漏洞可以无痕的加载未经签名的驱动,本文是利用其它漏洞(参考《【转载】利用签名驱动漏洞加载未签名驱动》)做相应的修改以实现类似功能。需要大家对KdMapper的代码有一定了解。 2.驱动信息 驱动名称spee…

Excel恢复科学技术法显示的数据

Excel中输入位数较大的数据时,软件会自动使用科学计数法显示。很多时候并不需要这样的计数格式,所以需要把它转变为普通的数字格式 操作方法 选中单元格/列/行》右键》设置单元格式 在打开的窗口中,切换到“数字”选项卡,点击“自…

引领创新浪潮:“Polygon探寻新技术、新治理、新代币的未来之路!“

熊市是用来建设的,Polygon Labs一直在利用这漫长的几个月来做到这一点。 Polygon 是最常用的区块链之一,每周约有 150 万用户,每天超过 230 万笔交易,以及数千个 DApp,Polygon 最近面临着日益激烈的竞争。虽然从交易数…

BUUCTF [BJDCTF2020]JustRE 1

查看文件信息 使用IDA打开 shift F12搜索字符串 发现类似flag的字符串 点进去 一路跟踪到汇编窗口,然后F5 sprintf将格式化后的字符串输出到String中 最终String的值为 printf("BJD{%d%d2069a45792d233ac}",19999,0);也就是 BJD{1999902069a45792d…

【解决问题思路分析】记录hutool默认使用服务端上次返回cookie的问题解决思路

背景: 本服务需要调用第三方接口获取数据,首先调用public-key接口获取公钥,然后用公钥加密密码,将用户名和密码传入/ticket接口,获取Cookie和response body中的token。 排查思路 由于是调用第三方接口出现问题&…