목차
4. 하드웨어 가상화
CPU 가상화
멀티코어 프로세서
ESX 서버 입장에서는 각 코어가 하나의 논리적 프로세서(Logical Processor) 단위로 인식된다. 이에 따라, 동일한 소켓 안의 멀티코어에서 프로세스가 처리되는 경우도 있지만, 각각 다른 소켓의 코어에서 프로세스가 처리되는 경우도 있다.
하이퍼스레딩
운영체제가 물리적인 한 개의 CPU를 두 개의 논리적 CPU 처럼 인식하여 작동하게끔 해주는 기술이다. 예를 들어, 듀얼 코어는 연산 라인(Instruction Pipeline)과 실행 라인(Execution Pipeline)이 각각 2개씩 포함되어 있는데, 하이퍼스레딩 기술을 가진 싱글 코어의 경우, 연산 라인만 2개이며, 실행라인은 1개이기 때문에 성능이 2배가 되는 것은 아니다. 즉, 데이터의 입력은 빠를 수 있으나, 데이터 출력 속도가 동일하기 때문에 전체적인 성능 효과를 기대하기 어렵다. 또한, CPU 내부의 캐시 메모리도 공유하기 때문에 특정 애플리케이션의 경우, 오히려 성능이 저하될 수 있다.
CPU Affinity
특정 가상 머신에서 일어나는 CPU 명령을 항상 고정적으로 전담하여 처리할 물리적인 CPU를 지정해 주는 기능이다. 이때, 가상 머신을 VMX 프로세스와 연계하여 레거시 장치들과 통신하는 등의 부수적인 프로세스 처리를 해야할 때에는 최소 2개 이상의 CPU에 어피니티 설정을 해야 한다. (하이퍼스레딩을 사용하는 경우, 가능한 CPU 번호를 멀리 떨어뜨려야 한다.)
가상 SMP
멀티스레드 애플리케이션이 작동하는 게스트 운영체제에 두 개 이상의 CPU를 할당해 주는 기능이다. 이때, 싱글스레드 애플리케이션만 작동하는 게스트 운영체제에 두 개 이상의 가상 CPU를 할당하는 경우, 다른 가상머신이 사용할 수 있는 CPU를 점유하게 되므로, 사전에 충분한 검증이 필요하다.
CPU 전원 관리
VMware의 DVFS(Dynamic Voltage and Frequency Scaling) 기법을 이용하여 ACPI 규격의 전력 상태 중 하나인 성능 상태(P-states)를 사용할 수 있다. 즉, ESX 서버를 운영 중인 상황에서 동적으로 CPU의 클록 주파수와 전력을 조정하여 전력 비용을 절감시킬 수 있다.
- Static - 기본 값이며, 호스트 시스템의 BIOS 설정에서 CPU 전력이 설정되어 있지 않는 한 CPU가 가지고 있는 최대 클록 주파수를 사용한다.
- Dynamic - 현재의 CPU 활동량에 따라 ESX 서버가 스스로 적절히 동적으로 클록 주파수를 변경할 수 있다. 이는 전력 효율성을 우선으로 하는 방법으로, CPU 성능 요구치가 증가할 수록 성능 자체를 해하지 않도록 스스로 최적화된 클록 주파수로 변경한다.
NUMA
SMP(Symmetric Multi-Processing) 환경에서 CPU 간 메모리 공유 문제로, 메모리 버스와 컨트롤러의 성능이 더 중요해 지면서, MCH(Memory Controller Hub) 성능의 개선이 필요해 졌다. 이에, NUMA(Non-Uniform Memory Access)는 CPU 자체에 메모리 컨트롤러 기능을 추가하여 하나의 Node 역할을 하게 하고, 각 CPU가 고속으로 자신에게 할당된 메모리를 직접 접근할 수 있게 한다.
VMkernel은 하나의 가상 머신이 실행되면 NUMA의 한 개 노드에 할당하고, 이후 생성되는 VM들도 라운드 로빈(Round-Robin) 방식으로 각 노드에 순차 할당한다. 이에 따라, 전체 시스템의 워크로드가 분산되며, 2초에 한 번씩 노드의 밸런스 상태를 확인하여 VM이 전체 노드에 균등하게 분배될 수 있도록 이동시킨다.
Binary Translation/Direct Execution
모든 x86 CPU에는 크게 사용자 모드(User Mode)와 커널 모드(Kernel Mode)가 제공된다. 사용자 모드에서는 사용자 프로세스나 일반적인 애플리케이션이 작동하며, 커널모드에서는 운영체제 핵심 커널이 하드웨어 장치를 직접 제어한다. 이때, 사용자 모드의 프로세스나, 애플리케이션들은 하드웨어에 접근하기 위해서 반드시 커널 모드의 허락을 받고 사용해야 한다. 이러한 권한과 관련하여 x86 CPU에서는 아래의 4단계 레벨을 설정해 두었다.
가장 권한이 높은 Ring 0에는 운영체제의 커널이 위치하며, 일반적으로 하드웨어를 직접 접근하고 조종할 수 있는 권한을 갖게 된다. 가장 권한이 낮은 Ring 3 사용자 모드의 일반 애플리케이션이 하드웨어에 접근하기 위해서는 Ring 0에 위치한 커널의 허락을 받아야 한다. 한편, 가상 머신의 게스트 운영체제는 위의 Privilege Level 중 Ring 1이나 2에서 실행시킨 후 Ring 0에 위치할 VMM이 명령을 가로채어 에뮬레이션화 해줄 수 있겠지만, 메인프레임 가상화 시스템이 아닌 경우 이러한 Deprivileging이 불가능하다. 이때, 게스트 운영체제에서 CPU 하드웨어에 직접 명령을 던져야 하는 프리빌리지 코드들을 바이너리 변환(Binary Translation) 하여 중간에 가로채어 에뮬레이션화 할 수 있으며, 하드웨어에 직접 접근이 필요 없는 사용자 레벨의 코드는 직접 실행(Direct Execution) 기법으로 가상화 환경을 구현할 수 있다.
Intel VT-x와 AMD-V의 등장
가상화 환경을 위해 만들어진 시스템이 아닌 경우, VMware 같은 회사들이 소프트웨어적인 기법으로 가상화를 구현해 냈는데, 2006년 인텔과 AMD에서 기존 x86 CPU의 보호 모드(Protected Mode)에 있던 프리빌리지 레벨에 변화를 준다. 기존 Ring 0~4 레벨 체계를 'Non-Root' 모드로 규정하고, 새로운 Ring -1을 만들어 이를 'Root' 모드로 지정하였다. 이에 따라, 게스트 운영 체제에서는 Ring 0에서 하드웨어 CPU에 직접 명령을 내릴 수 있고, VMM은 Ring -1 레벨로 스위치 되었다.
Full Virtualization 과 Paravirtualization
가상화 시장은 Full Virtualization과 Paravirtualization으로 양분되어 있는데, 전자의 대표격은 VMware이며, 후자의 대표격은 시트릭스사의 젠서버이다. 이때, 완전 가상화 방식으로 작동되는 게스트 OS는 자신이 H/W를 독점하여 사용하고 있다고 착각하므로, Binary Translation과 직접 실행 방식과 같은 기술을 통해 CPU 명령을 가로채어 변환시켜야 하는 오버헤드가 발생한다. 한편, 반자동화 방식의 경우, 하이퍼바이저가 인식할 수 있는 특별한 시스템 콜 명령(Hypercall)을 가지고 있는 게스트 운영체제에서만 작동 가능하나, CPU에게 직접 명령을 전달한다는 점에서 완전 가상화보다 H/W에 근접한 성능을 뽑을 수 있다.
이때, 반가상화 방식에서는 게스트 운영체제들이 하이퍼바이저와 통신하기 위해 특별한 시스템 콜을 가져야 하는데, 커널 컴파일이 가능한 Linux 운영체제의 경우, 이러한 반가상화 용 커널로 변환하여 사용이 가능했으나, Windows에서는 사용이 불가능하다는 한계가 있었다. 이러한 상황에서, VMM이 Ring -1로 빠지면서 게스트 OS가 Ring 0에서 제약 없이 하드웨어 접근 권한을 갖게 되면서, Windows 게스트 운영체제 역시 별도 커널의 수정 없이 바로 작동이 가능해 졌다.
또한, Linux 운영체제 역시 컴파일한 커널이 일반적인 하드웨어 위에서 바로 작동이 안 되는 불편함이 있었는데, 새로운 VMI(Virtual Machine Interface) 규약에 따라, 일반적인 하드웨어 시스템 위, 또는 가상 머신 위 환경에서 커널의 재 컴파일 없이 바로 사용이 가능해 졌다.
Data Science / DevOps TIL-log
학부생 때는 Data Science 공부하다가, 회사에서는 (어쩌다보니) DevOps를 하고 있는 사람의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 b + :)
'DevOps > #Infra' 카테고리의 다른 글
[Infra] 인사이드 VMware vSphere (3) (0) | 2024.05.17 |
---|---|
[Infra] 인사이드 VMware vSphere (2) (0) | 2024.05.17 |
[Infra] 인사이드 VMware vSphere (1) (0) | 2024.05.17 |
[CI/CD] Cloud Native Application의 구성요소 (0) | 2022.12.19 |
[SAP PI] EAI(Enterprise Application Integration) (0) | 2022.12.09 |