我在之前的博文提过Flashcache的cache是以set为单位管理的,每个set默认2M。 当单个set里面的脏页数量超过dirty_thresh_pct的时候,就会启动背景工作队列来把超过设置的脏页回写到后备磁盘去。 这里有别的同学对flashcache设计文档的翻译.
参看dirty_thresh_pct的文档解释:
dev.flashcache.
.dirty_thresh_pct = 20
Flashcache will attempt to keep the dirty blocks in each set
under this %. A lower dirty threshold increases disk writes,
and reduces block overwrites, but increases the blocks
available for read caching.
Flashcache之所以这样做的目的是当它在处理用户IO请求需要cache块的时候,保证马上可以拿的出来。因为读写的时候,如果需要的cache块不能满足的话,flashcache选择简单的绕过cache机制,直接走uncache io, 同时启动页面回收,一下子收回超过设置部分的页面,对性能有很大的损失。
特别是顺序写的时候,写一圈,再回绕在写的场合,性能特别差,就是这个原因。
那么如何保持一定量的可用cache块就很重要。通常cache数据都有冷热点,而且和时间很大关系。flashcache对冷热的判断是透过LRU类似的算法来判断的,这个是基于使用频度的维度。但是缺乏时间维度的判断。
新版本的flashcache引入了fallow_delay参数来解决这个问题,如果一个脏页超过fallow_delay秒,默认15分钟,都没有重新被访问到,那么数据就会被回写。 回写后,作为候选页面可以被新的cache重新利用。
参看fallow_delay的文档解释:
Sysctls for writeback mode only :
dev.flashcache..fallow_delay = 900
In seconds. Clean dirty blocks that have been “idle” (not
read or written) for fallow_delay seconds. Default is 15
minutes.
Setting this to 0 disables idle cleaning completely.
但是这样也有不理想的地处,加大了回写的概率,相应的加大了刷盘的数量,增加后备慢速磁盘的负担。 于是它引入另外参数fallow_clean_speed控制每次回刷的强度。
dev.flashcache.
.fallow_clean_speed = 2
The maximum number of “fallow clean” disk writes per set
per second. Defaults to 2.
用户通过配置这二个参数能够更好的根据业务特点微调flashcache,取得性能和回写量的平衡。
祝玩得开心!
转载请注明:爱开源 » Flashcache新添加驱逐空闲脏页参数