MD中的bitmap(2)
bitmap原理很明瞭,按照這個原理直接進行實施也是可以的,但直接這樣實施的話,由於一次資料塊的寫入多了兩次磁碟訪問(bitmap的設定和清除),寫入效率會受到較大影響,所以還需要考慮一些優化。
優化主要是兩方面的:bitmap的設定後批量寫入;bitmap的延時清除。這兩方面的優化原理上和磁碟快取差不多,需要在記憶體中構建和磁碟bitmap檔案對應的資料結構,bitmap操作首先在快取中進行,必要時才進行真正的磁碟操作。
下面來看看bitmap在磁碟上以及在記憶體中的結構。
Bitmap檔案的磁碟組織
Bitmap磁碟檔案可以存放在MD裝置之外,此時MD結構中的bitmap_file表示這個
磁碟檔案由超級塊和點陣圖組成,超級塊大小為256位元組,隨後緊跟點陣圖。點陣圖中,一個位對應磁陣中一段條帶段,這個大小由超級塊的chunksize欄位確定,位被設定則表示該對應chunk需要同步,位被清零表示對應chunk狀態一致,無需同步。
超級塊
typedef struct bitmap_super_s {
__le32 magic;/*0BITMAP_MAGIC */
__le32 version;/*4the bitmap major for now, could change... */
__u8uuid[16];/*8128 bit uuid - must match md device uuid */
__le64 events;/* 24event counter for the bitmap (1)*/
__le64 events_cleared;/*32event counter when last bit cleared (2) */
__le64 sync_size;/* 40the size of the md device's sync range(3) */
__le32 state;/* 48bitmap state information */
__le32 chunksize;/* 52the bitmap chunk size in bytes */
__le32 daemon_sleep; /* 56seconds between disk flushes */
__le32 write_behind; /* 60number of outstanding write-behind writes */
__u8pad[256 - 64]; /* set to zero */
} bitmap_super_t;
值得關注的,event記錄對應MD裝置的最近一個事件,這個事件也記錄在MD的超級塊中,在從磁碟載入時,可以通過和MD結構中的event比對來確認bitmap檔案是否已經過期。如果過期,則將bitmap內的位全部設定為1。
Bitmap的記憶體結構
Bitmap記憶體中結構比磁碟檔案要複雜得多,首先來看主要部分:
裝置工作時,bitmap檔案超級塊也讀入記憶體,儲存在記憶體結構的sb_page中。
裝置工作時,整個bitmap磁碟檔案被對映到記憶體,儲存在記憶體結構的filemap中,對應filemap,bitmap記憶體結構有filemap_attr陣列,每4個bit對應filemap的一頁。
Bp陣列的每一個元素對應一個bitmap記憶體頁,元素中的map指標指向存放記憶體bitmap的記憶體頁,記憶體bitmap頁儲存bitmap記憶體結構。
記憶體中一個bitmap結構佔用16bit,一個bitmap對應磁陣的一個條帶。最高一位為是否需要同步標誌,標誌磁陣對應的條帶是否需要同步;後面一位標誌指標對應條帶是否正在進行同步操作。低14位是一個計數器,表示對應磁陣條帶段內正在進行的寫操作個數。
* +--------+--------+------------------------------------------------+
* | resync | resync | counter |
* | needed | active | |
* | (0-1) | (0-1) | (0-16383) |
* +--------+--------+------------------------------------------------+