
所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它,它面向的是所有用户,相对而言session也是服务器上的一 段内存,但他面向的是单个用户。它是服务器的一段内存块,也就是说每个cache一经创建就占用了服务器资源的。所以从这点来说我们就可以说:并不是 cache越多越好。
cache 可以存放任何对象
2Cache 怎么样创建以及怎么样销毁
创建cache
在DotNet环境下通过CacheInsert(string key,object o)方法创建。
其中key 代表cache的ID,o代表存到cache里的对象。
销毁cache
通过方法CacheRemove(string key)
其中key 代表cache的 ID
调用cache
Cache支持装箱/拆箱 *** 作。如你可以把一个DataSet对象ds通过CacheInsert(“dsCache”,ds)的方式存到Cache中,可以通过拆箱 *** 作 DataSet ds = (DataSet)Cache[“dsCache”]来访问它。
3什么时候用cache
Cache 一般用于数据较固定,用的较频繁的地方。例如可以把进销存系统中可以把产品信息存入cache,在用户调用产品信息时通过调用cache即可,这样从很大 程度上减少了用户与数据库的交互,提高了系统的性能。反之,cache不适合用在数据变动快,使用范围很窄的地方。例如把一个具体采购单存入 cache中。
4cache 调用注意事项
Cache是有时间限制的。超过了服务器设置的过期时间,就会被服务器回收。当cache被回收后对应的内存块就会被清空,再次通过cache[“cachekey”]访问对象时返回的就是null值。所以以下这种调用就会出现异常
DataSet ds = (DataSet)Cache[“cacheds”];
DataRow dr = dsTable[0]Row[0]; //出错,ds为null值,不存在表0。
正确的写法应该是:
DataSet ds;
if(Cache[“cacheds”] != null)
{
ds = (DataSet)Cache[“cacheds”];
}
else
{
ds= GetDsFromDataBase();
}
DataRow dr = dsTable[0]Row[0];对进程没有任何影响,影响的是各个任务的事件,如网页的效果,网页由lig>1、查看你的系统cache大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/size
我的系统是centos 58。以上命令是查看Level 2cache的大小,在我的服务器上是256k,记住这个数,写程序时要用。
2、查看cache line的大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size
我的服务器上是64,单位是bytes,记住这个数,也要用到。
3、编写测试程序cachec:
[cpp] view plain copy print
int matrix[8192][16]; //4819216=2^18=512k bytes
void bad_access()
{
int k, j, sum = 0;
for(k = 0; k < 16; k++)
for(j = 0; j < 8192; j++)
sum += matrix[j][k];
}
int main()
{
int i;
for(i = 0; i< 5000000; i++)
bad_access();
return 0;
}
以上代码虽然简单,但要理解需要懂cache的简单结构及原理:cache是以64字节或者128字节为一行的,分为多组(或者叫多路),每次发生cache miss取数据时,cache会按照cache line为单位(这里也就是一次取64字节)从内存取数据。
第一步得知level 2 data cache总大小是256k,第二步得到每个cache line是64字节,所以,level2 data cache共256k/64=2^12=4096行。
想象一个表,每行64字节,一共4096行,共256k大小,这就是我们cache的简单结构。为了保证每次取数据都会发生miss,我们必须以>=64字节的步长取数据。
首先创建一个512K大的数组,要比cache大一倍。如果数组也是256k,当第一次循环结束,数组用完后再次从头开始取数据时,cache就不再被替换,所以不会再发生cache
miss,为了保证每次取数据都要发生cache miss,数组必须至少是cache大小的两倍及以上。
循环读取数组中的数据,每次读一个int大小,然后加64,再读取下一个cache line的数据,循环直到数组数据全部取出。
oprofile统计cache miss有个最低限制(我的098版本是2000000次),所以发生的miss数太小的话是娶不到的,所以加大循环次数至5000000。
4、至此可以进行100% cache
miss的测试了,但是经过测试发现 cache miss压根没发生,百思不得其解,请教boss后才想起来,x86有个stream
buffer硬件预取器,如果你取数据非常规律,那么硬件预取器经过训练后,会在你真正取数据之前,将你要的数据直接放到cache中。所以,要在至强处理器的服务器上做cache
miss测试,必须重启系统后,关闭硬件预取器。否则就要修改程序,写出真正随机取数据的代码,但是这无法保证cache
miss 率是100%,只能保证cache 命中率比较低而已。
5、SPEC CPU2006中的mcf发生cache miss rate很高,可以用其做测试。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)