欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    Linux 内存中的缓冲区(Buffer)与缓存(Cache) 区别与认知.docx

    • 资源ID:1163766       资源大小:113.83KB        全文页数:10页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Linux 内存中的缓冲区(Buffer)与缓存(Cache) 区别与认知.docx

    Linux内存中的缓冲区(BUffer)与缓存(CaChe)区别与认知Buffer和Cache的定义:Buffer:是原始磁盘块的临时存储,即将缓存数据写入磁盘。它通常不会很大(大约20MB)o这样,内核就可以将分散的写入集中起来,从而对磁盘写入进行统一优化。例如,多个小的写入可以合并为一个大的写入等。Cache:是用于从磁盘读取文件的页面缓存,用于缓存从文件中读取的数据。这样,下次访问这些文件数据时,可以直接从内存中快速取回,而无需再次访问缓慢的磁盘。但是让我问你,由于BUfTer只是将写入磁盘的数据的缓存。反过来,它还会缓存从磁盘读取的数据吗?或者Cache是从文件中读取数据的缓存,那么它是否也为写入文件缓存数据呢?如果你能回答以上两个问题,你可以跳过这篇文章,我想你已经对Buffer和CaChe有了很好的理解。但如果你不能,请留下来看看我的进一步解释。free命令要检查系统内存使用情况,您想到的第一个命令可能是free,例如:$free-htotalusedfreesharedbuff7cacheavailableMem:1.9G1.0G394M2.6M491M728MSwapiOBOBOB很明显,该输出包括了物理内存Mem和SWaP的具体使用情况(如总内存、已用内存、缓存、可用内存等)。缓存是BUffer和CaChe两部分的总和。让我们看一下free的手册页中的Buffer和Cache定义:BuffersMemoryusedbykemelbuffers(BuffersinZprocZmeminfo)cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimableinprocmeminfo)buff7cacheSumofbuffersandcache我们可以看到free命令的源数据实际上存储在proc/meminfo文件中。正如我前面提到的,Zproc是Linux内核提供的一个特殊的文件系统,它就像一个用户与内核交互的接口。/proc文件系统也是许多性能工具的最终数据源。在manproc中,BUfferS和Cached的定义如下:Buffers%luRelativelytemporarystoragefbrrawdiskblocksthatshouldn,tgettremendouslylarge(20MBorso).Cached%luIn-memorycacheforfilesreadfromthedisk(thepagecache).Doesn'tincludeSwapCached.SReclaimable%lu(sinceLinux2.6.19)PartofSlab,thatmightbereclaimed,Suchascaches.SUnreclaim%lu(sinceLinux2.6.19)PartofSlab,thatcannotbereclaimedonmemorypressure.至此,您可能认为您已经找到了我的问题的答案,“Buffer”只是用于将数据写入磁盘的缓存,“Cache”只是用于从文件中读取数据的缓存。但事实上,“Buffer”也可以用于读取,“Cache”也可以用于写入。实验我们将在这里做两个实验,写缓存和读缓存。写入Cache让我们登录到我们的LinUX主机并准备好两个终端。在终端1,让我们先清理缓存:roottest#free-htotalusedfreesharedbuff/cacheavailableMem:7.7G196M6.3G492K1.2G7.3GSwap:BBBroot0test#echo3>procsysvmdrop-cachesroottestfree-htotalusedfreesharedbuff/cacheavailableMem:7.7G195M7.3G492K154M7.3GSwap:BBB这里procsysVm/drop_caches是一个通过proc文件系统修改内核行为的例子。写入3意味着清理各耳缓存,例如文件页、目录条目和InOde。仍然在终端1,让我们开启vmstat2命令:S b freebuffcache45492605144404548764514484548972514488455572507708# vmstat 2 memoryd Wp S O 1-swap- si so to-bi8 43bo725-system-in cs us33253 4343 571482 428cpu- sy id wa1 981 1 99 1 98 32 61buff和cache就是我们前面看到的Buffer和Cache,单位是KBobi和bo分别表示块设备读取和写入的大小,以块/s为单位。由于Linux中的块大小为1KB,因此这个单位相当于KB/so接下来,转移到终端2并运行以下命令:roottest#ddif=devurandomof=tmpfilebs=lMcount=5O0500+0recordsin50+recordsout5242880Obytes(524MB)copied,3.25553s,161MB/s现在切换回终端1,并观察buff和cache的变化:Irootfltest # vmstat 2-memory free buff45492604548764O45489720455572Q4239456O4239472O4239588O423968Ocache 51444 514480 514488 57708 82358082358 82358 82358 823908-o bi8 O437 : O O : 124 ,bo725 3899 e 1280 97280-systemin3 253 343 482 688 259 249CS US 3 400 571 I 428 '185 420 396 I857 20 758 17283247I 989998! 61'49,99I 992 76 6 4 19 2通过观察VmStat的输出,我们发现运行dd命令时,CaChe一直在增长,而BUffer基本没有变化。读取Buffer现在,让我们做第二个实验。再次清除终端1中的缓存:roottest#free-husedfreesharedbuff/cacheavailabletotalMem:Swap:roottestroottest7.7GB#echo3>free-h266M5.4GOB0Bprocsysvmdrop-caches452K2.IG7.2Gtotalusedfreesharedbuff/cacheavailableMem:Swap:7.7GB190MOB7.4GB452K154M7.3G同样在终端1中,再次启动vmstat2命令:roottest#vmstat2procsemoryswapiosystemcpurbswpdfreebuffcachesisobiboincsussyidwast76885561714442349976882171441111790997688217144O117199990您可以看到此时buff为0。现在在终端2中,运行以下命令:root0testdata#ddif=devnvmelnlof=cicvullbs=lMcount=1024124+recordsin124+Orecordsout1073741824bytes(1.1GB)copied,7.18224s,149MB/s然后,回到终端1观察:J# vmstat 2 memoryfree 7704020 773400 773516 773524 7628284buff cache 739847287788 41369673392 67286773772 9267206652104 1048832 1614443728 169864128256128256616415952159521595215952159212 159941654 161148OO 0OO-10- bi-systemcpubo in cs us sy id wa st8235O990110190990115191991 17 184 G l 2754721944107961492354616231191O25471O6261187Q35471037466727522观察VmStat的输出,你会发现在读盘的时候(也就是bi>0的时候),Buffer和Cache都在增长,但是显然Buffer的增长要快很多。这意味着当从磁盘读取时,数据被缓存在Buffer中。现在我们几乎可以得出结论:读取文件时数据会缓存在Cache中,读取磁盘时数据会缓存在Buffer中。结论在这里您应该会发现,虽然本文对BUffer和CaChe进行了描述,但仍然无法涵盖所有细节。我们如今学到了以下两点:Buffer:既可以用作“要写入磁盘的数据缓存”,也可以用作“读取磁盘读的数据缓存Cache:既可以用作“从读取文件的页面缓存”,也可以用作“写入文件的页面缓存LCache和Buffer是两个不同的概念,简单的说,Cache是加速“读",而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffercache,本文后续的论述中,统一称为CaChe。Oracle中的IOgbUffer是解决redo写入的问题,而databuffercache则解决datablock的读写问题。对于OraCIe来说,如果IO没有在SGA中命中,都会发生物理IO,Oracle并不关心底层存储的类型,可能是一套存储系统,可能是本地磁盘,可能是RAIDl0,也可能是RAID5,可能是文件系统,也可能是裸设备,或是ASM。总之,OraCIe把底层的存储系统称为存储子系统。在存储系统中,CaChe几乎无处不在(在后面的论述中,我们统称为Caehe),文件系统有cache,存储有CaChe,RAID控制器上有CaChe,磁盘上也有cacheo为了提高性能,OraCIe的一个写操作,很有可能写在存储的CaChe上就返回了,如果这时存储系统发生问题,OraCle如何来保证数据一致性的问题。Oracle数据库最重要的特性是:Writeaheadlogging,在datablock在写入前,必须保证首先写入redolog,在事务commit时,同时必须保证redolog被写入。Oracle为了保证数据的一致性,对于redolog采用了directl,DirectIO会跳过了OS上文件系统的Caehe这一层。但是,OS管不了存储这一层,虽然跳过了文件系统的cache,但是依然可能写在存储的cache上。一般的存储都有CaChe,为了提高性能,写操作在CaChe上完成就返回给OS了,我们称这种写操作为Writeback,为了保证掉电时,cache中的内容不会丢失,存储都有电池保护,这些电池可以供存储在掉电后工作一定时间,保证CaChe中的数据被刷入磁盘,不会丢失。不同于UPS,电池能够支撑的时间很短,一般都在30分钟以内,只要保证cache中的数据被写入就可以了。存储可以关闭写cache,这时所有的写操作必须写入到磁盘才返回,我们称这种写操作为Writethrouogh,当存储发现某些部件不正常时,存储会自动关闭写cache,这时写性能会下降。RAlD卡上也有CaChe,一般是256M,同样是通过电池来保护的,不同于存储的是,这个电池并不保证数据可以被写入到磁盘上,而是为CaChe供电以保护数据不丢失,一般可以支撑几天的时间。还有些RAlD卡上有flashcache,掉电后可以将cache中的内容写入到flashcache中,保证数据不丢失。如果你的数据库没有存储,而是放在普通PC机的本地硬盘之上的,一定要确认主机中的RAID卡是否有电池,很多硬件提供商默认是不配置电池的。当然,RAID卡上的CaChe同样可以选择关闭。磁盘上的CaChe,一般是16M-64M,很多存储厂商都明确表示,存储中磁盘的CaChe是禁用的,这也是可以理解的,为了保证数据可靠性,而存储本身又提供了非常大的CaChe,相比较而言,磁盘上的CaChe就不再那么重要。SCSl指令中有一个FUA(FOrCeUnitACCeSS)的参数,设置这个参数时,写操作必须在磁盘上完成才可以返回,相当于禁用了磁盘的写CaChe。虽然没有查证到资料,但是我个人认为一旦磁盘被接入到RAID控制器中,写CaChe就会被禁用,这也是为了数据可靠性的考虑,我相信存储厂商应该会考虑这个问题。至此,我们可以看到Oracle的一个物理IO是经历了一系列的cache之后,最终被写入到磁盘上。CaChe虽然可以提高性能,但是也要考虑掉电保护的问题。关于数据的一致性,是由OraCle数据库,操作系统和存储子系统共同来保证的。对LinUX内存中的buffers和cache的认知buffers和cached机制引入在LinUX操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,于是在这种情况下,LinUX引入Tbuffers和cache机制。当系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到直接读出传送给应用程序,如果没有找到需要数据才从磁盘读取,这就是操作系统的缓存机制。通过缓存大大提高了操作系统的性能。举个例子,当你使用Vim编辑一个文件时,如果你修改了文件的内容并保存,数据会被先写入BUffer中,然后再被写入磁盘。当你再次打开这个文件时,文件的内容会被读入CaChe中,以加快文件的访问速度。buffers与cached区别Cache(缓存)是为了调高CPU和内存之间数据交换而设计。用于缓存从文件中读取的数据。这样下次访问这些文件数据时,可以直接从内存中快速取回,而无需再次访问缓慢的磁盘。Cache作为一个数据的长期的容器而其中的数据不一定非要被立刻处理。Buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备的数据交换而设计)。主要是针对写操作,目的是将写的操作集中起来进行,减少磁盘碎片和硬盘反复寻址过程,提高性能。Buffer中的数据是一定要在短时间内被处理的,因为Buffer只是暂存数据的临时区域。通过命令manfree查看帮助.buffersMemoryusedbykernelbuffers(Buffersinprocmeminfb)cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimableinprocmeminfo)buff7cacheSumofbuffersandcache.从free的手册中,可以看到buff/CaChe的说明:buff/cache是buffers和cache之和buffers是内核缓冲区用到的内存,对应的是procmeminfo中的Buffers值cache是内核页缓存和Slab用到的内存,对应的½procmeminfo中的Cached与SReclaimable之和lrootlocalhost|#egrep-rBuffers|ACached|SReclaimable7proc/meminfo;freeBuffers:0kBCached:385628kBSReclaimable:27204kBtotalusedfreesharedbuff/cacheavailableMem:9956724940528878828412832360280Swap:520188370992149196所以可以得出公式:buffcache=Buffers+Cached+SReclaimable=0KB+385628kB+27204kB=412832与free输出中的buff/cache相等,上述结论成立。buff/cache为什么会不断增长?1.inUX服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,这也正是IinUX内存管理中非常出色的一点,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,Iinux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以虽然对于操作系统来说系统的可用内存free非常少,但对于应用程序内存调用来讲,真正剩余的内存是free+buff/cache,大多数情况下可用内存是非常足够的。如何回收cache?1.inUX内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/CaChe的释放。尤其是被使用更多的CaChe空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放CaChe,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/CaChe空间可以被释放,这个想法没有问题。但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着CaChe清除的行为的,一般都是系统IO飙高,因为内核要对比CaChe中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用procsysvmdrop-caches这个文件来人工触发缓存清除的操作,该文件内容可以设置如下可选值:0:是系统默认值,默认情况下表示不释放内存,由操作系统自动管理1:释放页缓存2:释放dentries和inodes3:释放所有缓存所以根据上面的说明,分别将1,2,3这3个数字重定向到drop_caches中可以实现内存的释放,一般释放内存都是重定向3到文件中,释放所有的缓存注意:在释放缓存前先执行SynC命令完成写缓存到文件系统,防止丢数据。不过建议在生产环境中的服务器我们不要频繁的去释放内存,只在必要时候清理内存即可,更重要的是我们应该从应用程序层面去优化内存的利用和释放,经常清理内存可能只是暂时屏蔽的应用程序中的一些bug,所以更重要的是程序的调优,其他的交给操作系统来管理。swap的优化在引申一点SWaP相关的内容。swappiness的值的大小对如何使用SWaP分区是有着很大的联系的。SW叩PineSS=O的/候表示最大限度使用物理内存,演后才是SW叩空间,sw叩PineSS=100的时候表示积极的使用SWaP分区。IroOtloCalhOSt#CatzPrOesysvmSWaPPineSS30值为30,意思就是系统的物理内存在使用到IOo-30=70%的时候,就可以开始使用交换分区了。此参数设置了使用交换分区的可能性大小。在etcsysctl.conf文件中修改,加上如下内容:vm.swappiness=10然后执行命令,永久生效。sysctl-p深刻理解内存中的buffer和cache一、free命令提到查看IinUX主机内存,我们总会想到free命令也一般用该命令,如下面的输出:lrootlocalhost-#freetotalusedfreesharedbuff7cacheavailableMem:38612922832203424792118481532803375380Swap:209714802097148rootlocalhost-#free命令显示系统内存的使用情况,包括物理内存、交换内存(SWaP)和内核缓冲区内存,比如总内存、已用内存、缓存、可用内存等。其中缓存是Buffer和Cache两部分的总和。有关于free命令的使用,可自行百度,一搜一大堆。Mem行(第二行)是内存的使用情况。Swap行(第三行)是交换空间的使用情况。total列显示系统总的可用物理内存和交换空间大小。used列显示已经被使用的物理内存和交换空间。free列显示还有多少物理内存和交换空间可用使用。shared列显示被共享使用的物理内存大小。buff/cache列显示被buffer和CaChe使用的物理内存大小。available列显示还可以被应用程序使用的物理内存大小。二、buffer和CaChe的数据来源及含义1、数据来源从字面上来说,BUffer是缓冲区,而CaChe是缓存,两者都是数据在内存中的临时存储。那么,这两种“临时存储''有什么区别吗?free出来的数据是来自哪里呢?用manfree,就可以找到对应指标的详细说明:buffersMemoryusedbykemelbuffers(Buffersinprocmeminfo)cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimableinprocmeminfb)buff7cacheSumofbUffersandcache从free的手册中,你可以看到buffer和CaChe的说明。buffers是内核缓冲区用到的内存,对应的是procmeminfo中的Buffers值。cache是内核页缓存和Slab用到的内存,对应的是procmeminfo中的Cached与SReclaimable之和。这里的说明告诉我们,这些数值都来自procmeminfo,但更具体的BUffers、Cached和SReclaimable的含义又是什么呢?往下看。2、Buffers、Cached和Sreclaimable/proc是Linux内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从/proc中查询内核的运行状态和配置选项,查询进程的运行状态、统计数据等,也可以通过/proc来修改内核的配置。ProC文件系统同时也是很多性能工具的最终数据来源。比如free就是通过读取procmeminfo,得到内存的使用情况。继续说回procmeminfo,既然Buffers>CachedSReclaimable这几个指标不容易理解,还得继续查ProC文件系统,获取它们的详细定义。/ProczmeminfbThisfilereportsstatisticsaboutmemoryusageonthesystemJtisusedbyfree(l)toreporttheamountoffreeandusedmemory(bothphysicalandswap)onthesystemasWellasthesharedmemoryandbuffersusedbythekerneLEachlineofthefileconsistsofaparametername,fbllowedbyacolon,thevalueoftheparameter,andanoptionunitofmeasurement(e.g.,kB,').Thelistbelowdescribestheparametemamesandthefbrmatspecifierrequiredtoreadthefieldvalue.Exceptasnotedbelow,allofthefieldshavebeenpresentsinceatleastLinux2.6.0.Somefiledsaredisplayedonlyifthekemelwasconfiguredwithvariousoptions;thosedependenciesarenotedinthelist.Buffers%luRelativelytemporarystoragefbrrawdiskblocksthatshouldn,tgettremendouslylarge(20MBorso).Cached%luIn-memorycacheforfilesreadfromthedisk(thepagecache).Doesn'tincludeSwapCached.SwapCached%luMemorythatoncewasswappedout,isswappedbackinbutstillalsoisintheswapfile.(Ifmemorypressureishigh,thesepagesdon'tneedtobeswappedoutagainbecausetheyarealreadyintheswapfile.ThissavesIO.)SReclaimable%lu(sinceLinux2.6.19)PartofSlab,thatmightbereclaimed,suchascaches.SUnreclaim%lu(sinceLinux2.6.19)PartofSlab,thatcannotbereclaimedonmemorypressure.通过这个文档,我们可以看到:Buffers是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。Cached是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。SReclaimable是Slab的一部分。Slab包括两部分,其中的可回收部分,用SReClaimabIe记录;而不可回收部分,用SUnreCIaim记录。3、其他注意点文档上只提到,CaChe是文件读的缓存写文件时会用到CaChe缓存数据,而写磁盘则会用到BUffer来缓存数据。读文件时数据会缓存到Cache中,而读磁盘时数据会缓存到Buffer中。虽然文档提供了对BUffer和Cache的说明,但是仍不能覆盖到所有的细节:Buffer既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存Cache既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存这样,我们就回答了案例开始前的两个问题。简单来说,BUffer是对磁盘数据的缓存,而CaChe是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。Buffer和Cache分别缓存磁盘和文件系统的读写数据。从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁I/O对磁盘的压力。标题3三、如何利用Buffer和Cache优化程序的运行效率?1、缓存命中率该处的“缓存”,通指数据在内存中的临时存储。所谓缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。用来衡量缓存使用的好坏,评估提升程序的运行效率的效果。命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。在现在所有的高并发系统中,缓存是必不可少,更是必不可缺的核心模块,主要作用就是把经常访问的数据(也就是热点数据),提前读入到内存中。这样,下次访问时就可以直接从内存读取数据,而不需要经过硬盘,从而加快应用程序的响应速度。这些独立的缓存模块通常会提供查询接口,方便我们随时查看缓存的命中情况。不过LinUX系统中并没有直接提供这些接口,主要通过CaCheStat和CaChetOP查看查看系统缓存命中情况。cachestat提供了整个操作系统缓存的读写命中情况。cachetop提供了每个进程的缓存命中情况。注:CaCheStat和CaChetOP工具都是bcc软件包的一部分,它们基于LinUX内核的eBPF(extendedBerkeleyPacketFilters)机制,来跟踪内核中管理的缓存,并输出缓存的使用和命中情况。使用前要安装bcc软件包,bcc-tools需要内核版本为4.1或者更新的版本1、UbUntU系统中安装:2、CentOS:需要手动升级内核后再安装:更新Grub后重启grub2-mkconflg-obootgrub2grub.cfggrub2-set-default0rebootuname-ryuminstall-ybcc-toolsexportPATH=$PATH:/usr/share/bcc/tools运行cachestat和cachetop命令:(1) cachestat的运行界面,它以1秒的时间间隔,输出了3组缓存统计数据:cachestat13TOTALMISSESH1TSD1RTIESBUFFERS_MBCACHED_MB202117279202117279202117279CaCheStat的输出其实是一个表格。每行代表-组数据,而每一列代表不同的缓存统计指标。这些指标从左到右依次表示:TOTAL,表示总的I/O次数;MISSES,表示缓存未命中的次数;HITS,表示缓存命中的次数;DIRTIES,表示新世到缓存中的脏页数;BUFFERS_MB表示Buffers的大小,以MB为单位;CACHED.MB表示Cache的大小,以MB为单位。(2) cachetop的运行界面cachetopll:58:50BuffersMB:258/CachedMB:347/Sort:HITS/Order:ascendingPIDUIDCMDHITSMlSSESDlRTlESREADJ4IT%WRlTE_H1T%13029rootpython100100.0%0.0%输出跟t。P类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。HITS,表示缓存命中的次数;MISSES,表示缓存未命中的次数;DIRTIES,表示更增到缓存中的脏页数;READ-HIT,表示读的缓存命中率;WRITE_HIT,表示写的缓存命中率。2、指定文件的缓存大小使用PCStat这个工具,来查看文件在内存中的缓存大小以及缓存比例。pcstat是一个基于Go语言开发的工具,所以安装它之前,你首先应该安装Go语言。安装完Go语言,再运行下面的命令安装PCStat:$exportGOPATH=-/go$exportPATH=/go/bin:$PATH$gogetgolang.org/x/sys/unix$运行PCStat来查看文件的缓存情况了。比如,下面就是一个PCStat运行的示例,它展示了binls这个文件的缓存情况:pcstatbinls+NameSize(bytes)PagesCachedPercent+binlsl33792330000.000+输出中,CaChed就是binls在缓存中的大小,而PerCent则是缓存的百分比。你看到它们都是0,这说明binls并不在缓存中。接着,如果你执行一下Is命令,再运行相同的命令来查看的话,就会发现binls都在缓存中了:lspcstatbinls+NameSize(bytes)PagesCachedPercent+binls1337923333100.000+四、总结BUffe;和Cache分别缓存磁盘和文件系统的读写数据,可以极大提升系统的I/O性能。从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁I/O对磁盘的压力。通常,我们用缓存命中率,来衡量缓存的使用效率。命中率越高,表示缓存被利用得越充分,应用程序的性能也就越好。可以用cachestat和cachetop这两个工具,观察系统和进程的缓存命中情况。其中,cachestat提供了整个系统缓存的读写命中情况。CaChetOP提供了每个进程的缓存命中情况。不过要注意,Buffers和Cache都是操作系统来管理的,应用程序并不能直接控制这些缓存的内容和生命周期。所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升性能。比如,程序内部可以使用堆或者栈明确声明内存空间,来存储需要缓存的数据,或使用RediS这类外部缓存服务,优化数据的访问效率。

    注意事项

    本文(Linux 内存中的缓冲区(Buffer)与缓存(Cache) 区别与认知.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开