1년전에 쓰다가 만 주제인데, 오늘 전 직장 동료분께서 문의를 주셔서 생각난 김에 다시한번 도전(?) 해보았습니다.
vSphere 환경에서의 Space reclaim 은 크게 3가지 레이어로 구분하시면 됩니다.
- In Guest OS
- Thick VMDK 냐 – In Guest OS Unmap 동작 안함
- Thin VMDK 냐 – In Guest OS Unmap 동작함 (VMFS5 인 경우 default 로 disable / VMFS6 인 경우 Default 로 enable)
- VMFS Datastore
- VMFS5 냐 – Manual Unmap
- VMFS6 냐 – Auto Unmap
- Storage – 여기는 AFA (All Flash Array) 로만 한정하겠습니다.
- Dedup
- not save Zero block
위와 같이 구분하시면 되는데요. 대체로 Space Reclaim 을 하는 경우 Storage 레벨에서의 공간 확보가 목적이실 겁니다. AFA 스토리지들은 기본적으로 Thin 으로 LUN 을 생성합니다. (Thin VMDK 와는 구분해서 생각하여 주십시요), 그리고 일반적으로 물리적인 용량보다 더 많은 용량을 Allocation 하는 경우가 많습니다. 그 이유는 기본적으로 Dedup / Compression / Zero block 처리 등을 통해 실제로 사용하는 공간보다 작은 크기로 데이터를 저장할 수 있기 때문 입니다.
In-Guest OS Unmap
첫번째로 기억하셔야 할 것은 Thick VMDK 인 경우에는 In-Guest OS Unmap 이 동작하지 않습니다.
Thin VMDK 이여야만 동작합니다. 윈도우의 경우에는 파일을 삭제하거나 Disk Optimization tool 을 실행하게 되면 Guest OS 내에서 Unmap 명령어를 날립니다. 그럼 이 Unmap 명령어가 스토리지로 전달이 되어서, Space Reclaim 이 진행되겠죠. 그러나 vSphere 환경에서는 VMFS 라는 또 하나의 레이어가 중간에 위치하게 됩니다.
이 때 VMFS5 의 경우 디폴트로는 Guest OS 에서 발생시킨 Unmap 커맨드를 스토리지로 전달할 수 없습니다. 따라서 In-Guest OS Unmap 이 동작하지 않습니다. VMFS6 에서는 In-Guest OS Unmap 커맨드를 스토리지로 전달할 수 있습니다.
따라서 Thin VMDK + VMFS6 인 경우 파일삭제나 disk optimization (리눅스의 경우라면 fstrim 등) 이 실행되면, VMDK 의 사이즈가 바로 줄어들고, 실제 스토리지의 사용률도 바로 감소하게 됩니다.
VMFS Unmap
그렇다면 VMFS 레벨의 Unmap 은 어떨까요? 위에서 말씀드린바와 같이 VMFS5 는 수동, VMFS6 는 자동으로 특정 인터벌을 가지고 수행 됩니다. 예를 들어 VM 이 삭제되거나, 또는 Storage vMotion 을 통해서 이동한 경우 vSphere 상에서는 변경된 용량을 바로 확인할 수 있지만, 그렇다 하더라도 물리 스토리지의 용량이 바로 변동되지 않습니다. 삭제가 되었던 이동이 되었던 이미 한번 쓰여졌던 Block 이기 때문입니다. 스토리지에서는 사용중인 블락인지 필요없는 블락인지 알 수 없기 때문이죠. 이때 VMFS 레벨의 Unmap 을 실행하면, 사용되지 않는 블락들에 대해서 Storage Reclaim 을 할 수 있게 됩니다.
Storage
스토리지의 경우 대부분의 스토리지는 자체적인 Unmap 을 수행하지 않습니다. 위에서 언급한 바와 같이 Dedup/Zero block 처리를 통해서 용량을 세이브 하게 됩니다.
그런데 스토리지벤더들의 문서를 보면 Eager Zeroed Thick 을 권장하는 경우가 종종 있습니다. 성능상 가장 좋다 라는 이유로요, 그렇다면 위에서 Thick VMDK 인 경우에는 In Guest OS unmap 을 통한 공간회수가 불가능하다고 말씀드렸죠. 그럼 어떻게 해야할까요?
여기서 기억해야 하실건 AFA 스토리지에서 “Zero Block” 을 아에 저장하지 않는다 라는 것입니다. 그렇다면 Thick VMDK 니까 VMDK 사이즈는 줄어들지 않겠지만, 만약 Guest OS 내부에서 파일 삭제 후 더이상 사용되지 않는 공간들을 전부 Zero Block 으로 채우면 어떨까요?
스토리지에는 Zero Block 이 저장되지 않으니 그만큼의 용량이 Storage 에서 빠지게 되는 것입니다. + 중복제거까지 더 수행되어서 더 줄일 수 있습니다.
How to Punch Zero
그럼 위에서 언급한 Zero block 을 채울려면 어떻게 해야할까요? 원래는 두가지 방법이 있습니다.
- Guest OS 내부에서 실행
- ESXi 상에서 vmkfstool 실행
그렇지만 ESXi 상에서 실행했던 방법은 VM 의 Power off 가 필요함으로 권장하지 않습니다. 따라서 굳이 언급하지 않겠습니다.
Windows
- sdelete 를 별도로 다운로드 받아 실행
Linux
- dd 명령어 실행
- 예) $ dd if=/dev/zero of=/mounted-volume/zeroes && rm -f /mounted-volume/zeroes
위 방식을 수행하실 때 유의하실점은, AFA 라면 별 상관없지만, 일반 스토리지인경우에는 Zero block 을 처리해줘야 함으로 일시적으로 디스크 사용률이나 Guest OS 내의 Write I/O 가 많이 발생할 수 있음으로 가급적 업무에 영향없는 시간에 수행하시는것이 좋겠습니다.
일단 구구절절하게 써봤는데, 혹시 이해가 안되시거나 부연설명이 필요하다면 코멘트 남겨주세요.
안녕하세요, 좋은 정보 감사합니다. 한가지 궁금한점이 있는데 데이터스토어가 NFS3일경우 unmap 기능을 지원을 안한다고 벤더사에 답변을 받았는데, 이럴 경우는 OS 상에서 Sdelete나 ,dd 를 사용하는 방법밖에 없는걸까요? 시간이 얼마나 걸릴지 가늠이 안되서 걱정이네요
안녕하세요. unmap 의 경우는 FC/iSCSI 와 같은 block-level 스토리지에서만 동작하는게 맞습니다.
NFS 의 경우는 ESXi 나 Guest OS 상에서 조치할 수 있는 부분은 없다고 생각되는데요. 다만 한가지 생각할 수 있는 부분이라면, Sdelete 를 통해서 Zeroing 을 수행해주고, (이 경우 Thin VMDK 의 크기가 할당양만큼 일시적으로 늘어나겠지요)
해당 VMDK 를 다른 데이터스토어로 Storage vMotion 을 한다면 VMDK 의 사이즈는 줄일 수 있을것으로 생각이 됩니다.
그외에는 스토리지벤더에서 플러그인을 제공하지 않는 이상은 없을 것 같네요. (Netapp 의 VSC 라던가.. – https://library.netapp.com/ecmdocs/ECMP1392345/html/GUID-2C1BCD71-9A8A-423E-9C37-230CB9F60394.html)
다만 NFS 스토리지지가 중복제거나 압축을 지원하는 경우에는 Sdelete 를 수행하면 중복제거율을 높히는데 도움이 될수는 있습니다.
답변이 너무 늦었네요.
좋은 답변 감사합니다!