1. 程式人生 > >MD中的bitmap(2)

MD中的bitmap(2)

bitmap原理很明瞭,按照這個原理直接進行實施也是可以的,但直接這樣實施的話,由於一次資料塊的寫入多了兩次磁碟訪問(bitmap的設定和清除),寫入效率會受到較大影響,所以還需要考慮一些優化。

優化主要是兩方面的:bitmap的設定後批量寫入;bitmap的延時清除。這兩方面的優化原理上和磁碟快取差不多,需要在記憶體中構建和磁碟bitmap檔案對應的資料結構,bitmap操作首先在快取中進行,必要時才進行真正的磁碟操作。

下面來看看bitmap在磁碟上以及在記憶體中的結構。

Bitmap檔案的磁碟組織

Bitmap磁碟檔案可以存放在MD裝置之外,此時MD結構中的bitmap_file表示這個

bitmap檔案;bitmap磁碟檔案也可以存放在MD裝置自身,這個bitmap相對於MD的超級塊的位置由bitmap_offset指定(注意這個值也可以為負,表示Bitmap檔案存放在超級塊之前)。

磁碟檔案由超級塊和點陣圖組成,超級塊大小為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中,對應filemapbitmap記憶體結構有filemap_attr陣列,每4bit對應filemap的一頁。

Bp陣列的每一個元素對應一個bitmap記憶體頁,元素中的map指標指向存放記憶體bitmap的記憶體頁,記憶體bitmap頁儲存bitmap記憶體結構。

記憶體中一個bitmap結構佔用16bit,一個bitmap對應磁陣的一個條帶。最高一位為是否需要同步標誌,標誌磁陣對應的條帶是否需要同步;後面一位標誌指標對應條帶是否正在進行同步操作。低14位是一個計數器,表示對應磁陣條帶段內正在進行的寫操作個數。

 * +--------+--------+------------------------------------------------+
 * | resync | resync |               counter                          |
 * | needed | active |                                                |
 * |  (0-1) |  (0-1) |              (0-16383)                         |
 * +--------+--------+------------------------------------------------+