ZFS在ARC之上建立了预取算法,具体实现在dmu_zfetch.c中。
与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;
上图所示,zfetch是对应于每个dnode的,相当于每个文件一个zfetch,里面包含了数据的访问流。如果连续,他会将相邻的流合并形成更大的流。
主要函数为:
dmu_zfetch_find
dmu_zfetch_colinear
dmu_zfetch为入口函数
dmu_zfetch_dofetch这个函数为真正做预取的函数。
阅读(4068) | 评论(3) | 转发(2) |