시스템 관리_43 VMware ESXi 메모리 핫애드 Hot-Add 활성화 후 게스트 OS 메모리 미반영 오류 원인 분석 및 완벽 해결 가이드

 
  • 출처 / 참고: VMware Broadcom Knowledge Base (Hot-adding memory in Linux - KB 2008405, Memory Hotplug in Linux Kernel Documentation)

명령어: free, lsmem, chmem, dmesg, udevadm, cat
키워드: Memory Hot-Add, vSphere Hot-Plug, Guest OS, offline memory, /sys/devices/system/memory, udev rules, 99-vmware-scsi-udev.rules, NUMA
사용처: vSphere Web Client에서 가상 머신 메모리를 무중단 증설했으나 리눅스 게스트 OS에서 용량이 늘어나지 않고 오프라인으로 방치되는 장애 해결


실행예제

vSphere Client에서 가상 머신의 RAM을 8GB에서 16GB로 Hot-Add 증설했으나 리눅스 게스트 OS(free -m 또는 top)에서 8GB로 유지되고 있을 때, 커널의 메모리 블록 상태(offline) 및 증설 인식 여부를 점검합니다.

# 1. 게스트 OS 전체 가용 메모리 확인 (증설 전 8GB 그대로 남아있는 상태)
$ free -h
              total        used        free      shared  buff/cache   available
Mem:          7.6Gi       5.2Gi       1.1Gi        45Mi       1.3Gi       2.1Gi
Swap:         4.0Gi       120Mi       3.9Gi
# -> vSphere에서 16GB로 증설했음에도 7.6Gi만 표시됨

# 2. 커널 메시지(dmesg)에서 메모리 핫플러그(Hot-Add) 이벤트 수신 여부 확인
$ sudo dmesg | grep -iE "hotplug|memory.*add"
# [출력 예시]
# [ 4812.124501] ACPI: \_SB_.MEM0: System Memory hot-add
# [ 4812.124510] Memory block size: 128MB
# [ 4812.124520] Built 1 zonelists, mobility grouping on.  Total pages: 2097152
# -> 하이퍼바이저로부터 메모리 추가 신호는 정상 수신했음을 확인

# 3. lsmem 명령어로 온라인/오프라인 메모리 블록 통계 확인
$ lsmem
# RANGE                                  SIZE  STATE REMOVABLE BLOCK
# 0x0000000000000000-0x00000001ffffffff    8G online       yes  0-63
# 0x0000000200000000-0x00000003ffffffff    8G offline      yes 64-127
#
# Memory block size:       128M
# Total online memory:       8G
# Total offline memory:      8G
# -> 새로 추가된 8GB(블록 64~127)가 'offline' 상태로 방치되어 있어 사용 불가 상태 확인

# 4. sysfs 메모리 장치 디렉터리에서 개별 블록 상태 직접 점검
$ grep -i "offline" /sys/devices/system/memory/memory*/state | head -n 5
# /sys/devices/system/memory/memory64/state:offline
# /sys/devices/system/memory/memory65/state:offline
# /sys/devices/system/memory/memory66/state:offline

   

스크립트

리눅스 게스트 OS 내에서 오프라인(offline) 상태로 대기 중인 모든 메모리 블록을 탐색하여 즉시 온라인(online)으로 활성화하고, 향후 VM 재부팅이나 추가 Hot-Add 시 자동으로 즉시 반영되도록 udev 룰을 등록해 주는 조치 스크립트입니다.

#!/bin/bash
# fix_memory_hotadd.sh - Automatically online offline memory blocks and register auto-online udev rule

echo "=========================================="
echo " [VMware ESXi 메모리 Hot-Add 상태 진단 및 조치]"
echo "=========================================="

if [ "$EUID" -ne 0 ]; then
    echo "  [오류] 메모리 블록 상태를 변경하려면 루트(root) 권한이 필요합니다."
    exit 1
fi

# 1. lsmem 또는 sysfs 기반 오프라인 메모리 확인
echo -e "\n[1] 현재 메모리 블록 상태 점검:"
OFFLINE_BLOCKS=$(grep -l "offline" /sys/devices/system/memory/memory*/state 2>/dev/null)
OFFLINE_COUNT=$(echo "$OFFLINE_BLOCKS" | grep -c "memory" 2>/dev/null || echo 0)

if [ "$OFFLINE_COUNT" -eq 0 ]; then
    echo "  [정상] 현재 오프라인 상태인 메모리 블록이 없습니다."
else
    echo "  [경고] 감지된 오프라인 메모리 블록 수: ${OFFLINE_COUNT}개"
    
    # 2. 오프라인 메모리 블록 일괄 온라인 전환
    echo -e "\n[2] 오프라인 메모리 블록 즉각 활성화(Online) 시도 중..."
    SUCCESS_COUNT=0
    FAIL_COUNT=0
    
    # chmem 명령어가 있는 경우 우선 사용
    if command -v chmem &>/dev/null; then
        echo "  - chmem 명령어를 사용하여 모든 가용 메모리 활성화..."
        chmem -e $(lsmem | awk '/offline/ {print $2}' | head -n 1) >/dev/null 2>&1
    fi

    # sysfs를 통한 직접 활성화 (가장 확실한 방법)
    for STATE_FILE in /sys/devices/system/memory/memory*/state; do
        if [ -f "$STATE_FILE" ] && [ "$(cat "$STATE_FILE")" = "offline" ]; then
            echo "online" > "$STATE_FILE" 2>/dev/null
            if [ $? -eq 0 ]; then
                SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
            else
                FAIL_COUNT=$((FAIL_COUNT + 1))
            fi
        fi
    done
    
    echo "  -> 활성화 성공: ${SUCCESS_COUNT}개 블록 | 실패: ${FAIL_COUNT}개 블록"
fi

# 3. 현재 free 메모리 갱신 결과 출력
echo -e "\n[3] 최종 가용 메모리 현황:"
free -h

# 4. 향후 Hot-Add 시 자동 반영을 위한 udev 영구 룰 점검 및 등록
echo -e "\n[4] udev 자동 온라인(Auto-Online) 룰 설정 점검:"
UDEV_RULE_FILE="/etc/udev/rules.d/99-hotplug-memory.rules"

if [ -f "$UDEV_RULE_FILE" ]; then
    echo "  [정상] udev 자동 온라인 룰 파일이 이미 존재합니다: ${UDEV_RULE_FILE}"
else
    echo "  [등록] 신규 udev 자동 온라인 규칙 생성 중 -> ${UDEV_RULE_FILE}"
    cat << 'EOF' > "$UDEV_RULE_FILE"
# Automatically online hot-added memory on VMware virtual machines
ACTION=="add", SUBSYSTEM=="memory", ATTR{state}=="offline", ATTR{state}="online"
EOF
    udevadm control --reload-rules
    udevadm trigger --subsystem-match=memory
    echo "  -> udev 룰이 성공적으로 적용되었습니다. 이후 추가 증설 시 즉시 자동 반영됩니다."
fi

echo -e "\n=========================================="
echo " [조치 완료]"
echo "=========================================="

   

해설

vSphere Web Client에서 가상 머신 설정의 메모리 핫플러그(Memory Hot-Plug/Hot-Add) 기능을 활성화하고 VM이 켜진 상태에서 RAM 용량을 상향 조정했음에도 불구하고, 리눅스 게스트 OS에 즉시 반영되지 않는 현상은 가상 하드웨어 결함이 아니라 리눅스 커널의 메모리 핫플러그 정책(Memory Hotplug Subsystem) 때문에 발생합니다.

1. 주요 발생 원인

  1. 리눅스 커널의 수동 활성화 대기 (Manual Online):
    • ESXi는 ACPI DSDT/SSDT 신호를 통해 게스트 OS 커널에 “새로운 물리 메모리 블록이 장착되었다”는 인터럽트를 전달합니다.
    • RHEL, CentOS, Rocky, Ubuntu 등의 리눅스 커널은 안정성을 위해 새로 감지된 메모리 블록(보통 128MB 크기 단위)을 곧바로 커널 풀에 병합하지 않고 기본적으로 offline 상태로 등록한 채 관리자의 승인을 대기합니다.
  2. udev 자동 온라인 규칙 누락:
    • 클라우드 이미지(AWS AMI 등)나 최신 가상화 패키지가 설치된 환경에는 udev 룰이 기본 탑재되어 있으나, 온프레미스 표준 미니멀(Minimal) 설치 OS 환경에는 핫플러그 메모리 장치를 감지했을 때 ATTR{state}="online"을 수행해 주는 udev 이벤트 룰이 누락되어 있는 경우가 많습니다.
  3. vSphere 하이퍼바이저 측의 vNUMA 구조적 제약:
    • VM에 vNUMA가 구성되어 있는 경우, 메모리 핫애드를 활성화하는 순간 vSphere는 메모리 토폴로지 변경 충돌을 방지하기 위해 가상 소켓의 vNUMA를 단일 노드로 강제 축소(vNUMA disable)시킵니다. 이로 인해 대용량 메모리 VM에서 성능 저하가 동반될 수 있습니다.

2. 단계별 해결 방법

1) 수동 긴급 활성화 (CLI 즉시 반영)

  • 단일 블록 수동 등록:
    echo online > /sys/devices/system/memory/memory64/state
    
  • chmem 명령어를 활용한 범위 지정 일괄 활성화:
    # 오프라인 메모리 8GB를 즉시 활성화
    sudo chmem -e 8g
    

2) udev 규칙을 통한 영구 자동화 (권장 해결책)

이후 vCenter에서 관리자가 메모리를 올릴 때마다 리눅스에 접속하지 않아도 1초 내로 자동 인식되도록 규칙을 영구 등록합니다.

# 1. 룰 파일 생성
sudo tee /etc/udev/rules.d/99-hotplug-memory.rules << 'EOF'
ACTION=="add", SUBSYSTEM=="memory", ATTR{state}=="offline", ATTR{state}="online"
EOF

# 2. udev 데몬 리로드 및 적용
sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=memory

3) 커널 부팅 파라미터 적용 (배포판 옵션)

GRUB 설정(/etc/default/grub)의 GRUB_CMDLINE_LINUX 항목에 아래 파라미터를 추가하면 부팅 시부터 커널이 핫플러그 메모리를 무조건 온라인으로 처리합니다.

memhp_default_state=online
  • 수정 후 grub2-mkconfig 실행 필수.

   

주의사항

  1. Memory Hot-Add 활성화 시 vNUMA 비활성화에 따른 성능 패널티:
    • vSphere에서 Memory Hot-Add를 켜는 순간, ESXi는 해당 VM의 가상 NUMA(vNUMA) 아키텍처 지원을 자동으로 꺼버립니다. 따라서 8개 이상의 vCPU와 대용량 RAM을 사용하는 DB 서버(Oracle, MSSQL, MySQL)의 경우, 메모리 접근 지연 시간이 늘어나 전체 쿼리 처리 성능이 10~20% 저하될 수 있습니다. 초고성능 DB 서버는 핫애드를 끄고 계획 정지 후 증설하는 것이 권장됩니다.
  2. 메모리 핫 언플러그(Hot-Remove)는 지원 불가:
    • vSphere와 리눅스 커널 구조상 메모리를 무중단으로 늘리는 Hot-Add는 가능하지만, 무중단으로 줄이는 Hot-Remove는 불가능합니다. 메모리를 과도하게 증설한 후 다시 줄이려면 반드시 VM을 완전히 종료(Power Off)한 상태에서 설정 편집을 거쳐야 합니다.
  3. 가상 머신 하드웨어 버전(VM Version) 호환성:
    • VM Hardware 버전이 낮거나(vSphere 레거시 버전), 32비트 게스트 OS를 사용하는 경우 단일 VM이 가질 수 있는 최대 메모리 주소 한계선에 부딪혀 커널 패닉을 유발할 수 있으므로 64비트 최신 OS 환경인지 점검해야 합니다.