那些“cache”和“buffer”(一)

page cache和buffer cache之间的关系以及验证 Linux系统存在两种缓存机制,分别是Page Cache和Buffer Cache, 其中Page Cache缓存文件的页以优化文件IO。Buffer Cache缓存块设备的块以优化块设备IO。 阅读详情

江湖人称:cache is king。

还有个与之类似的是buffer。这里就谈谈buffer和cache。

那么他们到底是用来干什么的呢?其实他们就是在两个相对独立的系统之间的一个中间层,用来避免这两个系统之间不必要的交互和不不必要的或者重复的同步。同步,你懂的,不同数量级系统之间的同步,你也懂的。比如内存和磁盘之间,比如应用和数据库之间。buffer针对写,cache针对读。

这篇文章先来看看Linux里面系统的那些cache和buffer(至于硬件里面的一些cache如cpu指令缓存这里就不谈了)。

首先是文件IO

对于写操作通常我们会遇到两个两个缓冲 (buffer):
一个是内核缓冲。

当我们调用write写文件时,write返回之后其实内容并没有立刻写到硬盘上,而是写到了内核的缓存中。什么时候写到磁盘?内核有一套刷缓存的机制。这样做有很明显的好处,比如我们调用1次write写1kb和调用1k次write每次写1b的数据,所花的时间是差不多的。后者所花的用户态/内核态切换时间多些,但是写磁盘的次数却是一样的。这样就大大提高了效率。

另外一个是glibc维护的用户态缓冲。

这个缓冲又是用来干什么的呢?内核和硬盘是两个相对独立的系统,内核缓冲在这两个之间避免了很多不必要的同步。那么同样,内核和用户程序也是两个相对独立的系统,每次系统调用也是要花代价的。所以上面1次write写1kb和调用1k次write每次写1b的数据的例子,前后两种方法还是有差距的,差距就在于后者需要做1k此用户态和内核态的切换。所以,glibc在用户态上又做了一个缓冲。当我们调用glibc提供的printf输出的时候,并没有直接映射到一次write系统调用,而是存在了glibc管理的缓冲中,当条件满足时(下面会说上面时候满足)再调用一次write,把用户态的缓冲写到内核态去。所以,调用1此printf到文件1kb字符和1k此print每次1个字符,所花的时间就真差不多了。

反过来,对于读,我们有缓存(cache)

用read读文件,其实就是读的内核的缓存。当内核缓存中没有的时候,会从磁盘读些内容到缓存,然后从缓存返回给用户。 注意,在某些情况下我们还可以做进一步的优化。考虑一下,我们从头到尾读文件,只读1次1kb和读1k次每次1b的时间是不是也差不多呢?这就需要内核在 read的时候事先读1kb的内容到缓存才行(这叫:read ahead)。而内核有不知道我们后续的read调用是从头到尾顺序读还是胡乱读,如果是随机读那么read ahead就会适得其反。还好posix规定了posix_fadvise()系统调用,让我们告诉内核,我们读文件的方式。用这个调用告诉内核我们是顺 序读。read的性能就上来了。爽啊。

下面列举一下glibc默认的缓冲的行为(可以通过setvbuf修改):

如果文件是stderr,则默认是没缓冲,每次printf对应一次write。

如同文件是终端,则默认是行缓冲,每当遇到换行的时候write一次

如果文件对应的是磁盘文件,则默认是全缓冲,当缓存区满或者文件关闭时会write。

当然,任何时候,你都可以调用fflush()来强制用户态的缓存写到内核缓冲中。

好,聊完了文件缓冲,下面聊聊socket的缓冲。

对!socket也是有缓冲的。同样的例子我们应用到socket上:1次send 1kb和1k次send每次1b。哪个费时费力呢?显然是后者,因为如果我们知道,IP包头,TCP包头都是要花带宽的。如果一个大大的IP包中只有1字节的数据,显然是大大的浪费了带宽。所以,John Nagle提出了Nagle算法,将这些凌乱的小包缓冲起来,集齐N个组成一个大包,再发出去。这样就大大提高了网络效率。

当然,这样做也是有负面作用的,当我们应用对网络的实时性要求比较高的时候,可能会因为这个机制而增加了网络延迟(毕竟要等集齐了才发嘛)。这时还是用setsockopt+TCP_NODELAY参数把这个优化禁用了吧。

还有吗?当然,cache和buffer无处不在。内存管理中到处有cache。就那用户空间来说,glibc中的ptmalloc2,google的TCMalloc都有cache的存在。由于这部分复杂度极高,后面有机会再分析吧。这篇文章就这样吧。

所以说:cache is king!


原始出处


内存中的Buffer和Cache有什么区别? 我们知道可以使用free 和 top 等工具,来查看系统和进程的内存使用情况,我们也知道内存和 CPU 的关系非常紧密,而内存管理本身也是很复杂的机制。所以,接下来一点点抽丝剥茧 free # 注意不同版本的 free 输出可能会有所不同 $ free total used free shared buff/cache ... 阅读详情

相关推荐

一文带你了解 Linux 的 Cache 与 Buffer

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

RAB 2392

Cache is King

版权声明:如有转载请求,请注明出处:http://blog.youkuaiyun.com/yzhz  杨争  Cache is King        Cache is King这句话说明了Cache在一个系统中对于提高系统性能的重要性。从硬件CPU到操作系统,从系统软件到应用软件,我们到处都可以看到Cache的身影。        对于基于J2EE的网站,如何使用好Cache成为我们网站实现高性

杨争的专栏 3299

buffer 和 cache 的含义

buffer和cache

afterlife_union的博客 1043

软件系统扩展性_我如何将软件系统的性能扩展35,000%

软件系统扩展性 重点 (Top highlight)An on-call developer’s worst nightmare (red indicates errors) 待命开发人员的噩梦(红色表示错误) 我如何将软件系统的性能扩展35,000% (How I Scaled a Software System’s Performance By 35,000%) 深入探讨如何通过缓存,作业...

weixin_26752759的博客 4602

使用GitLab+Drone CI持续集成自动部署web项目,图文详细

kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库

4105

第1章>>1.5:神电测控为什么开发LabVIEW ZYNQ FPGA软件工具包?(ZYNQ芯片的特点与优势)《LabVIEW ZYNQ FPGA宝典》

ZYNQ是赛灵思公司(Xilinx)推出的新一代全可编程片上系统(APSoC,All-Programmable SoC),它将处理器的软件可编程性与FPGA的硬件可编程性进行完美整合,以提供无与伦比的系统性能、灵活性与可扩展性。Zynq-7000系列是Xilinx于2010年4月推出的行业第一个可扩展处理平台,旨在为视频监视、汽车驾驶员辅助、工厂自动化、医疗器械等高端嵌入式应用提供所需的处理能力与计算性能。这款基于ARM处理器的SoC可满足复杂嵌入式系统的高性能、低功耗和多核处理能力等要求。

qq_40694786的博客 1646

Kafka为什么快

Kafka为什么快

959

深入C6678启动流程:从BootRom参数表到多核镜像部署的完整解析

本文深入解析TMS320C6678 DSP的启动流程,从BootRom参数表到多核镜像部署的全过程。详细介绍了七种启动模式的工程选择、多核镜像构建技巧以及二级引导策略,帮助开发者掌握C6678的启动机制与调试方法,提升嵌入式系统开发效率。

weixin_30505225的博客 610

内存中的buffer和cache

目录 一、free命令 二、buffer和cache的数据来源及含义 1、数据来源 2、Buffers、Cached 和 SReclaimable 3、其他注意点 三、如何利用Buffer 和 Cache优化程序的运行效率? 1、缓存命中率 2、指定文件的缓存大小 四、总结 一、free命令 提到查看linux主机内存,我们总会想到free命令也一般用该命令,如下面的输出: [root@localhost ~]# free total .

C-Jonn 4649

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

1、CUDA 编程基础

GPU计算的发展历程与重要性。首先回顾了计算机技术的发展,特别是摩尔定律的影响,强调了计算能力的快速提升。然而,随着晶体管尺寸的缩小和频率的停滞,单线程性能增长放缓。为了继续提升性能,多核处理器开始普及,促使软件开发者开始考虑并行计算。介绍了延迟导向设计和吞吐量导向设计的概念,CPU和GPU分别代表了这两种设计方法。GPU是吞吐量导向的,拥有众多弱小的ALU,通过流水线处理提高算术吞吐量。GPU的成功在于其高并行性和高吞吐量,以及能够分摊高昂的固定成本的大量销售额。

Justinyh的博客 579

Linux 内存中Page cache和buffer cache 的区别

Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有很多人在争辩和猜想这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正确的结论,在我工作的这一段时间,page cache和buffer cache的概念曾经困扰过我,但是仔细分析一下,这两个概念实际上非常的清晰。如果能够了解到这两个cache的本质,那么我们在分析io问题的时候可能会更加得心应手

haiross的专栏 7492

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6099

服务器buffer/cache 的产生原因和释放buffer/cache

Pagecache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用mmap是不是很自然的也应该用到pagecache?在当前的系统实现里,pagecache也被作为其它文件类型的缓存设备来用,所以事实上pagecache也负责了大部分的块设备文件的缓存工作。...

杜海的博客 5164

【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录

最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2万+

uniapp [全端兼容] - 实现上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频和删除功能,上传单个或多个视频文件及大文件(H5、小程序、app)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp+uview上传视频并预览,UNI-APP视频上传组件,实现视频文件上传视频回显,上传视频并预览、上传多个视频,实现上传视频功能+预览,上传显示视频功能,上传视频预览移除,批量上传视频,上传超大视频文件,视频上传并预览效果,uniapp上传视频,使用uview上传视频及预览,上传视频和删除视频功能,视频流上传播放功能,上传视频到后端,视频上传与实时预览功能,upload上传组件,视频播放器

🏆 前端领域优质创作者 1万+

【操作系统】操作系统的Buffer和Cache

本文带你了解操作系统中cache和buffer的区别,以及各自的使用场景。

互联网小阿祥 2918

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

什么是Cache?什么是Buffer?二者的区别是什么?

Buffer和Cache的区别 buffer与cache操作的对象就不一样。1、buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。 2、cache(缓存) 从CPU角度考虑,是为了提高cpu和内存之间的数据交换速度而设计的,例如平常见到的一级缓存、二级缓存、三级缓存。 cpu在执行程序所用的指令和读数据都是针对内存的,也就是从内存中取得的。由于内存读...

LiuNiuLangZhiLvNv的博客 6091

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux下的cache和buffer

一、缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。 缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。 CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与

jinking01的专栏 2170

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux buff cache区别,buffer和cache的区别

一,计算机硬件组成计算机硬件组成:CPU,存储器,输入输出设备(I/O),其他(主板,电源等)CPU:运算器,控制器存储器:内部存储器(ROM/RAM),外部存储器(磁盘等)I/O:输入设备(鼠标/键盘),输出设备(显示器/打印机)从性能分析:-CPU缓存>内存>磁盘>数据库从性能来看内存是介于CPU和磁盘,在实际中内存是CPU和磁盘的桥梁。buffer和cache是内存的不同的...

weixin_42298645的博客 2354

Linux中的buffer和cache到底是什么?今天终于明白了

在IT行业,有不少术语英文看起来区别不小,但是翻译成中文,就很容易混淆。今天我们就来说其中的一对术语——buffer和cache。 Buffer和cache英文看起来区别很大,但在不少公司里甚至部分翻译过来的技术图书里,经常被统称为“缓存”。或者叫“缓”什么什么… 上面的说法、翻译,是错误的! 01 带你认识正确的翻译 正确的翻译:buffer,缓冲区;cache,缓存。 先看英语解释,大体上看起来这样的:Abufferis something that has yet to b...

Testfan_zhou的博客 1765

buffer和cache的区别

cache实现数据的重复使用,速度慢的设备需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。Linux统计/监控工具sar详细介绍:要判断一个系统瓶颈问题,有时需要几个 sar 命令选项结合起来使用,例如:怀疑CPU存在瓶颈,可用 sar -u 和 sar -q deng 等来查看 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看 怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看。

大叶子不小的博客 1513

Linux内存中的 buffer 和 cache

Linux内存中的 buffer 和 cache 到底是个什么东东?   Linux 中的 free 命令,会输出:   total  总量   used  已使用   free  空闲   shared  共享内存   buffers     cached   前面四项都比较好理解,一看我也就知道啥意思了。但是buffer 和 cached 我就一直不很理解,终于看到某篇文章写...

jacke121的专栏 3053

cache 和 buffer的区别

cache 和 buffer的区别 A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use ; 对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存 Buffer:缓冲区,用于存储

Yonx 1330

Linux中Buffer和Cache的区别

free命令中会有一项buff/cache通过man free可以看到这里的关于buff/cache的介绍buff/cache包含两部分buffers:内核缓存区用到的内存,对应中Buffers的值cache:内核页缓存和Slab用到的内存,对应中Cached与之和。执行man proc可以看到关于的说明。Buffers是对原始磁盘块的临时缓存,通常不会特别大(20M左右)。Cached是从磁盘读取文件的页缓存是Slab的一部分。Slab包括两部分,其中的可回收部分,用记录,而不可回收的部分,用。

wbo 935

Linux之free命令介绍 及buffer和cache的区别

linux内存free命令介绍,Linux下 buffer和cache的区别

专注自动化、性能测试、测试架构学习交流 5011
上一篇: 反编译 Android apk
下一篇: 那些“cache”和“buffer”(二)
mingming_killer
博客等级 码龄19年 18粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值