一文带你了解 Linux 的 Cache 与 Buffer

news2024/9/23 17:17:02

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.coloradmin.cn/o/1079775.html

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

相关文章

【实战】kubeadmin安装kubernetes集群

文章目录 前言服务器介绍准备工作设置服务器静态ip修改host关闭防火墙和swap修改所需的内核参数 部署步骤安装containerd安装cri工具(效果等同于docker) 安装kubernetes集群安装网络插件flannel安装可视化面板kuboard(可选) 下期预…

42. QT中开发Android配置QFtp功能时遇到的编译问题

1. 说明 此问题仅适用在QT中开发Android程序时,需要适用QFtp功能的情况。一般情况下,如果开发的是Windows或者Linux系统下的程序,可能不会出现该问题。 2. 问题 【Android】在将QFtp的相关代码文件加入到项目中后,编译项目时会…

sql server判断两个集合字符串是否存在交集

sql server判断字符串A101;A102和字符串A102;A103是否存在交集 我们编写两个函数: 1)函数fn_split将字符串拆分成集合 create function [dbo].[fn_split](inputstr varchar(8000), seprator varchar(10)) returns temp table (Result varchar(200)) a…

TCP/IP(七)TCP的连接管理(四)全连接

一 全连接队列 nginx listen 参数backlog的意义 nginx配置文件中listen后面的backlog配置 ① TCP全连接队列概念 全连接队列: 也称 accept 队列 ② 查看应用程序的 TCP 全连接队列大小 实验1: ss 命令查看 LISTEN状态下 Recv-Q/Send-Q 含义附加:…

2785323-77-3,MAL-Alkyne,双功能连接试剂Alkyne maleimide

炔烃马来酰亚胺,Alkyne maleimide,MAL-Alkyne是一种非常有用的双功能连接试剂,可以在生物分子中发挥重要的作用。它的马来酰亚胺基团可以与生物分子中的硫醇基团反应,形成共价键,从而将生物分子与炔烃连接起来。这种连接方式在生物…

React的类式组件和函数式组件之间有什么区别?

React 中的类组件和函数组件是两种不同的组件编写方式,它们之间有一些区别。 语法和写法:类组件是使用类的语法进行定义的,它继承自 React.Component 类,并且需要实现 render() 方法来返回组件的 JSX。函数组件是使用函数的语法进…

Linux|qtcreator编译可执行程序双击运行

qt GUI window移植到linux参见:VS|vs2017跨平台编译linux&&CConsole&&QtGUI 参考:QtCreator修改项目的生成目录 文章目录 双击.pro文件,点击configureproject构建项目切换到release模式下双击打开pro文件,修改依赖…

嵌入式Linux裸机开发(六)EPIT 定时器

系列文章目录 文章目录 系列文章目录前言介绍配置过程 前言 前面学的快崩溃了,这也太底层了,感觉学好至少得坚持一整年,我决定这节先把EPIT学了,下面把常见三种通信大概学一下,直接跳过其他的先学移植了,有…

项目平台——项目首页设计(五)

这里写目录标题 一、页面成果图展示二、滚动条组件的使用三、页面设计1、需要4个盒子2、项目名称样式设计3、对基本信息、bug统计、执行记录进行样式设计4、基本信息5、bug统计 四、echarts使用1、安装2、折线图的使用 一、页面成果图展示 二、滚动条组件的使用 当内容超过屏幕…

虹科技术 | 重磅更新!手持式PCAN-Diag FD现可扩展为J1939监控器

重磅更新!现可将手持式PCAN-Diag FD现可扩展为J1939监控器,协助您的CAN总线通信诊断! 文章目录 一、PCAN-Diag FD 功能更新二、PCAN-Diag FD 简介 一、PCAN-Diag FD 功能更新 PCAN-Diag FD可以监控CAN/CAN FD总线的通信情况,可以…

SAP 设置不能用ME52N修改PR,但需要PR的修改权限

SAP 设置不能用ME52N修改PR,但需要PR的修改权限 想到3个思路: 1.设置屏幕字段控制,分配用户参数 2.设置屏幕变式SHD0 3.增强逻辑控制 此处用增强示例:

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

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

第十七章总结

一.SQL语言 1.select语句 select语句用于从数据表中检索数据。语法: SELECT 所选字段列表 FROM 数据表名 WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式(指定分组的条件) OEDER BY 字段名[ASC|DESC] 2.insert语句 i…

Adobe Media Encoder 2024,高效编码和转换视频的首选工具

Adobe Media Encoder 2024(简称Me2024)是Adobe公司推出的一款专业级视频编码和转换工具。它可以将各种格式的音频、视频文件转换为您需要的格式,并支持批量处理,让您在短时间内完成大量任务。 Me2024集成了Adobe Premiere Pro、A…

面部检测与特征分析:视频实时美颜SDK的核心组件

随着视频直播、社交媒体和在线会议的流行,人们对于美颜工具的需求不断增加。无论是自拍照片还是视频聊天,美颜技术已经成为现代应用程序的不可或缺的一部分。本文将深入探讨视频实时美颜SDK的一个核心组件——面部检测与特征分析。 一、面部检测技术 …

设计一个 SSO 单点登录系统

单点登录 (SSO) 发生在用户登录到一个应用程序,然后自动登录到其他应用程序时,无论用户使用的平台、技术或域如何。用户仅登录一次,因此功能的名称(单一登录)。 例如,如果您登录 Gm…

双周赛114(模拟、枚举 + 哈希、DFS)

文章目录 双周赛114[2869. 收集元素的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-collect-elements/)模拟 [2870. 使数组为空的最少操作次数](https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-empty/)哈希 枚举 [2871. 将数…

【Redis】之高并发场景下主从同步数据一致性问题探究

高并发极限场景 问题分布式锁失效,高并发极限场景下主从同步延时主节点崩溃等原因导致的数据不一致 背景知识:redis主从复制为异步同步过程 如图:redis cluster集群部署,多主多从架构(基于哈希槽的分配策略&#xf…

Flink报错could not be loaded due to a linkage failure

文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业,点Submit没反应,F12看到接口报错信息为: 大概意思是,由于链接失败,无法加载程序的入口点类xx。没啥鸟用的信息,去日志目录继续分析&#xff1a…