본문 바로가기

Compute

How ballooning driver works (1)

ESXi Hypervisor가 제공하는 Memory Reclamation(메모리 회수) 기능 중 Ballooning에 대해서 알아보도록 하겠습니다.

 

개요

Guest OS는 자신이 Hypervisor 위에서 동작하고 있는지는 알 수 없기 때문에, Guest OS 자신에게 할당된 Memory가 영구적으로 할당되었으며, 다른 OS가 사용할 수 없이 자기자신만 사용할 수 있는 것으로 인지하게 됩니다.

 

이러한 환경에서 예를 들어, Guest OS가 Windows인 경우, Memory에 있는 데이터가 필요 없게 될 때 이를 바로 Memory에서 제거하지 않고, Memory Manager가 Free Page List로 관련된 page를 옮기는 작업을 수행합니다.

 

Windows Memory Manager는 아래 그림과 같이 Memory의 Page Lifecycle을 관리합니다.

 

위에서 언급한 것처럼 사용이 필요없게 된 Page는 Working Sets 에서 Free Page List로 옮겨가게 됩니다.

 

 

하지만, Hypervisor 입장에서는 Guest OS의 Memory Manager가 관리하는 내용들을 알 수가 없기 때문에 실제 Hypervisor는 쓰이지 않는 Page를 가지고, Physical Memory를 그대로 유지하게 됩니다. 

 

이는, VMware의 Hypervisor인 VMKernel은 단순히 VM에 어떤 Machine Page들이 Mapping 되어 있는지만 알고 있기 때문입니다.

 

MinFree

VMKernel은 Memory Reclamation 기술을 이용하기 위해서 MinFree라는 임계치를 정의하여 VMKernel이 얼마만큼의 Memory Free를 유지해야 하는지를 계산합니다.

 

그렇다면, 어떻게 이 MinFree 값을 계산하는지 알아보겠습니다.

MinFree 값은 mem.minFree 변수값으로 관리되며, 대략적으로 다음과 같이 계산할 수 있습니다.

1. Host Memory의 0~28GB 까지는 901.12MB

2. Host Memory의 (전체 용량 - 28GB)의 1%

1번과 2번 값을 더하면 mem.minFree 변수값이 계산됩니다.

 

다만, Host Memory 값으로 우리가 인지하는 실제 Physical Memory 값이 아닌 VMKernel이 관리할 수 있는 용량을 이용할 수 있습니다. 이는 Physical Memory 중 Hardware와 ESXi 자체의 Overhead가 있기 때문입니다.

 

예를 들어서, 실제 Physical Memory가 256GB인 경우 VMKernel이 관리하는 용량은 261,712MB이며 이를 GB로 표현하면 약 255.58GB 입니다.

 

minFree 값을 계산할 때는 VMKernel이 관리하는 용량인 261,712MB을 이용하게 됩니다.

따라서, 0~28GB 까지는 901.12MB이고 남은 용량은 261,712MB에서 28GB인 28,762MB를 제외한 233,040MB에 1%를 곱하게 됩니다. 

결과적으로 901.12MB + (261,172MB - 28,762MB) * 0.1 = 3231.52가 minFree 값이 됩니다.

위 그림을 다음과 같이 다시 그려볼 수 있습니다.

 

Memory State

이렇게 계산한 MinFree 값은 값 자체로 어떤 동작을 하는 것은 아니고 VMKernel이 Memory State를 판단할 때 참고하게 됩니다.

그렇다면, Memory State라는 걸 뭘까요? VMKernel은 Memory Reclamation 기술 중 어떤 기능을 사용할지를 판단하기 위해서 이 Memory State라는 기준을 이용하고, 이 기준은 위에서 설명드린 것처럼 MinFree라는 값을 이용하여 계산하게 됩니다. 이 Memory State라는 기준을 총 5개로 구분이 되며, High, Clear, Soft, Hard, Low가 있습니다.

Memory State 값은 esxtop이나, vsish 명령어로 확인이 가능합니다.

 

12:34:18am up 13 days 27 min, 1454 worlds, 13 VMs, 62 vCPUs; MEM overcommit avg: 0.00, 0.00, 0.00
PMEM  /MB: 261765   total: 3522     vmk,105426 other, 152816 free
VMKMEM/MB: 261379 managed:  3228 minfree, 22025 rsvd, 239354 ursvd,  high state
NUMA  /MB: 130691 (62008), 131072 (90423)
PSHARE/MB:      41  shared,      39  common:       2 saving
SWAP  /MB:       0    curr,       0 rclmtgt:                 0.00 r/s,   0.00 w/s
ZIP   /MB:       0  zipped,       0   saved
MEMCTL/MB:       0    curr,       0  target,   42815 max

 

# vsish -e cat /sched/globalStats/memory/memStats | grep memory-state
   memory-state: 0 -> high

 

Memory 사용률이 늘어나면서 Memory State 값은 High > Clear > Soft > Hard > Low 순서로 변하게 됩니다.

이 때 언제 값이 변하는지는 MinFree 값에 달려 있습니다.

위에서 예제로 보았던 값을 이용하여 살펴보도록 하겠습니다.

Physical Memory가 256GB인 장비에서 VMKernel이 관리할 수 있는 용량은 261,712MB였고 이 때 MinFree 값은 3231MB였습니다.

1) 초기에 Memory 사용률이 높지 않은 상태에서 Memory State 값은 High 입니다.

2) 만약, Memory 사용량이 (VMKernel이 관리하는 용량) - (MinFree * 300%)를 넘어서게 되면 Clear 상태로 Memory State가 변경됩니다.

3) 이 후 Memory 사용량이 더 늘어서 (VMKernel이 관리하는 용량) - (MinFree * 64%)를 넘어서게 되면 Memory State가 Soft 상태로 변경됩니다.

4) Memory 사용량이 계속 늘어서, (VMKernel이 관리하는 용량) - (MinFree * 32%)를 넘어서면 이제 Hard 상태로 변경됩니다.

5) 마지막으로 (VMKernel이 관리하는 용량) - (MinFree * 16%)를 넘어서면  Low 상태로 바뀌게 됩니다.

 

이를 표로 정리해보면 다음과 같습니다.

 

VMKernel은 위에서 확인한 Memory State 값에 따라서, 어떤 Memory Reclamation 기능을 이용할지 결정하게 됩니다.

(Memory 사용률이 감소할 때는 위 계산 수식과 다소 다르게 처리하나 여기서는 별도로 정리하지 않겠습니다.)

Memory 사용률이 늘어날 수록 Memory Reclamation 기능 중 더 성능에 악 영향을 끼치는 작업을 수행하게 됩니다.

 

Memory State의 현재 상태와 Memory State가 얼마나 변화했는지는 아래 명령어를 통해서 확인할 수 있습니다.

# memstats -r comp-stats -s total:minFree:free:numHigh:numClear:numSoft:numHard:numLow:memState -u mb

 COMPREHENSIVE STATS: Sun Dec 25 01:14:41 2022
 ---------------------------------------------
   Unit             : MB
   Selected columns : total:minFree:free:numHigh:numClear:numSoft:numHard:numLow:memState

------------------------------------------------------------------------------------------------
     total    minFree       free    numHigh   numClear    numSoft    numHard     numLow memState
------------------------------------------------------------------------------------------------
    261766       3229     152834                   0          0          0          0     High
------------------------------------------------------------------------------------------------

 

위 값을 보시면 동일한 Physical Memory 256GB가 장착된 장비에서도 VMKernel이 관리하는 MB가 약간 다르기 때문에(261,766MB) minFree 값도 다소 달라지는 것을 알 수 있습니다.

또한, 현재 Memory State는 High이고, 다른 상태로는 변경된 횟수가 0이므로 Memory Pressure로 인해 Memory State가 변경된 적이 없는 것으로 확인됩니다.

 

그렇다면, 이 Memory State에 따라서 어떤 Memory Reclamation 기능을 사용하는지를 아래 표를 이용하여 간단하게 보도록 하겠습니다.

Memory 사용률이 높아지면, VMKernel은 최대한 여러 가지 기능을 통해 VM이 사용할 수 있는 Memory 확보를 위해 노력합니다.

이번 글에서는 Memory Reclamation 기능이 사용되기 위한 조건인 Memory State와 minFree에 대해서 알아보았습니다.

다음 글에서는 Memory Reclamation 기능 중 Ballooning이 어떻게 동작하는지에 대해서 살펴보도록 하겠습니다.