lvmcache初步分析 - 1

lvmcache是lvm2的一個重要特性,目的是用快盤(SSD)作緩存給慢盤(HHD)加速,類似的技術如bcache. lvmcache分兩部分,一部分是用戶態管理程序,也就是lvm2的代碼; 另外一部分是內核態代碼,也就是dmcache。緩存

dmcache

dmcache是device mapper層一個plugin。 在瞭解dmcache以前,最好了解DM層的概況,可參考[1]。 下面,我參雜示例蜻蜓點水一下:app

  • 使用lvm命令建立一個cache LV

參考"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
  • DM table LVM最終目的就是把dm table傳給內核的device mapper層。咱們看一下:
# 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

  • DM設備的構造過程

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。文檔

  • IO處理流程

從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

相關文章
相關標籤/搜索