分层存储开源实现btier源码阅读

勘误

1.devicemagic默认是1M

1、一篇关于分层存储介绍的博文:

Linux 下的两种分层存储方案

2、btier github地址:

https://github.com/mruijter

btier有两个大的版本1.x和2.x,本文为基于1.x的源码阅读时记录。

3、cli处理创建、删除设备流程:

在这里插入图片描述

4、blocklist

blocklist是保存了所有块的信息,仅存于tier0上。

4.1数据结构
struct blockinfo {
    unsigned int device;   /*哪一层*/
    u64 offset;         /*在底层设备的偏移*/
    time_t lastused;         /*最后使用时间*/
    unsigned int readcount;   /*读的次数*/
    unsigned int writecount;  /*写的次数*/
} ;
4.2图示

在这里插入图片描述

5、bitlist

bitlist是每个tier层设备一个,存到设备最后,用来标记该设备的块是否被分配使用。
在这里插入图片描述

6、数据迁移

6.1 逻辑说明
  1. btier数据迁移时周期性的,内核通过定时器周期性的来处理数据的迁移; 块的数据的迁移可以通过sys接口手动迁移
  2. 目前btier是一旦执行sys接口手动迁移,内核的周期性迁移就会被关闭
  3. 周期性的数据的迁移处理会遍历btier设备的所有的块,一个块一个块的处理
  4. 数据往上层迁移,考虑块的读写次数,一方面是需要比本层设备的平均读写次数和高一定的次数(本次平均读写次数和/底层设备数),一方面还需要比迁移的上层设备的平均读写次数和高出不低于上传设备平均读写次数和减去一定的次数(上传设备平均读写次数和/底层设备数)
  5. 数据往下层迁移,考虑迁移时间策略和块的读写次数。如果块没有接受io的时间已经大于了设置的迁移时间或者是如果块的读写次数比块所属设备的平均读写次数低于的次数超过了
  6. 所属设备平均读写次数和除以总底层设备数并且满足了迁移回下层设备的时间宽限期,这两种情况下吧块迁移到下层设备
  7. btier支持了discard,不同于hdd,对于SSD,最好开启discard,保证真正将盘上的数据清除。(什么是discard?
6.2 一些图示

在这里插入图片描述

7、io处理

7.1 逻辑说明
  1. btier 实现了自己的make_request函数tier_make_request,没有用到请求队列,该make_request处理很简单,就只是把bio简单的添加到当前btier设备的tier_bio_list上,然后是唤醒一个线程来处理这个bio链表
  2. tier_thead是btier处理bio的关键函数,这个函数整体流程就是遍历tier_bio_list上的所有的bio,然后依次处理每一个bio,处理bio时是遍历该bio的所有的bio_vec.然后会把bio_ver再生成一个bio,提交给底层设备。
  3. 处理bio链表时,一次最多提交处理256个bio,当处理超过256需要等上一批处理完成。
  4. 处理每一个bio_ver时,如果bio_vec中的数据终止偏移超过了当前块,则把bio_vec按照一个块一个块的写
7.2 一些图示

在这里插入图片描述

8、其他

devicemagic、blocklist、bitlist都相当于btier设备的元数据信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章