콘텐츠로 건너뛰기

LVM Cache를 이용하여 SSD를 HDD(하드) 캐시로 사용하기

  • 기준

필자가 집에서 사용하는 서버는 백업용 디스크를 제외하면 모두 SSD로 구성되어 있다.
서버를 잘 사용하던 중 HDD에 그룹웨어를 설치하면 얼마나 느릴지 갑자기 궁금해서 500GB 하드를 7,900원에 구입했다.

7200RPM 하드여서 소리가 시끄럽긴 했지만 그룹웨어 속도는 생각보다 느리진 않았다. (SSD보다는 많이 느리다.)

장기간 더 테스트해 보고 싶어 씨게이트 스카이호크 2TB CCTV용(5400RPM) 하드 새 제품을 86,000원에 구입했다.

5400RPM 하드도 속도는 나쁘지 않았지만 하드의 특성상 랜덤 IO 성능이 좋지 못해 그룹웨어 속도가 묘하게 느렸다. 7200RPM 하드도 동일했다.

느린 속도를 개선하고자 LVM Cache에 대해 알아보기 시작했고 SSD를 캐시로 사용했을 때 하드의 느린 부분이 상당해 개선되었다.

고용량 SSD가 비싸서 하드를 고민하고 있거나, 이미 하드를 사용하고 있지만 느린 속도로 인해 답답해 하는 분들을 위해 LVM Cache 구성 방법 포스트를 작성한다.

LVM Cache 구성 방법

(Debian 12.4 / 24년 1월 1일 기준)

리눅스를 설치할 때 LVM으로 설치했으면 LVM Cache를 구성하는 것이 간편하다.
만약 리눅스를 LVM으로 설치했고, 여분의 SSD가 있다면 목차 3으로 넘어가면 된다.


필자는 리눅스를 LVM으로 설치하지 않았다. 만약 필자처럼 리눅스를 LVM으로 설치하지 않았으면 처음부터 참고하면 된다.
기존 디스크를 LVM으로 전환하는 방법도 있지만 데이터 손상, 시스템 손상 등의 위험이 있기에 리눅스를 다시 설치하는 것을 권장한다.

1) Debian VM 구성

VM BIOS를 레거시가 아닌 EFI로 설정한다.
주 디스크로 사용될 가상 디스크는 하드에 생성하고, 캐시로 사용될 가상 디스크는 SSD에 생성한다.
엔터프라이즈 환경이나 대용량 파일이 주로 사용되는 서버라면 SSD 캐시 용량을 크게 잡는 것을 권장한다.
(이 글에서는 Hyper-V를 기준으로 했지만 ESXi, XenServer, Proxmox 등을 사용해도 된다.)

2) Debian 12 설치 – 파티션

운영체제를 설치할 디스크(HDD)에 EFI, /boot 파티션을 생성하고 나머지는 LVM(PV)으로 생성한다.
‘LVM (논리 볼륨 관리자) 설정’에서 볼륨그룹(VG)를 만들고, 스왑과 시스템 루트 파티션에 사용될 논리볼륨(LV)을 만든 다음 마치기를 눌러 빠져나온다.

생성된 논리볼륨은 스왑, 시스템 루트 파티션을 지정하고, 캐시에 사용될 SSD는 아무것도 만지지 말고 데비안 설치를 진행한다.

3) LVM Cache 구성 준비

lsblk - 디스크 확인
pvcreate /dev/sdX
(e.g. pvcreate /dev/sdb) - PV 생성

데비안 설치가 끝났고 부팅이 되었으면 lsblk 명령어로 캐시로 사용할 디스크를 확인하고 PV를 생성한다.

vgextend VG이름 /dev/sdX
(e.g. vgextend debian /dev/sdb)
pvs

캐시에 사용할 디스크를 기존 VG에 추가하고, pvs 명령어로 VG에 포함되었는지 확인한다.

4) 캐시 메타데이터 LV, 캐시데이터 LV 생성

lvcreate -n meta -L xMB VG이름 /dev/sdX
(e.g. lvcreate -n meta -L 66M debian /dev/sdb)

캐시 메타데이터 LV 용량은 SSD 용량의 대략 1000:1 비율로 잡으면 된다.

lvcreate -n cache -L xG VG이름 /dev/sdX
(e.g. lvcreate -n cache -L 63G debian /dev/sdb)

캐시 데이터 LV를 생성할 때 SSD의 용량을 조금 남겨두어야 한다. 전체를 사용하면 캐시 데이터 LV 생성이 되지 않는다.

5) 캐시 풀 LV 생성

writethrough 캐시 모드 사용
lvconvert --type cache-pool --cachemode writethrough --poolmetadata VG이름/meta VG이름/cache
(e.g. lvconvert --type cache-pool --cachemode writethrough --poolmetadata debian/meta debian/cache)

writeback 캐시 모드 사용
lvconvert --type cache-pool --cachemode writeback --poolmetadata VG이름/meta VG이름/cache
(e.g. lvconvert --type cache-pool --cachemode writeback --poolmetadata debian/meta debian/cache)

writeback (읽기/쓰기 성능 향상): 쓰기 작업이 캐시(SSD)에 저장되고 나중에 백엔드 스토리지(HDD)로 전송된다. 이는 성능을 향상시키지만 SSD에 문제가 발생하면 데이터 손실 위험이 있다.

writethrough (읽기 성능/안정성 향상): 쓰기 작업이 캐시(SSD)와 백엔드 스토리지(HDD)에 동시에 저장된다. SSD와 HDD에 동시에 기록되는 특성상 쓰기 성능 향상은 거의 없지만, SSD에 문제가 발생해도 HDD에 데이터가 안전하게 보관되어 있어 데이터의 안전성이 좋다.

필자는 데이터의 안정성이 중요하기에 writethrough를 택했다.

일시적으로 쓰기 성능을 올리고 싶으면 writeback로 잠깐 변경하고 다시 writethrough로 되돌리는 것도 안전한 방법이다. (캐시 모드 변경은 목차 9에서 다룸)

데이터가 중요한 서버에서 지속적으로 writeback을 사용해야 한다면 최소 RAID 1으로 묶은 SSD를 캐시로 사용할 것을 권장한다.

6) HDD LV와 캐시 풀 LV 결합

lvconvert --type cache --cachepool VG이름/cache VG이름/HDD_LV이름
(e.g. lvconvert --type cache --cachepool debian/cache debian/systemroot)

HDD LV와 캐시 풀 LV를 결합한다.
필자는 시스템 전체 성능 향상을 위해 시스템 루트 LV와 결합했다.

7) 캐시가 정상적으로 작동하는지 확인

lvs -o+cache_mode VG이름/HDD_LV이름
(e.g. lvs -o+cache_mode debian/systemroot)

LVM Cache가 정상적으로 작동하면 위 사진과 같이 출력된다.

8) initramfs 재생성 (매우 중요)

시스템 루트 파티션을 캐시한 다음 initramfs 재생성하지 않고 시스템을 재부팅하면 부팅이 되지 않는 최악을 경험하게 된다. 그렇기에 꼭 initramfs 재생성을 진행해야 한다.

apt install dracut

initramfs 재생성을 진행하기 전 dracut를 설치한다.

File descriptor 3 (pipe:[23765]) leaked on vgs invocation. Parent PID 2036: /usr/sbin/grub-probe

dracut를 설치하면서 위와 같은 에러가 출력될 수도 있지만 무시하면 된다.
(궁금하면 우분투 포럼의 File descriptor 3 (pipe:[36899]) leaked on vgs invocation. Parent PID 12657: /usr/sbin/grub-probe 글 참고)

전체 커널 initramfs 재생성
dracut -v -f --regenerate-all

실행 중인 커널에 대해서만 initramfs 재생성
dracut -v -f

시스템 안전을 위해 전체 커널 initramfs 재생성을 권장한다.

9) LVM Cache 모드 변경

writethrough로 변경
lvchange --cachemode writethrough VG이름/HDD_LV이름
(e.g. lvchange --cachemode writethrough debian/systemroot)

writeback로 변경
lvchange --cachemode writeback VG이름/HDD_LV이름
(e.g. lvchange --cachemode writeback debian/systemroot)

LVM Cache 모드를 writethrough 또는 writeback으로 변경하고 싶으면 위 명령어로 간단하게 바꿀 수 있다.
캐시 모드를 변경하고 나서는 initramfs 재생성을 하지 않아도 된다.

10) 디스크 벤치마크

순차 쓰기
dd if=/dev/zero bs=1M count=2048 of=test_file oflag=direct

순차 읽기
dd if=test_file of=/dev/null bs=1024
랜덤 읽기 (4K)
fio --name=randomread --ioengine=libaio --iodepth=4 --rw=randread --bs=4k --direct=1 --size=1G --numjobs=1 --runtime=30 --group_reporting

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=random_read.fio --bs=4k --iodepth=64 --size=1G --readwrite=randread --runtime=30
랜덤 쓰기 (4K)
fio --name=randomwrite --ioengine=libaio --iodepth=4 --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=1 --runtime=30 --group_reporting

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=random_write.fio --bs=4k --iodepth=64 --size=1G --readwrite=randwrite --runtime=30

성능이 궁금하면 위 명령어로 디스크 벤치마크를 진행하면 된다.

11) 커널 업데이트가 될 경우

apt upgrade로 커널이 업데이트되거나 특정 패키지로 인해 커널이 변경되어도 dracut가 커널을 생성해서 initramfs 재생성을 하지 않아도 된다.

12) LVM Cache 삭제 (24.06.23 추가)

첫 번째 방법 (캐싱 해제)

lvs -a
(위 명령어로 LV, VG 이름 확인)

lvconvert --uncache VG이름/LV이름
(e.g. lvconvert --uncache debian/systemroot)

전체 커널 initramfs 재생성
dracut -v -f --regenerate-all

두 번째 방법 (캐시 풀, 메타데이터, 캐시데이터 LV 완전 삭제)

lvs -a
(위 명령어로 캐시, 메타 볼륨 LV 이름 확인)

lvremove VG이름/캐시풀_이름
(e.g. lvremove debian/cache_cpool)

전체 커널 initramfs 재생성
dracut -v -f --regenerate-all

V캐시에 사용한 SSD를 VG에서 제거하고 싶은 경우
vgreduce VG이름 /dev/디스크_이름
(e.g. vgreduce debian /dev/sdb)

SSD PV를 삭제하고 싶은 경우
pvremove /dev/디스크_이름
(e.g. pvremove /dev/sdb)

Join the conversation

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다