与IBM的SARC算法不同,ZFS将预取算法和主Cache相分离。
每个dnode都会对应一个zfetch_t 这个结构
ZFS 支持四种预取方式:
向前预取,向后预取,向前Stride预取,向后stride预取。

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

该访问模式遍历链表,并判断当前访问流是否与dnode中的某个访问流构成连续的访问关系,如果构成则向前或者向后预取一部分即可。
所有的流都是以链表的形式存入到dnode的zfetch管理器中的。
点击(此处)折叠或打开
-
typedef struct zfetch {
-
krwlock_t zf_rwlock; /* protects zfetch structure */
-
list_t zf_stream; /* AVL tree of zstream_t's */
-
struct dnode *zf_dnode; /* dnode that owns this zfetch */
-
uint32_t zf_stream_cnt; /* # of active streams */
-
uint64_t zf_alloc_fail; /* # of failed attempts to alloc strm */
- } zfetch_t;
主要函数为:
dmu_zfetch_find
dmu_zfetch_colinear
dmu_zfetch为入口函数
dmu_zfetch_dofetch这个函数为真正做预取的函数。