Understanding thin provisioning volume and snapshot

Thin provisioning volume

Logical volume can be thinly provisioned. It allows storage administrator to overcommit the physical storage. In other words, it’s possible to create a logical volume which is larger than the available extents.

Create thin provisioning volume

In the following example, we create a 500GiB thin pool and 100GiB volume.

$ vgcreate vg1 /dev/nvme0n1
  Physical volume "/dev/nvme0n1" successfully created.
  Volume group "vg1" successfully created

$ vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   3   0 wz--n- 893.05g      0
  vg1      1   0   0 wz--n- 931.51g 931.51g

$ lvcreate -L 500G --thinpool thinpool1 vg1
  Thin pool volume with chunk size 256.00 KiB can address at most 63.25 TiB of data.
  Logical volume "thinpool1" created.

$ lvs
  LV        VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home      centos -wi-ao---- 839.05g
  root      centos -wi-ao----  50.00g
  swap      centos -wi-ao----   4.00g
  thinpool1 vg1    twi-a-tz-- 500.00g             0.00   10.41

$ lvs -ao name,size,stripesize,chunksize,metadata_percent
  LV                LSize   Stripe Chunk   Meta%
  home              839.05g     0       0
  root               50.00g     0       0
  swap                4.00g     0       0
  [lvol0_pmspare]   128.00m     0       0
  thinpool1         500.00g     0  256.00k 10.41
  [thinpool1_tdata] 500.00g     0       0
  [thinpool1_tmeta] 128.00m     0       
  
$ lvcreate -V 100G --thin -n thinvol1 vg1/thinpool1
  Logical volume "thinvol1" created.

$ lvs
  LV        VG     Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home      centos -wi-ao---- 839.05g
  root      centos -wi-ao----  50.00g
  swap      centos -wi-ao----   4.00g
  thinpool1 vg1    twi-aotz-- 500.00g                  0.00   10.42
  thinvol1  vg1    Vwi-a-tz-- 100.00g thinpool1        0.00

Thin pool volume chunk size

By default, lvm2 starts with 64KiB chunk size and increase its value when the resulting size of the thin pool metadata device grows above 128MiB.

In the previous example, the 500GiB thin pool results in 256KiB chunk size. In the following example, the 100MiB thin pool results in 64KiB chunk size.

$ lvcreate  -L 100M --thinpool thinpool2 vg1
  Thin pool volume with chunk size 64.00 KiB can address at most 15.81 TiB of data.
  Logical volume "thinpool2" created.

$ lvs -ao name,size,stripesize,chunksize,metadata_percent
  LV                LSize   Stripe Chunk   Meta%
  home              839.05g     0       0
  root               50.00g     0       0
  swap                4.00g     0       0
  [lvol0_pmspare]   128.00m     0       0
  thinpool1         500.00g     0  256.00k 10.42
  [thinpool1_tdata] 500.00g     0       0
  [thinpool1_tmeta] 128.00m     0       0
  thinpool2         100.00m     0   64.00k 10.84
  [thinpool2_tdata] 100.00m     0       0
  [thinpool2_tmeta]   4.00m     0       0
  thinvol1          100.00g     0       0  

The “-c” option can be used to specify the desired chunk size if needed.

$ lvcreate -c 128k -L 100M --thinpool thinpool3 vg1
  Thin pool volume with chunk size 128.00 KiB can address at most 31.62 TiB of data.
  Logical volume "thinpool3" created.

$ lvs -ao name,size,stripesize,chunksize,metadata_percent
  LV                LSize   Stripe Chunk   Meta%
  home              839.05g     0       0
  root               50.00g     0       0
  swap                4.00g     0       0
  [lvol0_pmspare]   128.00m     0       0
  thinpool1         500.00g     0  256.00k 10.42
  [thinpool1_tdata] 500.00g     0       0
  [thinpool1_tmeta] 128.00m     0       0
  thinpool2         100.00m     0   64.00k 10.84
  [thinpool2_tdata] 100.00m     0       0
  [thinpool2_tmeta]   4.00m     0       0
  thinpool3         100.00m     0  128.00k 10.84
  [thinpool3_tdata] 100.00m     0       0
  [thinpool3_tmeta]   4.00m     0       0
  thinvol1          100.00g     0       0

Use the following criteria for using the chunk size:

  • A smaller chunk size requires more metadata and hinders performance, but provides better space utilization with snapshots.
  • A bigger chunk size requires less metadata manipulation, but makes the snapshot less space efficient.

Normal snapshot volume

The LVM snapshot provides the ability to create a virtual image of device at a point in time without a service interruption.

When the original data block is overwritten after snapshot is taken, the original data needs to be copied to the snapshot volume. This will introduce copy-on-write overhead whenever the original block is overwritten. The state of original data can be reconstructed with the snapshot.

Thinly-provisioned snapshot volume

Unlike normal snapshot volume, the thin snapshot and volume are all about metadata. When the volume is snapshot, its metadata are copied for the thin snapshot volume use. As the metadata of the volume is changed, the snapshot volume still addresses the original data blocks. The new data will be written to new blocks. In other words, overwrites actually write the data to new blocks. Thus, the original data blocks can be still addressed by snapshot volume metadata after the data change.

Create the snapshot volume

$ lvcreate -s -L 100G -n thinvol1-snap /dev/vg1/thinvol1
  Logical volume "thinvol1-snap" created.

$ ls /dev/vg1
thinpool2  thinpool3   thinvol1  thinvol1-snap

$ lvs
  LV            VG     Attr       LSize   Pool      Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  home          centos -wi-ao---- 839.05g
  root          centos -wi-ao----  50.00g
  swap          centos -wi-ao----   4.00g
  thinpool1     vg1    twi-aotz-- 500.00g                    0.00   10.42
  thinpool2     vg1    twi-a-tz-- 100.00m                    0.00   10.84
  thinpool3     vg1    twi-a-tz-- 100.00g                    0.00   10.43
  thinvol1      vg1    owi-a-tz-- 100.00g thinpool1          0.00
  thinvol1-snap vg1    swi-a-s--- 100.00g           thinvol1 0.00

$ lvs -ao name,size,stripesize,chunksize,metadata_percent
  LV                LSize   Stripe Chunk   Meta%
  home              839.05g     0       0
  root               50.00g     0       0
  swap                4.00g     0       0
  [lvol0_pmspare]   128.00m     0       0
  thinpool1         500.00g     0  256.00k 10.42
  [thinpool1_tdata] 500.00g     0       0
  [thinpool1_tmeta] 128.00m     0       0
  thinpool2         100.00m     0   64.00k 10.84
  [thinpool2_tdata] 100.00m     0       0
  [thinpool2_tmeta]   4.00m     0       0
  thinpool3         100.00m     0  128.00k 10.84
  [thinpool3_tdata] 100.00m     0       0
  [thinpool3_tmeta]   4.00m     0       0
  thinvol1          100.00g     0       0
  thinvol1-snap     100.00g     0    4.00k

The chunk size of snapshot volume can be specified with “-c” option.

$ lvcreate -s -c 128k -L 100G -n thinvol1-snap2 /dev/vg1/thinvol1
  Logical volume "thinvol1-snap2" created.

$ lvs -ao name,size,stripesize,chunksize,metadata_percent
  LV                LSize   Stripe Chunk   Meta%
  home              839.05g     0       0
  root               50.00g     0       0
  swap                4.00g     0       0
  [lvol0_pmspare]   128.00m     0       0
  thinpool1         500.00g     0  256.00k 10.42
  [thinpool1_tdata] 500.00g     0       0
  [thinpool1_tmeta] 128.00m     0       0
  thinpool2         100.00m     0   64.00k 10.84
  [thinpool2_tdata] 100.00m     0       0
  [thinpool2_tmeta]   4.00m     0       0
  thinpool3         100.00m     0  128.00k 10.84
  [thinpool3_tdata] 100.00m     0       0
  [thinpool3_tmeta]   4.00m     0       0
  thinvol1          100.00g     0       0
  thinvol1-snap     100.00g     0    4.00k
  thinvol1-snap2    100.00g     0  128.00k

Remove the snaphost volume

$ lvremove /dev/vg1/thinvol1-snap
Do you really want to remove active logical volume vg1/thinvol1-snap? [y/n]: y
  Logical volume "thinvol1-snap" successfully removed
$ lvremove /dev/vg1/thinvol1-snap2
Do you really want to remove active logical volume vg1/thinvol1-snap2? [y/n]: y
  Logical volume "thinvol1-snap2" successfully removed

$ lvs
  LV        VG     Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home      centos -wi-ao---- 839.05g
  root      centos -wi-ao----  50.00g
  swap      centos -wi-ao----   4.00g
  thinpool1 vg1    twi-aotz-- 500.00g                  0.00   10.42
  thinpool2 vg1    twi-a-tz-- 100.00m                  0.00   10.84
  thinpool3 vg1    twi-a-tz-- 100.00g                  0.00   10.43
  thinvol1  vg1    Vwi-a-tz-- 100.00g thinpool1        0.00

Remove the volume and pool

$ lvremove /dev/vg1/thinvol1 -f
  Logical volume "thinvol1" successfully removed

$ lvremove /dev/vg1/thinpool1
Do you really want to remove active logical volume vg1/thinpool1? [y/n]: y
  Logical volume "thinpool1" successfully removed  

Reference