본문으로 건너뛰기

스냅샷 용량 최적화

스냅샷은 파일 시스템, 구성, 메타데이터 및 할당된 모든 디스크 블록을 포함하여 사용량을 캡쳐합니다.
즉, 스냅샷은 파일단이 아닌 디스크단에서 작동하기에 파일시스템에서 사용 중으로 표현하는 데이터양과 항상 일치하지 않습니다.
디스크에 데이터를 쓰고 삭제해 사용하지 않는 공간이더라도 디스크단에서는 여전히 할당된 블록으로 존재할 수 있으며 이로 인해 스냅샷 크기에 영향을 줄 수 있습니다.
스냅샷 크기를 최소화하고 디스크 사용량을 현재 사용 중인 데이터와 가깝게 유지하려면 디스크 최적화 작업이 필요합니다.

스냅샷 생성 전 최적화가 필요한 이유

VM 내부에서 파일을 삭제하면 파일시스템에서는 해당 공간을 다시 사용할 수 있는 공간으로 표시합니다.
하지만 하위 스토리지 또는 디스크 블록 수준에서는 삭제된 데이터가 바로 제거되지 않고 할당된 블록으로 남아 있을 수 있습니다.

이 상태에서 스냅샷을 생성하면 실제로는 삭제된 데이터의 흔적까지 스냅샷 대상에 포함될 수 있으며, 결과적으로 스냅샷 용량이 커질 수 있습니다.

따라서 스냅샷 생성 전에는 다음 작업을 수행하는 것이 좋습니다.

1) 파일 삭제

스냅샷 생성 전 불필요한 파일들을 제거합니다.

2) 미사용 블록 할당 해제

fstrim은 실제 사용하지 않는 공간을 물리적 장지인 블록 스토리지 디스크에 전달해 사용하지 않음으로 할당 해제합니다.
즉, 마운트 된 파일 시스템에서 사용하지 않는 블록을 정리하여 시스템상 회수할 수 있게 합니다.

3) 데이터 사용량 반영

파일시스템에서 사용하지 않는 용량을 정리하여 실제 데이터 사용량을 전체 시스템 무결성을 유지하면서 더욱 정확히 반영할 수 있습니다.


1. 미사용 공간 정리 방식

스냅샷 용량 최적화를 위해 사용할 수 있는 대표적인 방법은 다음 두 가지입니다.

방법설명
방법 1. zero-filling빈 공간을 0으로 채운 뒤 삭제하여 스냅샷 용량을 줄이는 방식
방법 2. fstrim파일시스템의 미사용 블록을 스토리지에 전달하여 할당 해제하는 방식

2. zero-filling

zero-filling은 파일시스템의 빈 공간을 0으로 채운 임시 파일로 덮어쓴 뒤, 해당 파일을 삭제하는 방식입니다.

파일을 삭제한 뒤에도 디스크 블록에는 기존 데이터 흔적이 남아 있을 수 있습니다.
zero-filling을 수행하면 빈 공간에 남아 있는 데이터 흔적을 0으로 채우기 때문에, 스냅샷 생성 시 압축 또는 중복 제거 효율이 높아져 스냅샷 용량을 줄이는 데 도움이 됩니다.

예를 들어 추가 볼륨을 /mnt에 마운트한 뒤, /mnt의 빈 공간을 0으로 채운 임시 파일로 가득 채우고 삭제하는 방식입니다.


3. fstrim

fstrim은 마운트된 파일시스템에서 사용하지 않는 블록을 스토리지 계층에 전달하여, 해당 영역을 미사용 공간으로 처리할 수 있도록 하는 방식입니다.

파일을 삭제하면 파일시스템에서는 해당 공간을 다시 사용할 수 있는 공간으로 표시합니다.
하지만 디스크 블록 수준에서는 해당 영역이 계속 할당된 블록으로 남아 있을 수 있습니다.

fstrim은 이러한 미사용 블록 정보를 스토리지에 전달하여, 스냅샷 생성 시 불필요한 블록이 포함되는 것을 줄이는 데 도움을 줍니다.


4. zero-filling과 fstrim 차이점

비교 항목zero-fillingfstrim
기본 개념빈 공간을 0으로 직접 채움미사용 블록을 스토리지에 알림
동작 방식빈 공간에 0 데이터 파일을 생성 후 삭제discard/TRIM 요청을 스토리지에 전달
처리 속도상대적으로 느림빠름
디스크 부하높음낮음
지원 조건파일시스템에 쓰기 가능하면 수행 가능discard/TRIM 지원 필요
용량 절감 방식0으로 채워진 영역의 압축/중복 제거 효과 활용미사용 블록을 스토리지에서 회수하도록 전달
권장 상황스냅샷 용량을 최대한 줄여야 하는 경우일반적인 스냅샷 최적화 작업

일반적으로는 fstrim을 먼저 수행하는 것을 권장합니다.
다만 fstrim 적용 후에도 스냅샷 용량이 충분히 줄어들지 않거나, 스냅샷 용량을 최대한 줄여야 하는 경우에는 zero-filling 방식을 사용할 수 있습니다.


5. 사용 전 기본 정리

스냅샷에 포함할 필요가 없는 임시 파일, 캐시 파일, 불필요한 로그 등을 먼저 삭제합니다.

sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

서비스에서 사용 중인 파일이나 필요한 로그 파일을 삭제하지 않도록 주의해야 합니다.


6. zero-filling 사용 방법

zero-filling은 볼륨을 마운트한 뒤, 마운트 경로에서 빈 공간을 0으로 채우는 방식으로 수행합니다.

추가 볼륨이 /dev/vdb이고, 마운트 경로가 /mnt인 경우 다음과 같이 작업합니다.

1) 볼륨 마운트

sudo mount -o discard,defaults /dev/vdb /mnt
항목설명
/dev/vdb마운트할 블록 스토리지 디스크
/mnt마운트 대상 경로
discard미사용 블록 정보를 스토리지에 전달할 수 있도록 하는 옵션
defaults일반적인 기본 마운트 옵션
주의사항

discard옵션 적용하여 운영시 i/o가 비교적 느릴 수 있습니다.

마운트 상태를 확인합니다.

df -Th

2) zero-filling 수행

마운트된 경로로 이동한 뒤, 빈 공간을 0으로 채웁니다.

cd /mnt
sudo dd if=/dev/zero of=./erase bs=1M
sudo rm -f ./erase
sudo sync

위 명령어는 /mnt 파일시스템의 남은 빈 공간을 0으로 채운 뒤, 생성된 임시 파일인 erase를 삭제하는 방식입니다.

3) 실행 중 출력 예시

dd: error writing './erase': No space left on device
7661+0 records in
7660+0 records out
8032182272 bytes copied

No space left on device 메시지는 디스크의 빈 공간을 모두 0으로 채웠다는 의미입니다.
zero-filling 과정에서는 일반적으로 발생할 수 있는 메시지이며, 이후 생성된 erase 파일을 삭제하면 됩니다.

sudo rm -f ./erase
sudo sync
안내사항

zero-filling은 빈 공간 전체에 쓰기 작업을 수행하므로 디스크 I/O 부하가 발생할 수 있습니다.
운영 중인 VM에서는 서비스 사용량이 적은 시간대에 수행하는 것을 권장합니다.


7. fstrim 사용 방법

fstrim은 마운트된 파일시스템에서 사용하지 않는 블록을 스토리지 계층에 전달하는 방식으로 수행합니다.

1) 특정 마운트 경로에 fstrim 수행

예를 들어 /mnt에 마운트된 볼륨에 대해 fstrim을 수행하려면 다음과 같이 실행합니다.

sudo fstrim -v /mnt

2) 전체 마운트 경로에 fstrim 수행

VM에 마운트된 모든 지원 파일시스템에 적용하려면 다음과 같이 실행합니다.

sudo fstrim -av

3) fstrim 옵션

-a, --all          마운트된 모든 파일시스템 trim
-A, --fstab /etc/fstab에 마운트된 모든 파일시스템 trim
-v, --verbose trim 과정 출력

8. 실제 스냅샷 용량 비교 예시

동일한 환경에서 VM 2대를 생성하고, 각각 동일한 크기의 볼륨과 타입으로 동일한 테스트 파일을 구성한 뒤 zero-fillingfstrim을 각각 수행했습니다.

방식10 GB50 GB
zero-filling68 MiB1.2 GiB
fstrim112 MiB1.2 GiB

두 방식 모두 스냅샷 용량을 크게 줄이는 효과가 있었습니다.
10 GB 블록스토리지와 50 GB 블록스토리지 두 용량에서 확인 시 작은 용량에서는 zero-filling이 조금 더 효과적이나, 용량이 커질수록 그 차이가 줄어들었습니다.

다만 zero-filling은 디스크 빈 공간 전체에 쓰기 작업을 수행하므로 VM 부하가 더 큽니다.
따라서 기본적으로는 fstrim을 우선 사용하고, 추가적인 용량 절감이 필요한 경우 zero-filling을 사용하는 것을 권장합니다.

블록스토리지 타입

블록스토리지 타입에 관계없이 SSD_pro, SSD_standard, SATA 모두 유사한 용량 차이를 보입니다.
다만, 속도의 차이는 있을 수 있습니다.


9. 권장 작업 순서

스냅샷 생성 전 다음 순서로 작업하는 것을 권장합니다.

  1. 불필요한 파일 삭제
  2. fstrim 수행
  3. 추가 용량 절감이 필요한 경우 zero-filling 수행
  4. 스냅샷 생성

기본 권장 명령어

sudo fstrim -av

추가 용량 절감이 필요한 경우

마운트 경로가 /mnt인 경우:

sudo mount -o discard,defaults /dev/vdb /mnt
cd /mnt
sudo dd if=/dev/zero of=./erase bs=1M
sudo rm -f ./erase
sudo sync

상황별 권장 방식

권장 방법상황
fstrim일반적인 스냅샷 용량 최적화
디스크 I/O 부하를 최소화해야 하는 경우
discard/TRIM 지원 환경
zero-filling스냅샷 용량을 최대한 줄여야 하는 경우
fstrim 후에도 용량 절감이 부족한 경우
점검 시간에 작업 가능하고 디스크 부하를 감수할 수 있는 경우

기본적으로는 빠르고 부하가 적은 fstrim을 우선 사용하는 것을 권장합니다.
추가적인 용량 절감이 필요하거나 fstrim 효과가 제한적인 경우에는 zero-filling을 사용할 수 있습니다.