Proxmox ZFS에서 사라진 100GB를 찾은 이야기

목차

서버에서 gdu 툴로 저장공간을 확인하던 도중 무언가 의문이 생겼습니다.

전체 사용량이 예상과 잘 맞지 않았습니다.

 

원인 추적

호스트에서 zfs list -t volume 명령으로 확인해 보니, VM의 zvol들이 상당한 용량을 차지하고 있었습니다.

특히 USED에 표시되는 용량이, 실제로 VM 내부에서 확인되는 사용량보다 훨씬 크게 잡히는 경우가 많았습니다.

 

예를 들어 Arch Linux VM 템플릿은 VM 내부에서는 약 1.3GB 정도를 사용 중인 것으로 나왔지만,

호스트의 ZFS에서는 20GB 이상을 사용 중인 것으로 표시되었습니다.

 

특히 템플릿으로부터 Linked Clone 방식으로 생성된 VM들 역시 저장 공간 사용량이 크게 잡혀 있었습니다.

 

핵심 원인

게스트 OS 안에서 파일을 삭제한다고 해서, 호스트의 ZFS가 그 사실을 즉시 알아차리는 것은 아니었습니다.

실제로 사용하지 않는 공간을 회수하려면 TRIM이 제대로 동작해야 합니다.

흥미로운 점은, 대부분의 운영체제에서는 기본적으로 주기적으로 fstrim을 실행하도록 설정되어 있다는 것입니다.

그렇다면 왜 이런 차이가 생겼을까 싶어 더 찾아보니, 원인은 Proxmox의 VM 디스크 설정에 있었습니다.

VM 디스크 설정에는 버리기(Discard) 라는 옵션이 있습니다.

기본값은 체크 해제된 상태인데, 바로 이 옵션이 핵심 원인이었습니다.

이 옵션은 게스트 OS가 보내는 discard/TRIM 요청을 하위 스토리지로 전달할지 결정하는 설정입니다.

즉 게스트 안에서 파일을 삭제하고 TRIM을 실행하더라도, 이 옵션이 꺼져 있으면 그 정보가 호스트 스토리지까지 제대로 전달되지 않을 수 있습니다. 

실제로 Proxmox 문서에는 게스트가 TRIM 명령을 사용하려면 드라이브에서 Discard 옵션을 활성화해야 한다고 설명되어 있었습니다.

 

실제 확인과 해결

이후 실제로 몇 개의 VM을 대상으로 확인해 보았습니다.

먼저 Linux VM에서는 fstrim -av를 실행해 보았습니다.

그러자 호스트에서 확인되는 ZFS zvol 사용량이 눈에 띄게 줄어들었습니다.

 

Windows VM도 마찬가지였습니다.

Windows 내부에서는 40GB대 정도를 사용 중인 것으로 보였지만, 호스트의 ZFS에서는 70GB대 용량을 차지하고 있었습니다.

여기서 Windows의 드라이브 최적화 기능을 실행한 뒤 다시 확인해 보니, 무려 30GB 이상이 줄어드는 결과를 확인할 수 있었습니다.

 

즉 게스트 OS 안에서 보이는 사용량과, 호스트 ZFS가 실제로 점유하고 있는 사용량은 생각보다 꽤 큰 차이가 날 수 있었습니다.

그리고 그 차이 중 상당수는, 이미 게스트 내부에서는 삭제되었지만 호스트에서는 아직 회수되지 않은 블록이었습니다.

 

템플릿 정리 과정에서..

이 차이는 템플릿 VM을 다루는 과정에서 더 분명하게 드러났습니다.

처음에는 Arch Linux 템플릿의 base volume이 20GB 이상을 사용 중인 것으로 표시되었습니다.

하지만 실제로 VM 내부에서 확인한 사용량은 1GB대 수준이었습니다. (거의 설치 직후의 템플릿이라 많이 가볍습니다)

이후 템플릿을 바로 쓰기보다는, 먼저 일반 VM으로 복제한 뒤 내부 정리를 진행했습니다.

  • 패키지 캐시 정리

  • 불필요한 로그 정리

  • fstrim 실행

이 과정을 거친 뒤 다시 호스트에서 확인해 보니, 20GB가 넘던 디스크 사용량이 3GB대로 줄어들었고, 최종적으로는 base volume 기준 1GB 수준까지 내려갔습니다.

결국 템플릿을 만들기 전에 내부 정리와 TRIM을 한 번 거치는 것만으로도 저장 공간 효율이 엄청나게 달라질 수 있다는 것을 확인할 수 있었습니다.

 

결론

Proxmox + ZFS 환경에서는, 게스트 OS 안에서 보이는 디스크 사용량만 보고 판단하면 안 됩니다.

게스트 내부에서는 이미 삭제된 파일이라도, Discard와 TRIM 경로가 제대로 동작하지 않으면 호스트 ZFS에서는 여전히 사용 중인 공간으로 남아 있을 수 있습니다.

반대로 말하면, 설정만 올바르게 되어 있다면 이미 “죽어 있는 공간”을 꽤 많이 되찾을 수 있다는 뜻이기도 합니다.

 

실제로 이번 정리 과정에서 Linux VM의 fstrim, Windows VM의 retrim, 템플릿 재구성 등을 거치면서 서버 전체에서 약 100GB(!) 정도의 공간을 추가로 확보할 수 있었습니다.

 

생각보다 많은 공간이 “이미 지워졌지만 아직 회수되지 않은 상태”로 남아 있었던 셈입니다.

 

앞으로의 관리 방법

앞으로는 템플릿을 만들기 전, Linux VM의 경우 이 정도만 하면 웬만한 캐시와 불필요한 파일들은 정리될 것으로 기대합니다.

sudo pacman -Scc
sudo journalctl --vacuum-time=1d
rm -rf ~/.cache/*
sudo rm -rf /root/.cache/*
sudo fstrim -av

또한 Proxmox에서 VM 디스크를 생성할 때는 버리기(Discard) 옵션도 함께 확인하는 습관을 들이려고 합니다.

This article was updated on

Related post