勘誤
1.devicemagic默認是1M
1、一篇關於分層存儲介紹的博文:
2、btier github地址:
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 邏輯說明
- btier數據遷移時週期性的,內核通過定時器週期性的來處理數據的遷移; 塊的數據的遷移可以通過sys接口手動遷移
- 目前btier是一旦執行sys接口手動遷移,內核的週期性遷移就會被關閉
- 週期性的數據的遷移處理會遍歷btier設備的所有的塊,一個塊一個塊的處理
- 數據往上層遷移,考慮塊的讀寫次數,一方面是需要比本層設備的平均讀寫次數和高一定的次數(本次平均讀寫次數和/底層設備數),一方面還需要比遷移的上層設備的平均讀寫次數和高出不低於上傳設備平均讀寫次數和減去一定的次數(上傳設備平均讀寫次數和/底層設備數)
- 數據往下層遷移,考慮遷移時間策略和塊的讀寫次數。如果塊沒有接受io的時間已經大於了設置的遷移時間或者是如果塊的讀寫次數比塊所屬設備的平均讀寫次數低於的次數超過了
- 所屬設備平均讀寫次數和除以總底層設備數並且滿足了遷移回下層設備的時間寬限期,這兩種情況下吧塊遷移到下層設備
- btier支持了discard,不同於hdd,對於SSD,最好開啓discard,保證真正將盤上的數據清除。(什麼是discard?)
6.2 一些圖示
7、io處理
7.1 邏輯說明
- btier 實現了自己的make_request函數tier_make_request,沒有用到請求隊列,該make_request處理很簡單,就只是把bio簡單的添加到當前btier設備的tier_bio_list上,然後是喚醒一個線程來處理這個bio鏈表
- tier_thead是btier處理bio的關鍵函數,這個函數整體流程就是遍歷tier_bio_list上的所有的bio,然後依次處理每一個bio,處理bio時是遍歷該bio的所有的bio_vec.然後會把bio_ver再生成一個bio,提交給底層設備。
- 處理bio鏈表時,一次最多提交處理256個bio,當處理超過256需要等上一批處理完成。
- 處理每一個bio_ver時,如果bio_vec中的數據終止偏移超過了當前塊,則把bio_vec按照一個塊一個塊的寫
7.2 一些圖示
8、其他
devicemagic、blocklist、bitlist都相當於btier設備的元數據信息。