How to space reclaim

1년전에 쓰다가 만 주제인데, 오늘 전 직장 동료분께서 문의를 주셔서 생각난 김에 다시한번 도전(?) 해보았습니다.

vSphere 환경에서의 Space reclaim 은 크게 3가지 레이어로 구분하시면 됩니다.

  1. In Guest OS
    • Thick VMDK 냐 – In Guest OS Unmap 동작 안함
    • Thin VMDK 냐 – In Guest OS Unmap 동작함 (VMFS5 인 경우 default 로 disable / VMFS6 인 경우 Default 로 enable)
  2. VMFS Datastore
    • VMFS5 냐 – Manual Unmap
    • VMFS6 냐 – Auto Unmap
  3. Storage – 여기는 AFA (All Flash Array) 로만 한정하겠습니다.
    1. Dedup
    2. 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 가 많이 발생할 수 있음으로 가급적 업무에 영향없는 시간에 수행하시는것이 좋겠습니다.

일단 구구절절하게 써봤는데, 혹시 이해가 안되시거나 부연설명이 필요하다면 코멘트 남겨주세요.