Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1857083
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 架构设计与优化

2013-12-09 19:06:06

ZFS在ARC之上建立了预取算法,具体实现在dmu_zfetch.c中。
与IBM的SARC算法不同,ZFS将预取算法和主Cache相分离。
每个dnode都会对应一个zfetch_t 这个结构
ZFS 支持四种预取方式:
向前预取,向后预取,向前Stride预取,向后stride预取。


上图所示为Stride预取方式,在Stride访问模式下, ZFS会将stream3预取出来,并向后预取一部分。
还有一种访问模式就是顺序访问模式:

该访问模式遍历链表,并判断当前访问流是否与dnode中的某个访问流构成连续的访问关系,如果构成则向前或者向后预取一部分即可。
所有的流都是以链表的形式存入到dnode的zfetch管理器中的。

点击(此处)折叠或打开

  1. typedef struct zfetch {
  2.     krwlock_t    zf_rwlock;    /* protects zfetch structure */
  3.     list_t        zf_stream;    /* AVL tree of zstream_t's */
  4.     struct dnode    *zf_dnode;    /* dnode that owns this zfetch */
  5.     uint32_t    zf_stream_cnt;    /* # of active streams */
  6.     uint64_t    zf_alloc_fail;    /* # of failed attempts to alloc strm */
  7. } zfetch_t;
上图所示,zfetch是对应于每个dnode的,相当于每个文件一个zfetch,里面包含了数据的访问流。如果连续,他会将相邻的流合并形成更大的流。


主要函数为:
dmu_zfetch_find
dmu_zfetch_colinear
dmu_zfetch为入口函数
dmu_zfetch_dofetch这个函数为真正做预取的函数。
阅读(3938) | 评论(3) | 转发(2) |
给主人留下些什么吧!~~

shenyanxxxy2013-12-13 14:23:01

ARC 可以识别出dmu_zfetch发出的IO为预取IO。如果ARC发现该请求为预取请求,如果之前为mfu_ghost,将其重新放入到mru中,而不是mfu中,因为这个毕竟是一个预取IO。

shenyanxxxy2013-12-10 13:06:19

dmu_zfetch_stream_reclaim 这个函数作用是将dnode中的过期的stream替换掉。
因为根据时间局部性原理,如果时间过了两秒,那么预取就没有作用了。

shenyanxxxy2013-12-10 09:35:27

ZFS的预取的预取的单位为数据块