IT/Virtualization

Xen - CPU 가상화

jk.jeong 2015. 1. 13. 18:05

Xen CPU 가상화


1. 가상 머신 모니터? (Virtual Machine Monitor) 

- 가상 머신을 모니터링하는 소프트웨어 계층. 단순 모니터링 뿐만 아니라 하드웨어 자원 관리, 가상 머신 스케쥴링 등 가상 머신을 동작시키는 데 필요한 모든 작업을 담당.

1.1 왜 가상화인가?

-  Server Consolidation? 최초 물리 서버 머신 하나가 다수의 CPU와 대량의 메모리를 갖출 수 있게 되면서 많은 자원이 유휴 상태로 남는 경우가 많아, 이런 유휴한 상태의 서버를 머신 하나로 통합 관리하자는 요구가 생김. 가상화 기술을 이용하면 물리 서버 하나를 가상 머신 하나로 대체하고 이 가상 머신 여러 대를 강력한 성능을 가진 물리 머신 하나에서 동작시켜 시스템 자원의 효율성을 극대화.

- Isolation? 가상 머신의 격리? 웹 서버, DB서버, DNS서버 등 여러 서버를 하나의 머신 위에 동작시켜도 되지만 이를 나누어 독립된 가상 머신에서 수행시켜 줌.

- 클라우드 서비스

1.2 하이퍼바이저 종류

  1.베어메탈                                                                       2. 호스트 기반

 1) 베어메탈 방식은 하드웨어 전원이 들어오면 가장 먼저 하이퍼바이저가 부팅을 시작하게 되고, 부팅을 완료하면 관리자가 가상 머신을 생성해서 여러 개의 가상 머신이 동작. Xen/VMWare/Hyper-V

 2) 호스트 기반 방식은 호스트 운영체제가 존재하고, 그 위에서 하이퍼바이저가 동작하며 다시 그 위에 게스트 운영체제가 동작. VirtualBox/KVM 


2. CPU 가상화

2.1 에뮬레이션과 직접 실행?

- ex) 안드로이트 플랫폼의 x86 아키텍쳐인 PC에서의 실행. 에뮬레이터는 안드로이드 ARM 바이너리 이미지를 스캔해 역어셈블 과정으로 ARM 명령어를 추출. 그런 다음 추출해 낸 ARM 명령어를 x86에서 동작할 수 있도록 번역하여 소프트웨어로 만들어진 가상 머신 위에서 동작하게 함. 에뮬레이션로의 실행은 머신이나 디바이스에서 실행하는 것 보다 성능이 저하. 

- 직접 실행(Direct Execution)은 에뮬레이션의 단점을 극복하고자 바이너리 프로그램을 번역과정 없이 직접 CPU에서 실행하는, 즉 가상화 환경이 아닌 것처럼 바이너리 프로그램을 CPU가 직접 실행하게 하는 것.

2.2 특권 모드& 비특권 모드

- Privileged mode: 일반적으로 응용 프로그램은 비특권 모드에서 실행되고, 운영체제 커널은 특권모드에서 실행.

- 운영 체제는 시스템 전체를 관장하며, 하드웨어를 보호하고 관리. 어플리케이션이 하드웨어에 직접 접근할 수 없게하고, 원하는 서비스를 시스템 콜을 통해 요청하도록 규정. ex) 어플리케이션이 파일에서 데이터를 읽으려면 프로그래머는 read()라는 시스템 콜을 호출하며, 운영체제는 디스크에서 직접 데이터를 읽어 어플리케이션에 전달.

- 특권 모드와 비 특권모드를 명확히 구분하지 않으면 악의적인 프로그램이나 프로그래밍 실수로 시스템 전체의 안정성을 위협할 수 있음.

2.3 특권 명령 및 트랩

- 특권 명령은 특권 모드에서만 실행 가능한 명령어를 의미. Trap는 0으로 나누기나 디버거를 위한 중단점 등과 같이 특정 이벤트를 만나면 프로그램의 제어권이 트랩 핸들러로 넘어가는 것을 의미.

2.4 전통적인 하이퍼바이저 구현 방법

- 트랩과 에뮬레이트 방식을 통해 구현. 하이퍼바이저는 하드웨어 하나에 여러 개의 운영체제를 동작하게 하는 것이 주된 의무이므로 운영체제보다 더 높은 특권이 필요. 운영체제와 하이퍼바이저가 모두 특권 모드에서 동작한다면 여러 개의 운영체제가 동시에 특권 명령으로 하드웨어 자원에 접근할 수 있어 시스템 오류를 가져올 수 있음. 하이퍼바이저는 특권 모드에서, 운영체제는 비특권 모드에서 실행 됨. 비 특권 모드에서 동작하는 운영체제가 특권 명령을 실행할 때마다 트랩이 발생해 하이퍼바이저로 제어권이 넘어가며, 하이퍼바이저는 적절히 관련 루틴을 에뮬레이트하고 다시 제어권을 운영체제로 넘겨 줌.

2.5 바이너리 변화과 하이퍼 콜

- 바이너리 변환(VMware)은 운영체제의 코드 이미지를 하이퍼바이저가 스캔해 특권 명령과 비특권 명령의 경계가 모호한 명령어들 때문에 발생하는 오류 명령어를 찾아내고 검출. 그리고 해당 명령어를 적적히 수정하여 잘 동작할 수 있는 코드를 만들어 실행. CPU에서 직접 실행하는 방식이지만 중간에 하이퍼바이저가 번역하는 과정이 추가 됨.

- 하이퍼 콜은 반가상화 기술의 일종이며 Xen에서 사용하는 방식으로 번거롭지만 직접 운영체제의 소스를 수정하여 문제의 소지가 있는 명령어를 제거. 하이퍼바이저로 호출할 수 있는 하이퍼 콜로 바꾸어서 문제의 소지가 있는 명령어가 실행될 시점에 하이퍼바이저로 제어권이 넘어가게 됨. 하이퍼바이저는 게스트 운영체제의 요청을 받아서 적절히 처리한 다음 다시 게스트 운영체제로 제어권을 넘김.

2.6 하드웨어 지원

- 가상화 기능을 CPU에 추가 시킴. 인털의 VT-x, AMD의 SVM(Secure Virtual Machine) 벤더마다 약간의 아키텍쳐적인 차이점은 있겠으나 전반적임 개념은 비슷. 게스트 운영체제의 소스 코드를 수정하거나 바이너리 변환 방법 없이도 트랩과 에뮬레이트 방식으로 하이퍼바이저를 구현할 수 있도록 하드웨어적인 기능을 추가.

    인텔 VT-x : 하이퍼바이저를 위한 root모드와 게스트 운영체제를 위한 non-root모드. 게스트 운영체제는 non-root모드의 특권 모드에서 동작, 어플리케이션은 non-root 모드의 비특권 모드에서 동작. 문제가 될 수있는 명령어가 non-root 모드에서 실행되면 트랩이 발생하고 root모드로 변경되어 하이퍼바이저로 제어권이 넘어가도록 구현.

3. Paravirt Operation & 하이퍼 콜

3.1 반가상화(Para Virtualization)

- 운영체제의 소스 코드를 수정해서 가상화 구현. 이를 통해 운영체제와 하이퍼바이저 사이의 협력을 극대화한 가상화 시스템의 고성능화를 구현.

- Xen: 하이퍼 콜 인터페이스, VMware: VMI인터페이스, 

3.2 Paravirt Operation

- 가상 솔루션 벤더마다 반가상화 인터페이스를 따로 만들어 리눅스 커널을 수정 -> 소스코드의 복잡성과 관리 문제

- 해결을위해 리눅스에서 공통 API를 제공하고 각 하이퍼바이저 벤더는 여기에 맞춰 인터페이스를 제작할 수 있도록 구현한 것이 Paravirt Operation(Pv-ops)

 

- 리눅스 커널의 가상화는 필요한 루틴에 공통 API를 만들어 여기에 하이퍼 콜 혹은 VMI인터페이스를 연결하는 방식으로 구현. 최초 Xen은 리눅스 2.6.18 커널을 대폭 사정하여 Xen Linux를 만들었고 이를 Pv-ops에 맞도록 포팅. 


1. 코드 Paravirt Operation 자료 구조.txt

* 첨부 참조 *

- paravirt_patch_template라는 구조체는 기능별로 세부 ops 구조체를 가지며 pv_cpu_ops 구조체는 CPU와 직접적인 관련이 있는 명령의 모임. read/write cr0, cr4 같은 명령어는 paravirt operation으로 대체할 수 있음, CR0와 CR4레지스터는 x86아키텍쳐에서 주요한 시스템 플래그를 모아놓은 Control Register이고, 페이징 활성화, 캐시활성화, 세그멘테이션 활성화 등 주요 설정을 할 수 있는 레지스터.

...

중 략 (추후)

...


3.3 하이퍼 콜

- Xen의 Hypercall 인터페이스는 일반 운영 체제의 시스템 콜과 방법이 비슷함.

1) x86아키텍쳐에서 리눅스가 시스템 콜을 호출하는 방법

- 프로그래머가 시스템 콜을 사용할 때는 보통 glibc와 같은 라이브러리를 통해서 호출. 이때 사용자가 호출하는 것은 실제 시스템콜이라기 보다는 라이브러리에서 제공하는 시스템 콜 래퍼(wrapper)함수이며 라이브러리 루틴에서 실제로 시스템 콜을 요청하는 명령어를 사용. 

- Xen에서는 SYSCALL/SYSRET 명령이라도 사용자 프로세스가 호출한 시스템 콜인지 케스트 운영체제가 호출한 하이퍼 콜인지를 구분해서 처리

...

코드

...


4. 하드웨어 지원

- x86아키텍쳐는 포펙과 골드버그의 가상화 요구를 만족하지 않으므로 가상화 프로그램 구현이 복잡. Xen의 경우 특권 명령을 하이퍼 콜로 요청하는 수정한 커널을 사용하는 반가상화를 기반으로함. 윈도우와 같이 커널을 수정할 수 없는 운영체제는 전가상화(Full Virtualization)을 통해서 지원.

- Xen에서의 전가상화는 HVM(Hardware Virtual Machine)을 통해서만 가능.HVM은 CPU에서 가상화 기능을 제공하는 하드웨어적 가상화 기술을 의미.인텔:VT-x / AMD: SVM

- 성능상의 이점과 하이퍼바이저 구현이 쉬워진다는 이유로 HVM을 활용. 

4.1 인텔 VT-x 개요

- VT-x는 가상화를 지원하는 새로운 개념인 VMX Operation이존재- 하이퍼바이저와 가상 머신이 동작하는 환경 구분

- VMX root Operation: CPU나 하드웨어의 모든 제어권을 가진 오퍼레이션.

- VMX non-root Operation: 특정 명령어 실행과 하드웨어 제어권한이 일부 제한된 오퍼레이션 (Virtual Machine)

- VMX root Operation과 non-root Operation이 서로 전환하는 것을 VMX 전환이라고 함.

- VM Entry: VM root오퍼레이션에서 VM non-root오퍼레이션으로 진입하는 VMX 전환

- VM Exit: VM non-root 오퍼레이션에서 VM root 오퍼레이션으로 빠져나가는 VMX전환

- 가상 머신은 VMX non-root 오퍼레이션에서 동작중이더라도 기존 네이티브 시스템과 같다고 인식. 특권 명령을 실행하면 VM Exit가 발생해 VMX root 오퍼레이션으로 전환. 그런 다음 VMX rot 오퍼레이션에서 하이퍼바이저가 특권 명령을 처리한 뒤에는 VM Entry로 다시 가상 머신에 진입.

-  VMX non-root 오퍼레이션의 프로세서 동작은 가상화가 쉽도록 제한. VMX non-root 오퍼레이션에서 가상 머신이 VMCALL과 같은VMX명령어를 실행하거나 특정 이벤트가 발생하면 VM Exit가 발생해 하이퍼바이저로 제어권이 넘가감. 특정 명령어를 실행했을 때 VM Exit가 발생하므로 VMX non-root 오퍼레이션의 동작은 제한적. CPU리소스는 VMX root 오퍼레이션에서 하이퍼바이저가 보두 관리.


4.2 VMX 오퍼레이션 라이프 사이클

1) 하이퍼바이저에서 VMXON명령어를 실행하여 VMX오퍼레이션으로 진입.                                                         2) VMLAUNCH와 VMRESUME명령어를 사용하면 VM Enrty가 발생해 하이퍼바이저는 가상 머신이 동작하는 VMX non-root 오퍼레이션으로 진입.                                                                                                                 3) 가상 머신이 실행 중에 제한되어 있거나 특정 명령어를 실행하거나 이벤트가 발생할 때는 VM Exit가 발생해 하이퍼바이저에 설정된 특정 한 엔트리 지점에 진입. 그러면 하이퍼바이저는 VM Exit가 발생한 원인에 따라 적절히 특권 명령을 처리한 뒤에 다시 가상 머신으로 VM Entry를 발생시 킴.                                                                             4) VMXOFF명령어를 실행해 VMX오퍼레이션을 빠졈 나옴.


4.3 VMCS (가상 머신 제어 구조)

- VMX non-root 오퍼레이션과 VMX전환을 제어하는 용도로 VMCS(Virtual-Machine Control Structure)라는 별도의 자료 구조가 존재. 인텔 VT-x를 사용하는PCPU마다 하나씩 존재하는 VMCS포인터(VMPRT)로 접근. VMPTRST명령어를 사용해 현재 VMSC포인터를 메모리에 저장하고, VMPRTLD명령어를 사용해 VMCS포인터를 설정할 수 있음.

...

VMX 활성화 ( )

...


5. 가상 머신 스케줄링

- 가상화 환경에서는 물리 머신 하나에 여러 개의 가상 머신이 동작. 실제 물리 머신에는 여러 개의 물리 CPU가 존재하고 가상 머신이나 가상의 CPU를 가지게 되는데 이것을 VCPU(Virtual CPU)라고 한다. 

- 가상 머신 스케줄링이란 물리 CPU에서 실행할 VCPU를 어떤 스케줄링 정책을 통해 선택하는 것. 일반 운영체제에서 스케줄러가 CPU에서 동작할 프로세스를 선택하는 과정처럼 가상화 환경에서는 스케줄링 대상이 VCPU가 됨.

- 가상화 환경에서는 다수의 가상 머신을 통합해서 운용하므로 실제 CPU보다 더 많은 VCPU가 존재. 따라서 스케줄럭가 어느 순간에 어떤 VCPU를 얼마만큼 실행시킬지를 결정하는 일이 시스템 전체에 큰 영향을 끼침.


5.1 Xen 스케줄러

...

...


* BOOST 우선 순위

- 운영체제는 I/O 이벤트 방식으로 동작. 하드디스크를 읽으려고 읽기 요청을 하면 하드디스크가 해당 블록의 내용을 전송할 때까지 기다리는 것이 아니고, 다른 작업을 실행하거나 혹은 잠들어 있다가 하드디스크로부터 전송 완료 이벤트(인터럽트)가 발생하면 요청을 실행.웹 서버의 경우 블록 상태 였다가 외부 요청이 오면 이벤트를 받고 깨어나기도 함.

- Xen은 I/O처리를 드라이버 도메인이라는 특정 도메인이 처리. 외부 인터럽트가 발생하면 드라이버 도메인이 깨어나서 해당 인터럽트를 처리. 블록 상태였던 VCPU가 빨리 깨어나서 작업을 실행하면서 시스템 전반적으로 반응 속도가 높아지며, 이렇게 깨어난 VCPU에 한해서 일시적으로 우선순위를 BOOST로 만들면 빨리 스케줄링 되어 실행할 수 있게 만들어 줌.

* 블록 처리

- 게스트 운영체제에서 더 처리할 작업이 없어서 유휴 상태가 되면 하이퍼바이저에 VCPU를 더는 실행하지 말라고 알려 주어야 함. 게스트 운영체제가 반 가상화 상태면 직접 하이퍼 콜을 통해서 하리퍼바이저에 블록 처리를 명령할 수 있고 게스트 운영체제가 전가상화라면 직접 하이퍼바이저에 명령할 수 없으므로 하이퍼바이저 스스로 게스트 운영체제의 halt 명령어를 감지해 블록 상태를 만듦. 운영체제 대부분은 유휴상태가 될 때 x86의 halt 명령어를 실행해 VM Exit를 발생시켜서 하이퍼바이저에 유휴 상태임을 알림. 하이퍼바이저는 VCPU를 블록 상태로 만들고, 스케줄링 이벤트를 발생. 곧 cshed_schedule() 함수 호출 - 블록 상태인 VCPU는 runq에 삽입되지 않으며 깨진 전까지 실행 안 됨.

...

5.6 cpupool

- Xen 4.1 ~ 관리자는 여러 개의 스케줄러를 하나의 머신 위에서 구동. CPU별로 그룹 짓고 특정 스케줄러로 해당 그룹이 동작하게 끔 설정.

- cpupool이 다르면 PCPU가 휴면 상태가 되더라도 다른 cpupool에 할당된 가상 머신 VCPU를 자져와서 실행하지 못함.

- cpupool 자료 구조: 모든 PCPU에는 percpu변수를 통해 해당 cpupool 구조체를 가리키는 포인터가 있음. percpu 변수는 각각 자신이 속한 cpupool을 가리키며 cpupool 구조체는 자신이 가지는 CPU를 스케줄링할 Scheduler 구조체를 가리킴. cpupool_list라는 전역 리스트는 모든 cpupool을 리스트로 엮는다.


출처: Xen으로 배우는 가상화 기술의 이해 'CPU 가상화' 편