lvmcache是lvm2的一個重要特性,目的是用快盤(SSD)作緩存給慢盤(HHD)加速,類似的技術如bcache. lvmcache分兩部分,一部分是用戶態管理程序,也就是lvm2的代碼; 另外一部分是內核態代碼,也就是dmcache。緩存
dmcache是device mapper層一個plugin。 在瞭解dmcache以前,最好了解DM層的概況,可參考[1]。 下面,我參雜示例蜻蜓點水一下:app
參考"man lvmcache"你基本上就能掌握lvmcache的基本概念和操做了。下面是我建立cache LV的過程:函數
a19:~ # vgcreate vgtest /dev/sda2 /dev/sdb3 Volume group "vgtest" successfully created a19:~ # lvcreate -l100%PVS -n cachedLV vgtest /dev/sdb3 Logical volume "cachedLV" created. a19:~ # lvcreate -L50G -n cache0 vgtest /dev/sda2 Logical volume "cache0" created. a19:~ # lvcreate -L50M -n cache0meta vgtest /dev/sda2 Rounding up size to full physical extent 52.00 MiB Logical volume "cache0meta" created. a19:~ # lvconvert --type cache-pool --poolmetadata vgtest/cache0meta vgtest/cache0 WARNING: Converting logical volume vgtest/cache0 and vgtest/cache0meta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Do you really want to convert vgtest/cache0 and vgtest/cache0meta? [y/n]: y Converted vgtest/cache0 to cache pool. a19:~ # lvconvert --type cache --cachepool vgtest/cache0 vgtest/cachedLV Logical volume vgtest/cachedLV is now cached.
至此,一個利用ssd加速的邏輯卷就建立出來了。LVM命令很是靈活,一些步驟能夠並做一個命令來作,做爲示例,我這裏每一個步驟都分開作了。每一步老是利用上一步建立的LV,來拼湊出一個新的LV,而後給原來的LV加上一個後綴來從新命名並設置成隱藏LV,最後只有一個可見LV就是cachedLV:spa
a19:~ # lvs -a vgtest LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert [cache0] vgtest Cwi---C--- 50.00g 0.00 12.23 100.00 [cache0_cdata] vgtest Cwi-ao---- 50.00g [cache0_cmeta] vgtest ewi-ao---- 52.00m cachedLV vgtest Cwi-a-C--- 100.00g [cache0] [cachedLV_corig] 0.00 12.23 100.00 [cachedLV_corig] vgtest owi-aoC--- 100.00g [lvol0_pmspare] vgtest ewi------- 52.00m
# dmsetup table vgtest-cachedLV_corig: 0 209707008 linear 8:19 2048 vgtest-cache0_cdata: 0 104857600 linear 8:2 2048 vgtest-cache0_cmeta: 0 106496 linear 8:2 104859648 vgtest-cachedLV: 0 209707008 cache 254:3 254:2 254:6 128 1 writethrough mq 0
只有cachedLV是「cache」類型,其餘隱藏都是「linear」類型的。理解DM工做原理有兩點要搞清楚:1. DM設備的構造過程;2. IO在DM設備上的處理流程。code
LVM經過libdevmapper庫操做/dev/mapper/control設備,發送IOCTL指令,把dm table發送給DM驅動。以隊列
vgtest-cachedLV: 0 209707008 cache 254:3 254:2 254:6 128 1 writethrough mq 0
爲例。DM驅動經過解析table,發現要構造的設備是「cache」類型,而後加載dm_cache
內核模塊,構造DM cache設備。每一個塊設備都有一個請求隊列requst_queue,隊列須要掛鉤一個相應的make_request函數處理請求,對DM來講就是dm_make_request。dm table字符串裏, cache以前的參數由dm通用層處理,cache以後的參數則由cache_ctr來處理,這裏三個設備依次是metadata LV,cache LV和original LV, 「128」是block size,單位是sector,一個sector是512B,128就是64KB, 「1」是指feature參數的個數,"writethrough"是默認的cache工做模式。更加詳細的說明,請參考內核文檔Documentation/device-mapper/cache.txt。文檔
從submit_bio()到調用dm_make_request()的過程是通用塊層負責的。DM設備最核心的IO處理函數是map函數,cache設備的映射函數是cache_map. 調用關係以下:字符串
dm_make_request -> __split_and_process_non_flush -> __clone_and_map_data_bio -> _map_bio ->ti->type->map()
[1] 《存儲技術原理分析》 敖青雲it