CPU 가상화
가상 머신도 엄연히 CPU를 지니고 있지만, 실제로 이러한 가상 머신 내의 게스트 운영체제에서 발생하는 모든 프로세스들은 전부 물리적인 CPU에서 처리가 이루어진다. 제2장에서 언급한 것처럼, 게스트 운영체제에서 발생하는 CPU 프로세스들은 VMkernel의 VMM을 통해 실제 물리적인 CPU로 프로세스 처리가 이루어질 수 있도록 전달된다. VMkernel은 모든 가상 머신들에게 발생하는 CPU 프로세스들을 기본적으로는 최대한 균등하게 분배될 수 있도록 전체 물리적인 CPU 리소스를 적극적으로 스케줄링한다.
VMekrnel은 모든 가상 머신에서 발생하는 프로세스들을 물리적인 CPU에 골고루 할당하여 처리한다. 이때 전체 물리적 CPU 리소스들에 과도한 부하가 발생하지 않도록 VMkernel은 이른바 Time-slice(시분할) 방식을 통해 프로세스를 처리하도록 노력한다. 기본적으로 VMkernel은 20ms 단위로 물리적인 CPU 상태를 확인하면서 한가한(Idle) CPU가 없는지 확인하며, 가상 CPU와 물리적인 CPU 간의 연결 작업을 진행한다.
흔히 CPU-bound 애플리케이션들, 즉 명령을 처리하는 데 있어서 사용자 또는 외부 장치와의 입력을 기다리거나, 그리고 데이터 추출을 위해 다른 프로세스를 처리할 수 있게끔 여유를 갖춘 애플리케이션이 아닌 순수하게 CPU 연산 작업만을 처리하는 데 있어 오랜 시간을 필요로 하는 애플리케이션들이 작동하는 가상 머신들이 있다. 그런 경우, 어디까지나 모든 가상 머신들이 충분히 균등하게 물리적인 CPU를 활용할 수 있도록 노력해야 하는 ESX 서버 입장에서는 그다지 환영할 만한 일은 아니다.
멀티코어 프로세서
현재 시장에서는 쿼드코어, 헥사코어, 옥타 코어 등 멀티코어 프로세서가 주류를 이룬다.
예를 들어 듀얼코어 2 소켓 CPU의 경우 ESXi 서버는 총 네 개의 논리적 프로세서 단위로 인식하고, 그 위에 가상 CPU를 할당하여 사용한다. 그렇기 때문에 두 개의 가상 CPU(가상 SMP)를 가지고 있는 가상 머신의 경우 동일한 소켓 안의 멀티코어에서 프로세스가 처리되는 경우도 있지만, 각각 다른 소켓의 코어에서 프로세스가 처리되는 경우도 있다.
정리하면, 물리적인 멀티코어 프로세서가 장착된 호스트 시스템에 ESXi 서버가 설치가 될 경우 최대한 모든 소켓의 코어에 균등하게 분배하여 가상 CPU가 할당될 수 있도록 노력하는 것이 기본적인 작동방식이다.
하이퍼스레딩
하이퍼스레딩(Hyperthreading)은 운영체제가 물리적인 한 개의 CPU를 두 개의 논리적인 CPU처럼 인식하여 작동하게끔 해주는 기술이다. 하지만 모두 알다시피, 듀얼코어의 경우 연산 라인(Instruction pipeline)과 실행 라인(Execution pipeline)이 각각 두 개씩 포함되어 있다. 그와 달리 하이퍼스레딩 기능만 가지고 있는 싱글코어의 경우는 연산 라인만 두 개이며, 실행 라인은 한 개에 불과하기 때문에, 하이퍼스레딩을 사용한다고 해서 성능이 두 배로 뛰어오르는 것은 아니다. 기본적으로는 연산 라인이 두 개이기 때문에 하이퍼스레딩 기능이 작동하지 않는 경우와 비교하면 데이터 입력의 경우는 이론적으로 빠를지 모르나, 데이터 출력을 담당하는 실행 라인이 어차피 하나이기 때문에 커다란 성능의 효과를 기대하기 힘들다. 게다가 CPU 내부의 캐시 메모리도 같이 공유하기 때문에 특정 애플리케이션의 경우 성능이 오히려 더 저하되는 경우도 발생할 수 있다.
ESXi 서버 역시 하이퍼스레딩을 지원한다. 하이퍼스레딩 기능이 설정된 경우, ESXi 서버는 그것을 전부 논리적 프로세서 단위로 인식한다. 이를테면 쿼드코어인 CPU를 네 개 장착한 시스템에 하이퍼스레딩을 사용하게끔 설정한 경우 ESX 서버에서 인식하는 논리적 프로세서 단위는 총 32개가 된다. 이때 ESXi 서버에서 인식하는 논리적 프로세서 순서는 코어 순서대로이다. 즉, 첫 번째 코어에서 CPU 0번과 1번을 인식하며, 두 번째 코어에서 CPU 2번과 3번을 인식하는 순서이다.
기본적으로 ESXi 서버는 가상 CPU를 모든 소켓의 코어에 균등하게 분배될 수 있도록 노력하기 때문에, 하이퍼스레딩이 설정되어 있는 경우에도 마찬가지로 가능한 한 동일한 하나의 코어에 가상 SMP머신이 할당되지 않도록 소켓 단위 또는 코어 단위로 분산시켜 할당한다. 그렇지만 이러한 분산 방식에 있어서도 항상 고정적인 것은 아니며, 가상 머신별로 아래의 세 가지 설정을 통해 논리적 프로세서들을 어떻게 할당받아 사용할 것인지 결정할 수 있다.
• Any - 기본적인 방식이며, 모든 가상 머신들은 하이퍼스레딩이 설정된 동일한 코어를 다른 가상 머신과 함께 공유하여 사용하도록 한다.
• None - 가상 머신이 일단 하나의 코어를 사용하고 있다면 다른 가상 머신들이 동일한 코어의 논리적 프로세서를 사용하지 못하도록 같은 코어 내의 다른 로지컬 프로세서를 Halt 상태로 떨어뜨려 버린다.
• Internal - None과 동일한 방식이다. 만일 SMP로 구성된 가상 머신의 경우, 같은 가상 CPU가 동일 코어 내의 논리적 프로세서를 사용하고자 할 경우에는 예외로 허용한다. 즉, 이 옵션은 SMP 가상 머신에서만 설정할 수 있다.
일반적인 환경에서는 None이나 Internal 옵션을 선택할 일이 전혀 없으나 간혹 캐시 공유 문제로 인해 애플리케이션의 성능이 과도하게 저하될 경우 이러한 옵션 변경을 통해 테스트를 시도해 보는 경우가 존재한다. 하지만 이러한 옵션 선택은 아주 신중해야 한다. 실제 서비스 운영 환경에서는 충분한 테스트와 검증을 통한 이후에만 적용해야 한다.
'⫸VMware' 카테고리의 다른 글
VMware 리소스 가상화 - 메모리 가상화 구현 기술 (0) | 2022.10.04 |
---|---|
VMware 리소스 가상화 - 메모리 가상화 (0) | 2022.10.03 |
VMware ESXi 서버구조 - VMkernel (0) | 2022.10.02 |
VMware의 기능 소개(HA, Fault Tolerance, 기타 기능) - ② (0) | 2022.10.02 |
VMware의 기능 소개(VMotion, Storage VMotion, DRS, DPM)-① (0) | 2022.10.01 |