ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 가상 머신(Virtual Machine)이란?
    SE Concepts 2023. 11. 16. 00:13
    반응형

    가상 머신은 가상화의 기반이 되는 컴포넌트입니다. 가상 머신은 가상화 전의 bare-metal에서의 운영체제와 애플리케이션이 담기는 곳으로 하이퍼바이저 위에서 동작합니다. 

     

    Image from Author

     

    가상 머신 내부에서 보면 물리 서버 내부와 별로 다를게  없습니다. 그러나 가상 머신 외부에서 살펴보면, 물리 서버와 동일하게 동작하도록 수많은 처리가 진행되고 있는 것을 볼 수 있습니다. 

     

    이 글에서는 가상 머신이 무엇인지, 가상 머신에서의 CPU, Memory, Network, Storage의 처리는 기반한 하이퍼바이저, 하드웨어와 어떻게 동작하는지 알아보도록 하겠습니다.

     


     

    가상 머신이란?

    VM(가상 머신)은 물리서버와 동일하게 운영체제를 지원하고, 애플리케이션이 접근할 수 있는 여러 리소스를 설정할 수 있습니다.

     

    하지만 물리서버와는 달리 여러 개의 가상머신은 한 개의 물리서버에서 실행될 수 있습니다. 또한, 물리서버와는 다르게 가상 머신은 가상 서버를 구성하고 정의하는 여러 파일 묶음으로 이뤄져 있습니다.

     

    VM를 구성하는 주요 파일들은 설정 파일과 가상 디스크 파일입니다. 설정 파일은 VM이 사용할 수 있는 리소스(어떤 가상 하드웨어가 연결되어 있는지)를 정의합니다. 

     

     

    가상 머신에서의 하드웨어 접근

    가상 머신에서는 기존 물리서버와 동일하게 하드웨어에 접근합니다. 하지만 가상 머신을 벗어난 요청들은 하이퍼바이저에 의해 실제 물리서버에서 처리되게 됩니다. 

    Image from Author inspired by [1]

     

    하드웨어의 주요한 리소스인 CPU, Memory, Network, Storage가 그러한 흐름에서 어떻게 처리되는지 알아보겠습니다.

     

    CPU는 어떻게 가상화되는가?

    짧게 말해서 대부분 CPU는 가상화되지 않습니다. CPU 가상화를 하는 솔루션이 존재하나, 그 기능을 지원하기 위해서 많은 처리비용이 사용되어 성능과 확장성 이슈를 가져옵니다. 그렇기에 대부분은 가상 머신의 instruction이 가용한 프로세서에서 동작할 수 있도록 타임 슬라이스를 스케쥴하는 형태로 동작합니다. 정확히는 효율성을 위해서 가상 CPU는 특정 물리 CPU에 매핑되지 않고, 요청 시에 가용한 프로세서를 아무거나 스케쥴하여 사용하게 됩니다. 

     

    아래에서는 물리 서버의 CPU와 가상 머신의 CPU를 구분하기 위해서 후자는 vCPU로 표시하였습니다. 

     

    CPU 가상화는 결국 CPU의 time slice의 스케쥴링 이슈입니다. 그렇기에 얼마나 많은 수의 가상 머신을 물리 서버에 할당할지 고려할 때는 가상 머신에서 동작하는 애플리케이션의 workload를 고려하게 됩니다. 애플리케이션이 쉬지 않고 1개의 CPU를 사용하는 작업 형태라면, vCPU 1 : 1 물리 CPU가 되어야 할 것입니다. 

     

    그러나 일반적인 애플리케이션에서 완전하게 CPU를 소모하지 않아 완전하게 1:1은 아니기에, 벤더별로 조금씩 다른 가상 머신 권장 할당량 또는 제한을 가이드해주고 있습니다 (예, 물리 코어 1개 당 32 vCPU). 

     

    물리 서버에 4개의 CPU core가 존재하는데, 다른 VM이 존재하는 상황에서 VM a가 4개의 vCPU, VM b가 1개의 vCPU를 요구한다면 b가 우선적으로 할당받은 확률이 높습니다. 이는 음식적에서 10명보다는 2명이 먼저 착석을 하는 것과 유사한데요. 그렇기에 가상 머신의 vCPU를 튜닝할 때에는 처음부터 많은 vCPU를 할당하고 줄이면서 하는 것보다는, 1개를 할당하고 조금씩 늘리면서 하는 것이 적절합니다. 

     

    가상 머신을 위한 메모리 관리

    가상 머신의 메모리 설정은 추가하거나 줄이는 2가지로 매우 간단합니다. 시야를 외부로 돌리면, 하이퍼바이저가 가상 머신의 메모리를 물리 서버의 메모리에 연결하기 위해서 각 VM마다 메모리 매핑 테이블을 가지고 있는 것을 알 수 있습니다. 

     

    그렇기에 하이퍼바이저는 중간에서 가상 머신의 메모리 매핑 테이블과 물리 서버의 메모리 구조를 모두 파악하고 있게 됩니다. 이를 통해, 하이퍼바이저는 리소스 효율화를 위해 가상 머신에 다이내믹하게 메모리를 할당하고, 회수하는 등의 기능을 제공하는 역할을 수행하게 됩니다. 하이퍼바이저는 특정 VM이 잘 사용하지 않는 메모리가 존재하는 경우 등에 해당 메모리 영역을 디스크로 flush하고(balloon driver), 메모리를 다른 곳에 할당할 수 있습니다. 이후 VM이 메모리를 접근하게 되면 데이터를 Memory로 다시 load해서 사용하게 됩니다. 

     

    이러한 기능은 가상 머신 메모리 총합이 실제 물리 서버 메모리 총합보다 더 많은 overcommitment를 가능하게 합니다. 이 역시 CPU와 마찬가지로, 작업의 메모리 사용 특성을 이해하고 있어서 적절히 사용할 수 있습니다. 일반적인 1.5 또는 2 : 1에서 애플리케이션 특성을 잘 알고 있다면 10, 20 : 1까지도 가능합니다.

     

    또 다른 최적화의 한 가지 형태는 page sharing입니다. 하나의 물리 서버에 올라간 여러 가상 머신이 같은 OS, 같은 애플리케이션을 실행하는 것은 흔한 일이기에 동일한 페이지 transfer가 발생하고, 하이퍼바이저는 같은 데이터를 여러 메모리 위치에 쓰지 않고 한 곳에 쓰고 사용할 수 있습니다.

     

    일반적으로 이러한 page sharing을 통해 10 ~ 40 퍼센트까지 메모리를 절약할 수 있습니다. 웹 애플리케이션에도 많이 사용되며, 또 다른 주요 사용례는 VDI (Viritual Desktop Infrastructure)입니다. 

     

    기타 메모리 옵션으로는 Swapping, Memory Compression 등이 존재합니다. 

     

    가상 머신을 위한 스토리지 관리

    스토리지 가상화 역시 다른 리소스의 가상화와 동일하게 하이퍼바이저가 가상 머신의 요청을 받아 물리 서버에 전달해 처리되게 됩니다.

    Image from Author inspired by [1]

     

    위와 같은 모델은 VMware의 구조에 해당됩니다. 조금 다른 형태의 구조로는 다음과 같은 타입2가 있습니다.

    Image from Author inspired by [1]

     

    스토리지 가상화와 관련된 주요 포인트 중 하나는 클러스터와 공유 스토리지입니다. SAN(Storage Area Network) 또는 NAS(Network Attacked Storage)는 하나의 서버가 해당 서버의 하드웨어 설정에 포함되지 않은 디스크 스토리지에 접근을 가능하게 합니다. 또한, 여러 컴퓨터가 같은 물리 드라이브에 접근하는 것도 가능하게 하는데요.

     

    이러한 특징은 물리 서버를 가상화하거나, 가상 머신을 다른 서버로 이관하는 작업 등을 순조롭게 해줍니다. 기존 위치와 변경 이후 위치는 스토리지를 공유하고, 애플리케이션을 옮김으로써 데이터 이관을 간단하게 만듭니다. 또한, 이관 실패 시 빠른 fallback도 가능하게 해줍니다. 

     

    VM 스토리지 튜닝

     VM 스토리지는 주로 성능 이슈가 발생하는 포인트입니다. 이유는 여러가지가 있지만, 보통은 가상화가 전체적인 스토리지 throughput에 어떤 영향을 미치는지 잘 알고 있지 못해서 발생하게 됩니다. 

     

    여러 작업들이 가상 머신의 형태로 하나의 물리 서버로 옮겨지기에(consolidation), 메모리와 CPU 뿐만 아니라 스토리지 I/O (네트워크 I/O 역시도)도 적절하게 늘려주어야 합니다. 그렇기에 보통 큰 디스크를 적은 갯수를 추가하는 것보다는 작은 디스크를 여러가 추가하여 충분한 대역폭을 확보해야 합니다. 

     

    물리 서버에서도 많이 사용되는 Disk Mirroring(같은 디스크 복사본을 저장 - 손실을 방비하고 read 시 여러 곳에서 읽을 수 있음), Disk Striping(파일시스템이 여러 디스크로 쪼개져서, read 시 부하를 여러 포인트로 분산)와 같은 테크닉이 VM 스토리지 가상화 시에도 적용될 수 있습니다. 

     

    기타 다른 옵션으로는

    • Deduplication: 메모리의 'page sharing'과 유사하게 동일한 데이터를 디스크 한 곳에 저장하고 사용
    • I/O priority: 고속도로의 버스 전용차선과 같이 특정 VM이 스토리지 I/O 대역을 모두 점유해 사용하지 못하는 상황이 발생하지 않도록 중요 I/O가 사용하는 대역을 보존하고 속도를 보장
    • 다양한 Storage 사용: Hard disk, SSD 등을 사용
    • Tiered storage: AWS S3와 같이 자주 사용되는 데이터는 비용이 비싸더라도 성능이 좋은 Disk에, 자주 사용되지 않는 데이터는 비용이 저렴하나 성능이 비교적 낮은 Disk에 저장하는 기능 (또는 이 위치를 자동으로 관리해주는 기능) 

     

     

    네트워크 가상화

    네트워크 가상화는 스토리지 가상화와 유사하게 I/O 대역폭의 제한을 받습니다. 또한, 네트워크 가상화는 스토리지 트래픽(NAS의 경우)까지 감당하기에, 설정의 여러 성능적인 부분을 고려해 설정되어야 합니다.

     

    아래는 VMware vSphere 호스트의 가상 네트워크입니다. Internal 네트워크의 경우에 다른 머신이라도 물리 네트워크 망을 경유하지 않고 메모리에서 바로 처리되기에, 물리 서버의 로컬 네트워크보다 빠른 성능을 제공합니다. 

    Image from Author inspired by [1]

     

    결제나 금융 관련 애플리케이션의 경우 보안적 요구사항이 높기에, 물리 NIC를 추가하여 각 애플리케이션은 위와 같이 연결된 물리 NIC로만 접근하도록 설정도 가능합니다.

     

     

    VM의 MAC과 IP

    VM 역시 다른 기기와 같이 여러 NICs를 가지고 있다면 각 NIC마다 주소를 필요로 합니다. NIC에는 MAC과 IP 주소를 설정할 필요가 있는데요. 

     

    먼저 IP주소는 여러가지 방법을 통해 설정될 수 있습니다. Admin이 직접 설정할 수도 있고, 특정 서버와 DHCP(Dynamic Host Configuration Protocol)를 사용해서도 설정될 수 있습니다.

     

    VM은 크게 3가지 네트워크 연결 타입을 제공합니다: bridge, host-only, NAT(Network Address Translation).

     

     

    Bridge

    브릿지 네트워크는 각 VM이 호스트 외부에서 해당 주소를 통해 인지하고, 접근할 수 있는 주소를 할당합니다.

    Bridge network - Image from Author inspired by [1]

     

    Host-only

    Host-only 네트워크는 internal-only 네트워크에 해당되는 네트워크입니다. 물리 네트워크는 해당 VM에 대해 인지하지 못하고 있으며, 커뮤니케이션 할 수도 없습니다.

    Host-only - Image from Author inspired by [1]

     

    NAT

    NAT는 host-only와 Bridge를 조합한 형태입니다. VM는 외부로부터 격리된 IP 주소를 가지나 호스트 외부 네트워크에 접근이 가능합니다. 각 VM은 외부 네트워크 접근 시, 호스트의 IP 주소를 공유합니다. VM이 네트워크 요청을 호스트 외부로 송신할 때에, 하이퍼바이저는 내부에서 외부 네트워크로의 주소 번역(translation) 테이블을 유지합니다. 네트워크 데이터가 수신되면 물리 NIC는 데이터를 하이퍼바이저에 전달하고, 하이퍼바이저는 주소를 번역하여 적절한 VM에 데이터를 전달해줍니다.

     

    NAT - Image from Author inspired by [1]

     

    VM Network의 튜닝

    스토리지와 유사하게 consolidation 시 네트워크가 주요 병목이 될 수 있기에, 워크로드를 고려한 충분한 대역폭 설정이 필요합니다. 기존에는 트래픽 타입(데이터, 스토리지 등등)에 따라 구분된 NIC를 사용하는 것을 권장했으나 충분한 대역폭에 다양한 프로토콜을 지원하는 CNA(Converged Network Adapter)가 등장하면서 조금 더 적은 수의 하드웨어로 구성이 가능해지고 있습니다. 

     

    또한, 시간이 흐르며 가상 스위치(또는 물리)의 역할인 설정된 대로 데이터를 처리하는 부분(data plane), 데이터를 어떻게 처리할지 설정하는 부분(control plane)이 명확히 구분되어 왔습니다. 수많은 기기를 일일히 설정할 수는 없기에 data plane은 분산되어서, control plane은 한 곳에서 관리하며 손쉽게 설정을 진행할 수 있게 기능이 제공되어 왔습니다.

     

    이런 흐름은 클라우드가 발전하며, software-defined network라는 방향성하에 물리적인 부분들이 점점 추상화되어 소프트웨어로 많은 부분 핸들링이 가능해지고 있습니다.

     

     

     

    Reference

    [1] Virtualization Essentials

    반응형
Kaden Sungbin Cho