F2FS 的 read extent cache 和 age extent cache

发布时间 2023-07-25 18:45:28作者: liuchao719

extent cache

  1. extent cache 是一种组件,用来描述 extent 的某种属性。

extent

  1. extent 指的是文件里的一段内容,由文件 inode,起始地址 fofs,内容长度 len 确定。
  2. extent 的实现机制是红黑树,一个 inode 一颗,叫做 extent tree。key 是 fofs,value 是 extent info。info 中保存的内容根据 extent cache 类型而定。
  3. 目前有两种 extent cache 类型,read cache 和 age cache。

extent tree

  1. extent tree 的组织机制是基数树,index 为 ino。基数树按照 6 bit一组,把 ino 分段,每段作为索引,用于在父节点中寻找子节点。当搜索完所有的段,就会在树的末尾找到存储的值,即 extent tree。
  2. 每类 extent cache 在 super block info 里都具有对应的基数树,用于管理所有 inode 对应类型的 extent cache。

read cache

  1. read cache 用来寻找文件某段内容在磁盘上的地址。地址为 0 (NULL_ADDR)代表无效。
  2. read cache 可以加速读流程,减少磁盘 IO,避免从 inode 一层层读取 node block。
  3. 如果一段内容对应了一段连续的物理,可以用一个 extent 表示。因为是连续的物理地址,所以只记录起始地址即可,后续都可以算出来。

age cache

  1. age cache 用来记录某段内容的更新频率。age 越小,更新频率越快。age 信息代表的时两次更新之间,系统分配出去的块数。如果之前已经更新过,则此次更新会考虑到之前的 age 信息,加权计算。age 为 0 代表无效。
  2. age cache 用于指导应该在哪个温度的段里分配磁盘空间,区分经常更新的数据和不频繁更新的数据。有助于节省 F2FS 内部段(segment)的使用。
  3. 对一段内容而言,如果更新后的 age 与其记录的总系统分配块数和更新前的都相差不大,就可以省略这次更新(待检查必要性,待做)。同样的道理,如果几段连续的内容的 age cache 相差不大,也可以合并到一个 extent 中。