cache和centos buff cache的区别

CPU Cache 如何影响程序性能 - 推酷
CPU Cache 如何影响程序性能
CPU Cache 是CPU 中用于减少平均访问内存时间的高速存储器件。较内存使用的DRAM ,cache 使用的SRAM 速度更快、价格也更高,所以cache 容量一般较小。与cache 相关的概念有:cache line,associativity(相连性),L1 cache,L2 cache ,cache 命中,cache 失效等。
cache 按层次分为L1、L2 甚至L3级cache,速度依次递减,容量依次增大。CPU 直接能够读取的只有L1 cache。在大多数处理器包括Intel CPU 中,cache按照缓存的指令或者数据分为数据缓存和指令缓存(如L1d 和L1i) 。在多核的CPU 中,每个核心具有独立的L1 级cache,往往公用L2 级cache。公用cache 可能存在多线程缓存污染等问题。
cache 和内存传输的最小单位是cache line ,一般大小为64 bytes。cache 每次从内存读取或者写入cache line 大小的数据,而 不是我们在程序中定义的数据结构的大小 。cache lines 之间的替换常用的是LRU 算法。如果CPU 读取的数据在cache 中,则cache 命中(cache hit),否则cache 失效(cache miss)。每一级的cache 失效将到下一级cache 中寻找数据,直至内存。cache miss 是有开销的,小于访存时间,大于cache hit 时间。每次cache 失效,CPU 就会处于停滞(stall)状态,直至缓存读取到所需要的数据。
因为cache 容量远小于内存(有种说法是1:1000),内存和cache 之间存在映射关系(associativity)。按照映射关系不同,分为:全相连映射(fully associative),多路组相连映射(N-way set associative)和直接映射(directly mapped)。全相连映射缓存和内存是全映射关系,内存中任何一块数据都可以没有限制地放的任何一个cache line 中,缓存利用率高,但设计复杂未被采用;直接映射将一块内存地址映射到一个cache line(the number of cache line = memory address%number of cache lines,其中内存地址以cache line 大小为单位),直接映射设计起来简单,但利用率低;多路组相连映射缓存更为常见,是设计复杂度和性能的权衡。它将一块内存映射到不同路上的cache lines 中,如果是8-路组相连,则一块内存映射到8-路上的cache lines 上(the number of cache line = memory address%(number of cache lines/number of ways)。不同路上的负责缓存相同内存的缓存构成一个集合set,不同set 缓存不同内存地址的数据。number of set = cache size/(ways of associativity * size of cache line)。
下图是两路组相连映射(Two-way set associative)的一个例子:
将给出几个缓存相关的程序用例,实验用例的环境如下:
CPU : Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 32KB L1 cache,12MB L2 cache
OS : 2.6.35-22-generic #33-Ubuntu
GCC Version : 4.4.5
compiler flags : -O3 -msse4 -DINTEL_SSE4 -Wall -std=c99
Example 1 : Cache Line
Cache line 的大小一般是64 Bytes,如果程序连续访问的数据在同一个cache line 中将减少cache miss 的次数。下面的程序以step 步为间隔访问64MB 数据:
unsigned int *
unsigned long long buff_size = 64*;
gettimeofday(&start, NULL);
for(unsigned long long i = 0; i & buff_ i=i+step){
pbuff[i] += 3;
gettimeofday(&end, NULL);
结果如下图:
图中步长在16 时出现拐点。在step & 16 时,并没有随着步长增加而减少运行时间,这是因为:unsigned int 类型大小为 4 Bytes,程序中如果步长小于16(16*4Bytes = 64Bytes)的话,步长较少只会增加cache 的命中,而cache 命中时间相对于从内存读取数据可忽略不计。而只有step&16 时,才能够减少因为从内存读取到缓存的数据量,从而减少运行时间。
Example 2 : Cache Size
cache 的大小对性能的影响巨大,下面的代码针对不同的buff_size 测试读写速度:
unsigned char *
for(int j = 0 ; j & ++j){
for(unsigned long long i = 0; i & buff_ i=i+64){
&&&&&&&&&&& (*(pbuff+i))++;
程序迭代访问一段buff ,计算访问速度,步长为64Bytes(size of cache line)。
在L1 cache 大小之前,速度都在50GB/s 速度以上。L2 cache 大小在12MB ,虽然在12MB 有下降沿,但不是很明显,这和编译器有关。但在32MB 以后速度基本上维持在3 GB/s 左右,大致为访存速度。
Example 3 : Cache Association
cache 的关联性也会影响到程序的性能,因为不同set 的cache 是负责不同内存块的。如果频繁访问某些内存块会导致某些sets of cache 经常被替换,而其余sets 没有被利用。下面的程序按照不同步长循环访问固定大小的buff,循环的次数iters 固定,因此cache miss 影响了系统运行时间
unsigned char *
for(unsigned long long i = 0; i & ++i){
&&& tmp = p+
&&& (*(pbuff+p))++;
&&& if(tmp&buff_size){p=0;}else{p=}
下面测试时buff 大小为32MB,循环运行2 29 得到的结果,L2 cache miss 对运行时间的影响非常明显,在512、、2048 等步长都出现了尖锐的峰值(原因在下面一个例子中分析)。
下图是buff 大小为33KB(大于L1 cache 32KB),循环运行2 29 的运行时间,在步长128,256,512 都出现了尖锐的峰值。我们的cache 是32KB,8路组相连,64 个cache sets,每个set 大小为512B(8 条cache line),那么相同set 映射的内存间隔为32KB/8 = 64&64B= 4KB。所以步长为4KB 的访问实际上访问的是位于同一个cache set 中的数据,访问集中在一个set 中导致大量的cache miss。同理步长为4KB的约数大小(如1KB,512B)时,访问会集中在2/4/8/.. 等cache sets 中,同样会因为LRU 导致大量cache miss 使得运行时间变长。这种内存间隔长度在Agner Fog 的
中有提到:
critical_stride = cache_size/number_of_ways = number_of_sets * line_size
& Example 4 : Matrix Inversion
下面是一个更实际的例子,转置一个正方矩阵:
#include&stdio.h&#include&stdlib.h&
invert_matrix(unsigned int *pm, unsigned int size_m){
&&& for(int i = 0; i & size_m; ++i){
&&&&&&& for(int j = 0; j & size_m; ++j){
&&&&&&&&&&& tmp = *(pm+i*size_m+j);
&&&&&&&&&&& *(pm+i*size_m+j) = *(pm+j*size_m+i);
&&&&&&&&&&& *(pm+j*size_m+i) =
int main(int argc, char*argv[]){
&&& unsigned int size_m = atoi(argv[1]);
&&& unsigned int *
&&& pmatrix = (unsigned int *)malloc(size_m*size_m*(sizeof(unsigned int)));
&&& memset(pmatrix, 255, size_m*size_m);
& invert_matrix(pmatrix, size_m);
&&& free(pmatrix);
下图则给出了转置一个矩阵随着矩阵大小增大所需要的时间:&
随着正方矩阵的增加,所需要的时间不断增加毋庸置疑,但“奇怪”的是512&512 大小的正方矩阵处出现了一个峰值。仔细分析下就知道还是critical_stride & 惹的祸。代码中inverse_matrix 中的循环执行的是置换matrix[i][j] 和matrix[j][i] 的值,其中matrix[i][j] 是按照内存顺序访问第i 行的元素,而matrix[j][i] 每次访问第i 列的所有元素。这些元素单独占据一个cache line,而且间隔为512*4Bytes = 2KB。也就是说同列上相间隔的一个元素差距为半个critical_stride ,同列上所有元素在内存上只映射到两个sets 16 个cache line,而一列中有512 个元素,这样就导致了在访问列上的元素时导致大量cache miss。使得行上的顺序访问无法利用到列上已经访问缓存在cache 上的元素。同理在256&256 和128&128 处也有两个峰值:
126&&& 24.792000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 254&&& 110.082000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
127&&& 25.243000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 255&&& 110.596000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
128&&& 43.110000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 256&&& 225.817000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
129&&& 25.892000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 257&&& 104.745000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
130&&& 26.431000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 258&&& 107.871000 us&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
不用奇怪在 处为啥没有也出现峰值,因为当矩阵增大到一定程度时,没有足够的L1 cache 缓存单列上的元素,从而导致matrix[i][j] 是按照内存顺序访问第i 行的元素也无法利用到列上元素的缓存,这是由于L1 cache 大小决定的,而不是因为列上元素只映射到少量的sets 中导致的,因此矩阵足够大时不会再有峰值。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致当前位置: >
linux的top下buffer与cache的区别
时间: 10:34 来源:未知 标签: 作者:谭博 阅读:次
& &缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据
的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据
时,速度快的设备的操作进程不发生间断。
& & & 当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,
这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会
自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。
其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有
内存可用。如果你希望手动去释放Cache Memory也是有办法的
我们使用的Linux和Windows可不太一样,用top命令得出来的可能不是真实使用的内存,用free命令第二行才是系统真实使用的内存
在终端中敲入:free
显 示:&total& used& free& shared& buffers& cached
Mem:&&& 332& 16936&&& 0&&&&& 85540&&& 126384
-/+ buffers/cache:2
系统的总物理内存:255268Kb(256M),但系统 当前真正可用的内存并不是第一行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
关注微信公众号
微信扫一扫,打赏我
内容不错,支持一下
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)3764人阅读
linux基本命令(34)
linux系统使用(38)
linux系统上,常用free命令查看内存的使用情况,本文主要为你介绍free命令的输出结果:
解释一下Linux上free命令的输出。
  下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:
FO[2][1] =&FO[3][2] =&&&
&&&&&&&&&&&&&&&&&& 1&&&&&&&&& 2&&&&&&&&& 3&&&&&&&&& 4&&&&&&&&& 5&&&&&&&&& 6
1&&&&&&&&&&&&& total&&&&&& used&&&&&& free&&&& shared&&& buffers&&&& cached
2 Mem:&&&&& && &&& 1401396&&&&&&&&& 0&&&& 870540&&
3 -/+ buffers/cache:&& &&
4 Swap:&&&& &&&& 224188&&
  free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free),这个比较清楚,不说太多。
  free输出地第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。
  第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:
KB(缺省时free的单位为KB)物理内存,即FO[2][1];在这些物理内存中有KB(即FO[2][2])被使用了;还用1401396KB(即FO[2][3])是可用的;
这里得到第一个等式:
FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。
FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS 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.
也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。
Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。我们可以做一个简单的测试:
释放掉被系统cache占用的数据;
echo&3&/proc/sys/vm/drop_caches
读一个大文件,并记录时间;关闭该文件;重读这个大文件,并记录时间;
第二次读应该比第一次快很多。原来我做过一个BerkeleyDB的读操作,大概要读5G的文件,几千万条记录。在我的环境上,第二次读比第一次大概可以快9倍左右。
  free输出的第二行是从一个应用程序的角度看系统内存的使用情况。
对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;
因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。
这里还用两个等式:
FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
这二者都不难理解。
  free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有输出值都是从/proc/meminfo中读出的。
在系统上可能有meminfo(2)这个函数,它就是为了解析/proc/meminfo的。procps这个包自己实现了meminfo()这个函数。可以下载一个procps的tar包看看具体实现,现在最新版式3.2.8。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:777121次
积分:9923
积分:9923
排名:第1591名
原创:244篇
转载:92篇
评论:91条
文章:10篇
阅读:21412
(2)(1)(4)(4)(5)(7)(4)(6)(5)(2)(15)(35)(22)(4)(19)(16)(30)(20)(33)(45)(19)(25)(16)(1)您所在的位置: &
Linux操作系统中内存buffer和cache的区别
Linux操作系统中内存buffer和cache的区别
从Free命令说起,来理解buffer和cache两个名词的真正含义。
我们一开始,先从Free命令说起。
free 命令相对于top 提供了更简洁的查看系统内存使用情况:
total used free shared buffers cachedMem: 332 40 126384-/+ buffers/cache: Swap:
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 + free1total1 = used2 + free2used1 = buffers1 + cached1 + used2free2 = buffers1 + cached1 + free1
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 必会非常小。
【相关文章】
【责任编辑: TEL:(010)】
关于&&&&&&的更多文章
Linux系统的魅力之一就是你可以直接从终端使用命令行来管理整个
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
讲师: 13人学习过讲师: 64人学习过讲师: 29人学习过
近日,中国工程院院士倪光南老师在接受国内媒体采访时
有媒体报道称微软将于9月30日首次发布Windows 9 预览
CentOS是Linux发行版之一,它是来自于Red Hat Enterpr
本书是在“思想方法学”这一软件工程尚未涉足过的领域中的实习之作。作者亲历国内软件工程的英雄时代、泡沫时代,从失败中醒觉而
51CTO旗下网站}

我要回帖

更多关于 centos buff cache 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信