가상화와 에뮬레이션, hypervisor, container

일단 에뮬레이션(Emulation)과 가상화(Virtualization)에 대해 알아보자.
에뮬레이션과 가상화 둘다 가상적으로 특정 시스템이 돌아갈 수 있게 하는 것이지만,
에뮬레이션은 기존의 리소스나 하드웨어를 이용하지 않고 소프트웨어적으로 구현하여 특정 시스템을 돌릴 수 있게 하는 것이다.
반면 가상화는 기존의 리소스나 하드웨어를 활용하여 시스템을 돌릴 수 있게 한다.
따라서 성능적인 면에서 가상화가 에뮬레이션보다 뛰어나지만, 가상화가 에뮬레이션보다 범위가 한정되있다고 할 수 있다.
에뮬레이션을 이용하는 것으로는 대표적으로 bochs, qemu가 있다.

 다수의 운영 체제를 동시에 실행하기 위한 논리적 플랫폼을 하이퍼바이저(hypervisor)라고 하는데, 두가지로 분류할 수 있다.
 첫 번째는 native이다. 이는 호스트OS없이 VMM이 하드웨어 위에서 직접 동작하고, 그 위에 여러개의 가상머신(OS+APP)이 동작하는 방식이다. 즉 하드웨어를 가상화하게 된다. VMware ESXi가 이에 해당한다. 이 경우에는 물리적cpu와 가상머신의 cpu가 architecture가 같아야하는등 하드웨어상의 제약이 생긴다. hosted에 비해 당연히 빠르다.
 두 번째는 hosted이다. 이는 호스트OS 위에서 VMM이 동작하는 방식이다. 따라서 이 경우는 물리 컴퓨터의 하드웨어를 에뮬레이트하게 된다. 즉 하드웨어를 에뮬레이션하게 된다. 예를 들면, VMware WorkStation, VirtualBox, Qemu등이 이에 해당한다. 이 경우 호스트pc와 가상머신의 cpu architecture가 같냐 다르냐에 따라 속도가 크게 차이난다. (cpu를 에뮬레이트해야하냐 안해야하냐의 차이가 나므로..)

 native(bare-metal) hypervisor가 하드웨어를 가상화하는 방법에는 전가상화(Full-virtualization)과 반가상화(Para-virtualization)가 있다.
 전가상화는 하드웨어를 완전히 가상화하는 방식이다. 따라서 OS에 제한없이 사용할 수 있는 방식이다. 전가상화 환경에서 특정 machine operation들은 다른 virtual machine에 영향을 끼칠 수 있다. 이런 경우는 hypervisor에 의해 가로채지고 추가적인 시뮬레이션등이 필요하게 된다. 따라서 이에 대한 오버헤드가 발생한다. 하드웨어의 도움을 받아서 이러한 오버헤드들을 줄일 수있는 데 이런 가상화 방식을 Hardware-assisted virtualization이라고 한다. (Intel VT-x, AMD-V 등이 있다)
 반가상화는 하드웨어를 완전히 가상화하지 않는다. 따라서 OS가 동작함에 있어서 escaping등이 일어나지 않도록 memory access에 대해 추가적으로 고려해야하는 등 OS가 추가적으로 신경써야 하는 것들이 생긴다. 그리고 이를 위해 hypervisor가 제공하는 api를 사용하거나 해야된다. 이를 위해서는 OS를 수정해야한다. 따라서 전가상화에 비해 사용에 제한이 있다. 하지만 전가상화 방식에 비해 성능면에서 이점이 있다.

물리적인 하나의 서버컴퓨터에서 여러개의 서비스(서버)를 돌리고 싶을 때 hypervisor 기술을 사용할 수 있다.
하지만 hypervisor 기술을 활용한 서버 가상화의 경우, 하드웨어가 가상화되고, 여러개의 OS가 독립적으로 동작하므로 비효율적일 수 있다. 이를 해결하기 위해서 컨테이너 기술을 기반으로 서버를 가상화하는 방법이 있다.
즉 서비스가 실행되는 환경을 가상화하는 것이다. 
하드웨어는 물론 OS를 공유하고 OS 위에 여러개의 컨테이너들이 올라가서 그 안에서 서로가 격리되어 독립된 환경에서 실행되게 하는 것이다. 물론 이 경우 하나의 OS만 사용가능하다는 단점이 있다. 하지만 hypervisor를 이용한 서버 가상화에 비해 속도가 더 빠른 장점이 있다. 리눅스는 커널에서 이러한 기능들을 제공한다. 그리고 이를 이용한 대표적인 예로서 LXC, docker가 있다.

지금까지 에뮬레이션과 가상화의 개념, hypervisor, 하드웨어 가상화 (전가상화, 반가상화), container를 이용한 서버 가상화에 대해 알아 보았다.
만약 서버 가상화를 한다고 했을 때, 적용 범위가 큰 기술대로 나열하면
emulation (hardware에 상관없음) > hypervisor (OS에 상관없음) > container
순이 될 것이다.
하지만 그 성능은 반대의 순서가 될 것이다.

댓글