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

26317人阅读
Linux(95)
[root@rac1 ~]# free&
&&&&&&&&&&&& total&&&&&& used&&&&&& free&&&& shared&&& buffers&&&& cached
Mem:&&&&&& & && &&&&26124&&&&& 0&&&& 124212&&&& 413000
-/+ buffers/cache:&&& &&&&471772&&& &&563336
Swap:&&&& &&2096472&& 842320& &&&1254152
&&&&&& linuxLinux
&&&&&& Linux
Mem-/+ buffers/cached Swapmem,bufferscacheswap
&&&&&& Total1035108KB
&&&&&& Used1008984KBbuffers cache
&&&&&& Free26124KB
&&&&&& Shared0kb
&&&&&& Buffers124212KBbuffers
&&&&&& Cached413000KBcache
-/+ buffers/cache
&&&&&& Used471772kbbuffers cache
&&&&&& Free: 563336kb, buffers cache
&&&&&& Free-/+ buffers/cache= Free(Mem)+buffers(Mem)+Cached(Mem);
&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&& 563336 = 26124 + 3000
&&&&&& Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)
&&&&&& &&&&&& 1008984kb = 471772 + 3000
&&&&&& totalMem = used(-/+ buffers/cache) + free(-/+ buffers/cache)
&&&&&&&&&&&&&&&&&&&& 1035108 = 471772 + 563336
.& buffer cache
&&&&&& 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.
&&&&&& CacheCPU
&&&&&& CPUCPUCacheCPUCPUCache,CPU,
&&&&&& CacheCache(L1 Cache)Cache(L2 Cache)L1 CacheCPUL2 Cache,CPU256KB512KB L2 Cache
2.2 Buffer
&&&&&& Buffer
Freebuffercache
&&&&&& buffer : buffer cachedisk
&&&&&& cache: page cache, cachememory
cache cachecacheIO
-------------------------------------------------------------------------------------------------------
Blog http://blog.csdn.net/tianlesoftware
Email: dvd.
DBA1 ();&& DBA2 ()&& DBA3 ()&&
DBA ();& DBA4
& DBA5 &&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
日,CNDBA社区正式上线测试,欢迎来CNDBA社区学习交流!
积分:111082
积分:111082
排名:第5名
原创:1004篇
转载:86篇
评论:2082条
安徽DBA俱乐部,俱乐部整合安徽地区的IT资源,现有成员已经包含安徽大部分IT公司,俱乐部除了资讯信息分享之外,也会定期举行线下活动。欢迎安徽地区的DBA 加入.
,备注,加群必须注明籍贯,该群只对安徽地区开放。
注意:加群必须注明表空间和数据文件关系
不要重复加群
----------------------
CNDBA_1: k群,大量空闲)
CNDBA_2: (满)
CNDBA_5: (满)
CNDBA_7: (满)
(1)(1)(1)(4)(4)(10)(13)(6)(1)(1)(5)(1)(1)(1)(5)(6)(5)(1)(3)(5)(5)(3)(15)(21)(5)(5)(3)(21)(15)(9)(5)(26)(33)(7)(26)(35)(31)(22)(21)(34)(43)(17)(95)(51)(30)(51)(54)(41)(22)(28)(24)(24)(21)(14)(23)(24)(10)(12)(23)(29)(39)linux page buffer cache深入理解
作者:佚名
字体:[ ] 来源:互联网 时间:11-14 10:02:43
Page cache和buffer cache一直以来是两个比较容易混淆的概念,在我工作的这一段时间,page cache和buffer cache的概念曾经困扰过我,如果能够了解到这两个cache的本质,那么我们在分析io问题的时候可能会更加得心应手
Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有很多人在争辩和猜想这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正确的结论,在我工作的这一段时间,page cache和buffer cache的概念曾经困扰过我,但是仔细分析一下,这两个概念实际上非常的清晰。如果能够了解到这两个cache的本质,那么我们在分析io问题的时候可能会更加得心应手。 Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。 Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。 简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。 补充一点,在文件系统层每个设备都会分配一个def_blk_ops的文件操作方法,这是设备的操作方法,在每个设备的inode下面会存在一个radix tree,这个radix tree下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。如果设备做了文件系统,那么会生成一个inode,这个inode会分配ext3_ops之类的操作方法,这些方法是文件系统的方法,在这个inode下面同样存在一个radix tree,这里会缓存文件的page页,缓存页的数量在top程序的cache一栏进行统计。从上面的分析可以看出,2.6内核中的buffer cache和page cache在处理上是保持一致的,但是存在概念上的差别,page cache针对文件的cache,buffer是针对磁盘块数据的cache,仅此而已。 buffer 与cache 的区别 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. 更详细的解释参考:Difference Between Buffer and Cache 对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory? cache 和 buffer的区别: Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache. Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。 Free中的buffer和cache:(它们都是占用内存): buffer :作为buffer cache的内存,是块设备的读写缓冲区 cache:作为page cache的内存, 文件系统的cache 如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。
大家感兴趣的内容
12345678910
最近更新的内容用户名:UltraSQL
文章数:479
评论数:235
访问量:801931
注册日期:
阅读量:1297
阅读量:3317
阅读量:428340
阅读量:1116330
51CTO推荐博文
Linux系统中的Page cache和Buffer cacheFree命令显示内存首先,我们来了解下内存的使用情况:&Mem:表示物理内存统计total:表示物理内存总量(total = used + free)used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。free:未被分配的内存。shared:共享内存。buffers:系统分配但未被使用的buffers 数量。cached:系统分配但未被使用的cache 数量。-/+ buffers/cache:表示物理内存的缓存统计used2:也就是第一行中的used C buffers-cached 也是实际使用的内存总量。 //used2为第二行free2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。Swap:表示硬盘上交换分区的使用情况。&在Free命令中显示的buffer和cache,它们都是占用内存:buffer : 作为buffer cache的内存,是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区。cache: 作为page cache的内存, 文件系统的cache,是memory的缓冲区 。如果cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小 。&Page cache(页面缓存)Page
也叫页缓冲或文件缓冲,是由好几个磁盘块构成,大小通常为4k,在64位系统上为8k,构成的几个磁盘块在物理磁盘上不一定连续,文件的组织单位为一页,
也就是一个page cache大小,文件读取是由外存上不连续的几个磁盘块,到buffer cache,然后组成page
cache,然后供给应用程序。&Page cache在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问。具体说是加速对文件内容的访问,buffer cache缓存文件的具体内容――物理磁盘上的磁盘块,这是加速对磁盘的访问。&Buffer cache(块缓存)Buffer
cache 也叫块缓冲,是对物理磁盘上的一个磁盘块进行的缓冲,其大小为通常为1k,磁盘块也是磁盘的组织单位。设立buffer
cache的目的是为在程序多次访问同一磁盘块时,减少访问时间。系统将磁盘块首先读入buffer cache
如果cache空间不够时,会通过一定的策略将一些过时或多次未被访问的buffer
cache清空。程序在下一次访问磁盘时首先查看是否在buffer cache找到所需块,命中可减少访问磁盘时间。不命中时需重新读入buffer
cache。对buffer cache 的写分为两种,一是直接写,这是程序在写buffer cache后也写磁盘,要读时从buffer
cache 上读,二是后台写,程序在写完buffer cache
后并不立即写磁盘,因为有可能程序在很短时间内又需要写文件,如果直接写,就需多次写磁盘了。这样效率很低,而是过一段时间后由后台写,减少了多次访磁盘
的时间。&Buffer cache 是由物理内存分配,linux系统为提高内存使用率,会将空闲内存全分给buffer cache ,当其他程序需要更多内存时,系统会减少cahce大小。&Buffer page(缓冲页)如果内核需要单独访问一个块,就会涉及到buffer page,并会检查对应的buffer head。&Swap space(交换空间)Swap
交换空间,是虚拟内存的表现形式。系统为了应付一些需要大量内存的应用,而将磁盘上的空间做内存使用,当物理内存不够用时,将其中一些暂时不需的数据交换
到交换空间,也叫交换文件或页面文件中。做虚拟内存的好处是让进程以为好像可以访问整个系统物理内存。因为在一个进程访问数据时,其他进程的数据会被交换
到交换空间中。&Swap cache(交换缓存)swapcached,它表示交换缓存的大小。Page cache是磁盘数据在内存中的缓存,而swap cache则是交换分区在内存中的临时缓存。&Memory mapping(内存映射)内
核有两种类型的内存映射:共享型(shared)和私有型(private)。私有型是当进程为了只读文件,而不写文件时使用,这时,私有映射更加高效。
但是,任何对私有映射页的写操作都会导致内核停止映射该文件中的页。所以,写操作既不会改变磁盘上的文件,对访问该文件的其它进程也是不可见的。&共
享内存中的页通常都位于page cache,私有内存映射只要没有修改,也位于page
cache。当进程试图修改一个私有映射内存页时,内核就把该页进行复制,并在页表中用复制的页替换原来的页。由于修改了页表,尽管原来的页仍然在
page cache,但是已经不再属于该内存映射。而新复制的页也不会插入page cache,而是添加到匿名页反向映射数据结构。&Page cache和Buffer cache的区别磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。&假设我们通过文件系统操作文件,那么文件将被缓存到Page Cache,如果需要刷新文件的时候,Page Cache将交给Buffer Cache去完成,因为Buffer Cache就是缓存磁盘块的。&也就是说,直接去操作文件,那就是Page Cache区缓存,用dd等命令直接操作磁盘块,就是Buffer Cache缓存的东西。&Page
cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page
cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page
cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。&Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。&简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。&Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。&Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)3345人阅读
文件系统(13)
linux buffer 与 cache 的区别。
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.
两者都是RAM中的数据。简单来说,buffer(缓冲)是即将要被写入磁盘的,而cache(缓存)是被从磁盘中读出来的
缓冲(buffers)
缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据
的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据 时,
速度快的设备的操作进程不发生间断
是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的 MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘
其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有 内存可用。
如果你希望手动去释放Cache Memory也是可以的
如何手工释放Cache Memory(缓存内存), 用下面的命令可以释放Cache Memory:
To free pagecache
&&&& $ echo 1&/proc/sys/vm/drop_caches
To free dentries and inodes: &
&&&& $ echo 2&/proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
&&&& $ echo 3&/proc/sys/vm/drop_caches
注意,释放前最好sync一下,防止丢失数据。
2. 解释 free 命令
free命令中的buffer和cache:(它们都是占用内存):
&&&&&& buffer : 作为buffer cache的内存,是块设备的读写缓冲区
&&&&&& cache: 作为page cache的内存, 文件系统的cache
#这个命令行用来调查谁在加数据入page_cache
[root@my031045 ~]# stap -e 'probe vfs.add_to_page_cache {printf(&dev=%d, devname=%s, ino=%d, index=%d, nrpages=%d/n&, dev, devname, ino, index, nrpages )}'
dev=2, devname=N/A, ino=0, index=2975, nrpages=1777
  $ free
&&&&& total&&&&&&&&&&&&&&& used&&&&&&&&&&&&&&&& free&&&&&&&&&&&&&&&&&& shared&&&&&&&&&&&&&& buffers&&&&&&&&&&&& cached &
Mem: 255268&&&&&&&&&&&&&& 238332&&&&&&&&&&&&&& 16936&&&&&&&&&&&&&&&&&&&&&& 0&&&&&&&&&&&&&& 85540&&&&&&&&&&&&&& 126384
-/+ buffers/cache: && &&& 26408&&&&&&&&&&&&&&& 228860
Swap: 265000&&&&&&&&&&&&& 0&&&&&&&&&&&&&&&&&&& 265000
  Mem:表示物理内存统计
  -/+ buffers/cached:表示物理内存的缓存统计
  Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
  系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
  我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
  total1:表示物理内存总量。
  used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
  free1:未被分配的内存。
  shared1:共享内存,一般系统不会用到,这里也不讨论。
  buffers1:系统分配但未被使用的buffers 数量。
  cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
  used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。
  free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
  可以整理出如下等式:
  total1 = used1 + free1
&&& total1 = used2 + free2
&&& used1 = buffers1 + cached1 + used2
&&& free2 = buffers1 + cached1 + free1
可见,used2 是真正使用的, 比used1 小, used1 包含分配但未使用内存。
&&&&& free2 是真正可使用的。比free1 大,free1 未包含分配但未使用内存
读程序& 看cache 会越来越大
写程序& 看buffer 会越来越大
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:631268次
积分:8373
积分:8373
排名:第2159名
原创:325篇
评论:67条
(5)(12)(1)(2)(1)(3)(2)(5)(13)(3)(2)(1)(2)(1)(2)(10)(9)(6)(8)(1)(6)(8)(1)(7)(6)(4)(1)(9)(5)(4)(3)(8)(6)(18)(9)(6)(1)(4)(8)(9)(7)(14)(5)(5)(2)(2)(4)(1)(4)(3)(3)(5)(2)(3)(7)(5)(4)(6)(2)(11)(4)(2)(2)(11)(1)(1)(1)(1)Buffer cache和page cache的区别_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Buffer cache和page cache的区别
来源:Linux社区&
作者:alanwu
Page cache和buffer cache到底有什么区别呢?很多时候我们不知道系统在做IO操作的时候到底是走了page cache还是buffer cache?其实,buffer cache和page& cache是Linux中两个比较简单的概念,在此对其总结说明。
Page cache是vfs文件系统层的cache,例如 对于一个ext3文件系统而言,每个文件都会有一棵radix树管理文件的缓存页,这些被管理的缓存页被称之为page cache。所以,page cache是针对文件系统而言的。例如,ext3文件系统的页缓存就是page cache。Buffer cache是针对设备的,每个设备都会有一棵radix树管理数据缓存块,这些缓存块被称之为buffer cache。通常对于ext3文件系统而言,page cache的大小为4KB,所以ext3每次操作的数据块大小都是4KB的整数倍。Buffer cache的缓存块大小通常由块设备的大小来决定,取值范围在512B~4KB之间,取块设备大小的最大公约数。具体关于buffer cache的块大小问题可以参见我的另一篇博文《Linux中Buffer cache性能问题一探究竟》见 &。
这里我们可以通过一个小实验来观察一下buffer cache和page cache的差别。运行top命令,我们可以看到实验机器当前内存使用情况:
可以看出内存总容量为16GB左右,page cache用了将近10GB(3796K),buffer cache用了300MB(303796K),其余6GB(6255076K)空闲剩余。在这种情况下,如果对设备dm0进行裸盘写操作,即运行如下命令:
dd if=/dev/zero of=/dev/dm0 count=4096
那么,我么可以通过top命令发现,buffer cache的容量越来越大,空闲内存越来越少,相当一部分内存被buffer cache占用,并且在IO操作的过程中发现bdi(flush-254:176)线程在繁忙的进行数据回刷操作。
经过一段时间以后,大约6GB(6401432KB)的内存被buffer cache占用,89MB(89312KB)内存空闲,其余大约10GB(KB - 6401432KB)的内存还是被page cache占用。通过这个实验,可以说明对于裸盘的读写操作会占用buffer cache,并且当读写操作完成之后,这些buffer cache会归还给系统。为了验证page cache的占用情况,我做了文件系统级的读写操作,运行如下命令进行文件系统写操作:
cp /dev/zero ./test_file
这是一次文件拷贝操作,因此会采用page cache对文件数据进行缓存。通过top工具我们可以看出在数据拷贝的过程中,page cache的容量越来越大,空闲内存数量急剧下降,而buffer cache保持不变。
拷贝一定时间之后,空闲内存将为1.9GB(1959468KB),文件系统page cache增长为将近14.5GB(KB & 235108KB),buffer cache维持在235MB左右(235108KB)。
由此我们可以得出,page cache和buffer cache最大的差别在于:page cache是对文件数据的缓存;buffer cache是对设备数据的缓存。两者在实现上差别不是很大,都是采用radix树进行管理。
相关资讯 & & &
& (08月09日)
& (03月17日)
& (05/24/:37)
& (04月09日)
& (07/24/:47)
& (03/27/:20)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 free buffer cache 的文章

 

随机推荐