Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6269503
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: 架构设计与优化

2013-12-19 12:13:02

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这个函数为真正做预取的函数。
阅读(1046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~