ZFS 中的流预取算法研究

1460阅读 0评论2018-09-18 cengku
分类:架构设计与优化

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这个函数为真正做预取的函数。
上一篇:ZFS代码简介(2)
下一篇:Oprofile/operf使用小结