SSD Caching ( dm-cache )

약 73T 정도의 스토리지의 Read I/O에 부하가 많이 가서 성능을 높이기 위해 dm-cache로 SSD cache를 적용하였다.
OS : CentOS 7
SSD : 1T m2 nvme x2 ( /dev/nvme0n1, /dev/nvme1n1 가정 )
HDD : 73T Raid 6 ( /dev/sda 가정 )

1. 기본설정

[root@localhost ~]# yum install lvm2
[root@localhost ~]# vi /etc/lvm/lvm.conf
issue_discards=1

[root@localhost ~]# dracut -f
[root@localhost ~]# sync
[root@localhost ~]# reboot

2. LVM PV 생성

[root@localhost ~]# pvcreate /dev/sda
[root@localhost ~]# pvcreate /dev/nvme0n1
[root@localhost ~]# pvcreate /dev/nvme1n1

Device /dev/sda(nvme0n1 or nvme1n1) excluded by a filter 이 발생할 경우 dd if=/dev/zero of=/dev/sda bs=512 count=1 로 초기화 해 주면 된다.

4K sector 로 구성할 경우 bs=4096으로 한다

3. LVM VG 생성

[root@localhost ~]# vgcreate vg_data1 /dev/sda /dev/nvme0n1 /dev/nvme1n1

4. LVM PVdisplay Check

[root@localhost ~]# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda
  VG Name               vg_data1
  PV Size               <72.77 TiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              19075919
  Free PE               19075919
  Allocated PE          0
  PV UUID               
   
  --- Physical volume ---
  PV Name               /dev/nvme0n1
  VG Name               vg_data1
  PV Size               <953.87 GiB / not usable <2.34 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              244190
  Free PE               244190
  Allocated PE          0
  PV UUID               
   
  --- Physical volume ---
  PV Name               /dev/nvme1n1
  VG Name               vg_data1
  PV Size               <953.87 GiB / not usable <2.34 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              244190
  Free PE               244190
  Allocated PE          0
  PV UUID

위의 정보를 확인하는 이유는 LV 생성시 필요한 값을 확인하기 위함이다.
여기서 필요한 값은 9번째 Free PE 정보 이다.

5. LVM LV 생성

[root@localhost ~]# lvcreate -l 19071823 -n lv_data1 vg_data1 /dev/sda
[root@localhost ~]# lvcreate -i2 -L 16G -n lv_cache_meta1 vg_data1 /dev/nvme0n1 /dev/nvme1n1
[root@localhost ~]# lvcreate -i2 -I2048 -l 100%FREE -n lv_cache1 vg_data1 /dev/nvme0n1 /dev/nvme1n1

위에서 구한 PE 정보에서 cache가 적용될때 필요한 값을 제외한 나머지 정보를 1번째 처럼 -l 다음에 입력한다.
위의 값은 Free PE 에서 4096 값을 제외한 값이다.

lvcreate 명령어에 사용한 옵션은 다음과 같다

-L : LV 사이즈를 지정하는 옵션으로 MB, GB, TB 등 단위로 붙여 지정 가능하다.
-l : LV 사이즈를 지정하는 옵션으로 PE의 개수로 용량을 지정한다.
-n : LV 이름일 지정한다.
-i : LV를 stripe로 구성하며 stripe의 수를 지정한다.
-I : LV stripe에서 저장되는 크기이다.

6. LVM Cache 설정

[root@localhost ~]# lvconvert --type cache-pool /dev/vg_data1/lv_cache1 --poolmetadata /dev/vg_data1/lv_cache_meta1 --chunksize 2048
[root@localhost ~]# lvconvert --type cache /dev/vg_data1/lv_data1 --cachepool /dev/vg_data1/lv_cache1

7. LV cache 여부 확인

[root@localhost ~]# dmsetup status
vg_data1-lv_cache1_cdata: 0 3967254528 striped 2 259:1 259:0 1 AA
vg_data1-lv_cache1_cmeta: 0 33554432 striped 2 259:1 259:0 1 AA
vg_data1-lv_data1_corig: 0 156236374016 linear 
vg_data1-lv_data1: 0 156236374016 cache 8 3170/4161600 4096 968567/968568 748559967 437094376 162609995 381970069 99305550 100272168 0 2 metadata2 writethrough 2 migration_threshold 2048 smq 0 rw -

8. fdisk 로 생성된 LV 확인

[root@localhost ~]# fdisk -l
Disk /dev/mapper/vg_data1-lv_data1: 79993.0 GB, 79993023496192 bytes, 156236374016 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 2097152 bytes / 4194304 bytes

9. 생성된 LV xfs 로 포맷

[root@localhost ~]# mkfs.xfs -f /dev/mapper/vg_data1-lv_data1
[root@localhost ~]# blkid
/dev/mapper/vg_data1-lv_data1: UUID="TTTT" TYPE="xfs" 
[root@localhost ~]# mount -t xfs UUID="TTTT" /data1

SSD cache Hits와 Misses 확인

[root@localhost ~]# lvs -o name,cache_read_hits,cache_read_misses vg_data1/lv_data1
  LV       CacheReadHits    CacheReadMisses 
  lv_data1        750733685        437267271

SSD cache 상태 확인

[root@localhost ~]# lvs vg_data1/lv_data1
  LV       VG       Attr       LSize  Pool        Origin           Data%  Meta%  Move Log Cpy%Sync Convert
  lv_data1 vg_data1 Cwi-aoC--- 72.75t [lv_cache1] [lv_data1_corig] 99.99  0.08            0.00

내부적으로 사용시 Read I/O가 약 3배 정도 향상되었다.
파일 크기, 갯수 등에 따라 성능 향상은 달라지는 내부적으로 테스트 진행을 해 보는 것이 좋다.

You may also like...