시스템 관리_45 VMware ESXi 운영 가상 머신 대용량 스냅샷 안전 삭제 및 서비스 중단 방지 가이드

 
  • 출처 / 참고: VMware Broadcom Knowledge Base (Best practices for using snapshots in the vSphere environment - KB 1025263, Determining how long a snapshot consolidation will take - KB 2053758)

명령어: vim-cmd, vmkfstools, watch, df, ls, grep
키워드: Large VM Snapshot, Delete Snapshot, Consolidation, Snapshot Commit, Stun Time, datastore full, sesparse, vSphere Client
사용처: 수백 GB 이상 비대해진 ESXi 가상 머신 스냅샷 삭제 시 서비스 무응답(Stun) 및 데이터스토어 용량 고갈로 인한 VM 정지 예방


실행예제

운영 중인 가상 머신에서 장기간 방치되어 비대해진 스냅샷(수십~수백 GB)의 델타 디스크 크기와 데이터스토어 여유 용량을 점검하고, 스냅샷 병합(Commit) 진행률을 실시간으로 추적하는 명령어 예시입니다.

# 1. 대상 VM의 VMID 및 VMX 디렉터리 경로 확인
$ vim-cmd vmsvc/getallvms | grep -i "Prod-DB-01"
# 105    Prod-DB-01   [datastore_san] Prod-DB-01/Prod-DB-01.vmx   rhel8_64Guest   vmx-19

# 2. 스냅샷 관리자 트리 구조 확인
$ vim-cmd vmsvc/snapshot.get 105
# Get Snapshot:
# |--Snapshot Name        : Backup_Snap_202610
# |--Snapshot Id          : 12
# |--Snapshot Desciption  : Monthly backup
# |--Snapshot Created On  : 10/10/2026 02:00:15
# |--Snapshot State       : powered on

# 3. 데이터스토어 디렉터리로 이동하여 델타(-sesparse.vmdk) 파일의 실제 누적 크기 확인
$ cd /vmfs/volumes/datastore_san/Prod-DB-01/
$ ls -lh *-sesparse.vmdk
# -rw------- 1 root root  280.5G Oct 27 09:15 Prod-DB-01-000001-sesparse.vmdk
# -> 델타 디스크 크기가 280GB에 육박하여 병합 시 대규모 I/O 부하 및 스턴(Stun) 발생 가능

# 4. 데이터스토어 남은 여유 공간(Free Space) 확인
$ df -h /vmfs/volumes/datastore_san
# Filesystem            Size      Used Available Use% Mounted on
# VMFS-6                2.0T      1.8T    150.0G  92% /vmfs/volumes/datastore_san
# -> [위험] 델타 크기(280GB) 대비 데이터스토어 가용 공간(150GB)이 부족한 상태 점검

# 5. 스냅샷 병합 진행률 실시간 추적 (헬퍼 스냅샷 커밋 모니터링)
$ watch -d 'ls -lth *sesparse.vmdk; vmkfstools -q *.vmdk 2>/dev/null'

   

스크립트

ESXi 호스트 콘솔에서 특정 가상 머신의 스냅샷 델타 크기 총합과 대상 데이터스토어의 가용 공간을 비교 분석하여, 안전 삭제 가능 여부를 판단하고 병합 시 발생하는 서비스 일시 정지(Stun Time) 위험을 사전 진단하는 쉘 스크립트입니다.

#!/bin/sh
# precheck_large_snapshot_deletion.sh - Pre-check safety before deleting large snapshots on ESXi

VM_NAME=${1:-""}

echo "=========================================="
echo " [대용량 스냅샷 안전 삭제 사전 검증기]"
echo "=========================================="

if [ -z "$VM_NAME" ]; then
    echo "  [오류] 가상 머신 이름을 인자로 입력하십시오."
    echo "  사용법: $0 <VM_Display_Name>"
    exit 1
fi

# 1. VMID 및 VMX 경로 추출
VM_LINE=$(vim-cmd vmsvc/getallvms 2>/dev/null | grep -F "$VM_NAME" | head -n 1)

if [ -z "$VM_LINE" ]; then
    echo "  [오류] 가상 머신 '${VM_NAME}'을(를) 찾을 수 없습니다."
    exit 1
fi

VMID=$(echo "$VM_LINE" | awk '{print $1}')
VMX_PATH=$(vim-cmd vmsvc/get.summary "$VMID" | grep "vmPathName =" | awk -F'"' '{print $2}')
VM_DIR=$(dirname "$VMX_PATH")

echo "  - 대상 VM명 : ${VM_NAME} (VMID: ${VMID})"
echo "  - 디렉터리  : ${VM_DIR}"

# 2. 스냅샷 델타 디스크 용량 계산
echo -e "\n[1] 스냅샷 델타 디스크 크기 계산 중..."
DELTA_FILES=$(ls -l "${VM_DIR}"/*-sesparse.vmdk "${VM_DIR}"/*-delta.vmdk 2>/dev/null)

if [ -z "$DELTA_FILES" ]; then
    echo "  [정상] 델타 스냅샷 디스크가 감지되지 않았습니다. (병합 대상 없음)"
    exit 0
fi

TOTAL_DELTA_KB=$(echo "$DELTA_FILES" | awk '{sum += $5} END {print sum/1024}')
TOTAL_DELTA_GB=$(awk "BEGIN {printf \"%.2f\", $TOTAL_DELTA_KB / 1024 / 1024}")

echo "  - 감지된 델타 파일 목록:"
echo "$DELTA_FILES" | awk '{printf "    -> %-35s : %.2f GB\n", $9, $5/1024/1024/1024}'
echo "  - 스냅샷 델타 총합 용량 : ${TOTAL_DELTA_GB} GB"

# 3. 데이터스토어 여유 공간 검사
echo -e "\n[2] 데이터스토어 잔여 공간 비교:"
DS_INFO=$(df -k "$VM_DIR" | tail -n 1)
DS_AVAIL_KB=$(echo "$DS_INFO" | awk '{print $4}')
DS_AVAIL_GB=$(awk "BEGIN {printf \"%.2f\", $DS_AVAIL_KB / 1024 / 1024}")
DS_USE_PCT=$(echo "$DS_INFO" | awk '{print $5}')

echo "  - 데이터스토어 가용 공간: ${DS_AVAIL_GB} GB (현재 사용률: ${DS_USE_PCT})"

# 4. 안전 마진(Safety Margin) 판정
# 스냅샷 삭제 도중 생성되는 임시 헬퍼 델타 디스크를 고려하여 최소 16GB 이상의 마진 필요
MIN_REQUIRED_GB=20

echo -e "\n[3] 안전 삭제 판정 결과:"
if [ $(awk "BEGIN {print ($DS_AVAIL_GB < $MIN_REQUIRED_GB)}") -eq 1 ]; then
    echo "  [치명적 위험] 데이터스토어 여유 공간(${DS_AVAIL_GB}GB)이 안전 기준(${MIN_REQUIRED_GB}GB) 미만입니다!"
    echo "  -> 병합 과정 중 신규 쓰기가 누적되면 데이터스토어가 100% 포화되어 VM이 정지(Crash)됩니다."
    echo "  -> 조치: 다른 VM을 Storage vMotion으로 이동시켜 공간을 확보한 후 삭제를 진행하십시오."
elif [ $(awk "BEGIN {print ($TOTAL_DELTA_GB > 100)}") -eq 1 ]; then
    echo "  [주의] 델타 크기가 100GB를 초과합니다 (초대형 스냅샷)."
    echo "  -> 병합 작업이 수 시간 소요될 수 있으며, 최종 단계에서 VM Stun(무응답)이 발생할 수 있습니다."
    echo "  -> 조치: 업무 시간 외 야간 점검 시간에 삭제를 진행하십시오."
else
    echo "  [안전] 스냅샷 삭제를 진행하기에 충분한 여유 공간이 확보되어 있습니다."
fi

echo -e "\n=========================================="
echo " [점검 완료]"
echo "=========================================="

   

해설

가상 머신 스냅샷은 변경된 디스크 블록만을 차분(Delta) 형태로 기록하는 임시 보호 기능입니다. 그러나 이를 수주에서 수개월 동안 방치하여 델타 파일 크기가 수백 GB로 비대해지면, vSphere Client에서 “스냅샷 삭제(Delete / Consolidate)”를 수행할 때 운영 시스템이 멈추거나 데이터스토어가 가득 차서 가상 머신이 비정상 종료(Crash)되는 치명적 사고로 이어집니다.

1. 스냅샷 삭제 시 VM이 크래시되는 2대 메커니즘

  1. 데이터스토어 용량 고갈 (Datastore Full):
    • 스냅샷 삭제 버튼을 누르면 ESXi는 기존 스냅샷 델타 데이터를 베이스 디스크로 병합하는 동안, 운영 중인 VM의 신규 쓰기 요청을 처리하기 위해 임시 헬퍼 델타 디스크(Consolidation Helper Delta)를 새로 만듭니다.
    • 병합 속도보다 VM의 쓰기 속도가 빠르거나 데이터스토어 여유 용량이 바닥난 상태라면, 헬퍼 디스크 확장에 실패하여 데이터스토어가 100% 꽉 차게 되고 동일 스토리지에 있는 모든 가상 머신이 즉각 일시 중단(Suspend/Crash)됩니다.
  2. 최종 스턴 타임(Final VM Stun Time) 초과:
    • 스냅샷 병합의 마지막 단계에서 ESXi는 VM의 vCPU를 아주 짧은 시간 동안 일시 정지(Stun)시켜 남은 변경 블록을 최종 커밋합니다.
    • 델타 디스크가 너무 크거나 스토리지 성능이 낮으면 이 스턴 시간이 수십 초에서 수 분 이상 지속됩니다. 이로 인해 게스트 OS 내부의 DB 세션 단절, 클러스터 하트비트 타임아웃(Split-Brain 오인), TCP 소켓 리셋이 발생하여 서비스가 터지게 됩니다.

2. 안전한 대용량 스냅샷 삭제 4단계 절차

1단계: 데이터스토어 여유 공간 확보 (Storage vMotion)

  • 델타 디스크 병합 자체는 기본적으로 베이스 디스크에 덮어쓰므로 디스크 크기 자체가 2배로 들지는 않지만, 작업 중 생성되는 헬퍼 델타와 메타데이터 버퍼를 위해 최소 20~30GB 이상의 데이터스토어 여유 공간을 반드시 유지해야 합니다.
  • 공간이 부족하다면 동일 데이터스토어에 있는 중요도가 낮은 다른 VM을 먼저 다른 데이터스토어로 Storage vMotion 이동시킵니다.

2단계: 애플리케이션 I/O 최소화 (야간 작업)

  • 병합 작업은 대규모 순차 읽기/쓰기를 발생시켜 스토리지 I/O를 최대치로 소비합니다.
  • 배치 작업이나 대용량 DB 배치가 없는 심야 시간대에 진행해야 헬퍼 디스크의 팽창을 막고 병합 시간을 단축할 수 있습니다.

3단계: vSphere Client를 통한 단일 스냅샷 삭제

  • 스냅샷 관리자에서 여러 개의 스냅샷이 계층을 이루고 있다면, “모두 삭제(Delete All)” 대신 가장 오래된 부모 스냅샷부터 하나씩 역순으로 삭제하거나(선택적 병합), 구조가 단순한 경우에만 삭제를 진행합니다.
  • 진행률이 99%에서 장시간 멈춰 있어도 정상적인 최종 디스크 교체 작업 중이므로 절대로 취소하거나 VM을 강제 종료해서는 안 됩니다.

4단계: CLI를 통한 백그라운드 진행률 모니터링

GUI 작업 창이 끊기더라도 ESXi 콘솔에서 스냅샷 커밋 작업이 실제로 스토리지에서 돌고 있는지 점검합니다.

# VMX 프로세스의 디스크 I/O 활동 실시간 확인
watch -d 'esxcli vm process list; lsof | grep -i "sesparse"'

   

주의사항

  1. 병합 진행 중 가상 머신 강제 재부팅/전원 끄기 절대 금지:
    • 대용량 스냅샷 병합은 스토리지 성능에 따라 3~6시간 이상 소요될 수 있습니다. 99% 상태에서 멈춘 것처럼 보인다고 해서 VM을 재기동하거나 ESXi 호스트를 리부팅하면 VMDK 체인이 영구 파손(CID Mismatch)되어 복구가 불가능해집니다.
  2. 스냅샷은 백업(Backup)이 아님을 명심:
    • 스냅샷은 OS 패치나 배포 전 24~72시간 동안만 임시로 유지하는 롤백 도구입니다. VMware 공식 권장 사항에 따라 단일 스냅샷은 72시간 이상 보관하지 않아야 하며, 델타 크기가 베이스 디스크 크기의 20%를 넘기 전에 삭제해야 안전합니다.
  3. 고아(Orphaned) 스냅샷 상태 점검:
    • 백업 솔루션 오류 등으로 vSphere Client UI에는 스냅샷 목록이 비어 있으나 데이터스토어에는 *-000001.vmdk가 여전히 활성 디스크로 물려 있는 경우가 있습니다. 이 경우 VM 우클릭 후 스냅샷 $\rightarrow$ 통합(Consolidate) 메뉴를 실행하여 정리해야 합니다.