SSD Caching (dm-cache) Setting
SSD 캐싱 (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)
의존성 패키지 설치
[root@localhost ~]# yum install lvm2
lvm.conf 파일 편집
: vi /etc/lvm/lvm.conf
issue_discards=1
구성 저장 및 리부팅
[root@localhost ~]# dracut -f [root@localhost ~]# sync [root@localhost ~]# reboot
LVM PV 생성
[root@localhost ~]# pvcreate /dev/sda [root@localhost ~]# pvcreate /dev/nvme0n1 [root@localhost ~]# pvcreate /dev/nvme1n1
만약 PV 생성시에 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 으로 합니다.
LVM VG 생성
[root@localhost ~]# vgcreate vg_data1 /dev/sda /dev/nvme0n1 /dev/nvme1n1
LVM PVdisplay 확인
PV 정보를 확인하는 이유는 LV 생성시 필요한 Free PE 정보를 확인하기 위해서 입니다.
[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
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가 적용될 때 필요한 값을 제외한 나머지 정보를 맨 윗줄 처럼 -l 다음에 입력 합니다. 위의 값은 Free PE 에서 4096 값을 제외한 값입니다.
아래는 lvcreate 명령어에서 사용한 옵션에 대한 설명입니다.
-L : LV 사이즈를 지정하는 옵션으로 MB, GB, TB 등 단위로 붙여 지정 가능하다. -l : LV 사이즈를 지정하는 옵션으로 PE의 개수로 용량을 지정한다. -n : LV 이름일 지정한다. -i : LV를 stripe로 구성하며 stripe의 수를 지정한다. -I : LV stripe에서 저장되는 크기이다.
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
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 -
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
생성된 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배 정도 향상 되었습니다. 파일 크기나 갯수 등에 따라 성능 향상 정도가 달라지므로 내부적으로 테스트 진행을 해 보는 것이 좋습니다.