Cache,计算机中很常见的术语,在Host端,存储端,甚至交换机路由器上也都有。为什么会有cache,一句话就是为了解决CPU和硬盘速度的差异。在DS系列中,cache有哪些注意点呢?
通过SM,可以看到Lun的cache属性如下图,我们可以自己修改每个属性,但修改之前必须理解每个属性是什么意思,不然会造成不必要的麻烦。
image
1, read caching和dynamic cache read prefetch的区别?
read caching即读缓存,就是说host请求从磁盘读一个数据块A,它会先检查缓存中有没有,如果有就直接返回给主机,这样就省得再从磁盘上读;如果没有,那就给磁盘发读请求,磁盘会将数据块A先放到cache中,因为它猜测接下来主机可能还要用到数据块A。这就是读缓存
dynamic cache read prefetch,即read-ahead,也就是我们常说的预读机制,有一套内部的算法来决定预读多少数据。同样地,host请求从磁盘读一个数据块A,它会先检查缓存中有没有,如果有就直接返回给主机,这样就省得再从磁盘上读;如果没有,那就给磁盘发读请求,但此时磁盘会将A附近的B,C,D这些数据块一起放到缓存,因为它猜测主机接下来可能会用到数据块B,C,D。这就是预读机制。有一点要强调的是,read-ahead并不是所有场景都适用的,在顺序IO的情况下比较好,不适用于随机IO的场景。
2,“enable write cache with mirroring”这个是什么意思呢?我们经常会遇到需要换ctrl的情况,因为cache是存在控制器上的,那换了ctrl后,ctrl上的cache不是就丢了么?非也!会有mirroring,也就是镜像,两个ctrl的cache会相互镜像。当主机发过来一个IO到A控,同时会将这个IO写到B控的cache中,当A控收到B控的write acknowledged消息后,A控才会返回给主机写操作成功。这就保证了两个ctrl中的cache一致性。当然这多出来的一步copy操作会略有影响性能,但是却能保证数据一致性。具体请看下图
image
3,“enable write cache without batteries”
Cache减少了应用程序的response time,但是有一个问题,我们知道cache 是存在NVSRAM,存储一旦掉电cache中的数据就丢了,因此要保证cache中的数据可用,就要有电池来保证。DS系列存储中有两个Battery来确保cache数据万无一失,每个控制器都有各自的battery。有一个问题是,memory中的cache会在掉电的时候flush到哪里呢?Disk?No,是一个位于主板上的Flash Backup Device的设备。只有cache中的数据完全都flush到flash backup device中后,系统才算真正power off。所以在maintenance guide中特别强调了在power off系统时,当把两个电源都关掉后,一定要等battery的灯完全灭掉才能拔出控制器。这就是因为关掉电源,并不是真正的power off,cache中还有数据!
到底有哪些因素会影响cache呢?电池充电会影响么?答案是正常情况下不会。只有电池容量低于某个阀值,cache才会被disable,因为它觉得电量低于这个阀值后,它所拥有的power不足以支撑将cache flush到USB中,因此会disable cache,避免data loss。
提到电池,不得不提的就是learn cycle,那它是否一定会cache force disable?Learn cycle分为三个阶段:discharge, rest,charge,只有在discharge的阶段才可能disable,注意是可能。因为不同的机器会预设是否会放电低于那个阀值。举个例子,比如阀值是60%,那么有的机器在放电的时候会放到61%,然后charge,那就不会影响cache;但也有的会放到55%,那这在60%~55%的过程中,cache才会被disable。下图是一个learn cycle的例子。
image
因此“enable write cache without batteries”这个属性就是说不管有没有电池,write cache都会enable,事实上我们是不建议这么做的,因为一旦掉电cache中的数据会丢失,影响数据一致性。
4, Cache Flushing
--data times out(默认10S),如果10s内cache blocks没有被重新写,那就flush到disk
--cache 空间达到阀值。当达到start值时,会开始flush cache,当到了stop时,就停止flush cache
Flushing是以常见的“先进先出”【Least recently used】,即先刷最老的cache data
image
如何修改Flush cache?“Storage Subsystem”--“Change”--“Cache Settings”
image
上图中有个cache block size,这是什么意思呢?Cache是由Cache Blocks组成的,一个4KB的cache block能hold住8 Logical Block Address(LBAs)的数据。每个IO都会会被分成至少一个Full Cache Block。举个例子,一个12KB的IO,cache block size是4k,那就会分成3个cache block;如果是 cache block size是8k,那就是2个cache block,但其中有一个cache block只存储了4k,还有4k被浪费了;如果cache block size是16KB,那就是1个cache block,浪费了4KB。
image
----------------------------------------------------------------------------------------------------
关于cache先写这么多,以后想到再写。。。
阅读(1548) | 评论(0) | 转发(0) |