Ali Raza, 외 10명, Orran Krieger
EuroSys '23: Eighteenth European Conference on Computer Systems

개요

Unikernel의 단점을 극복하기 위해서 Linux Kernel그 자체를 간단한 설정으로 Unikernel로 만들 수 있도록 하였다.

Motivation

General-purpose operating systems들은 Specialization이란 문제가 있었다. 이러한 문제를 해결하기 위해서 Unikernel와 같은 방식을 통해서 커널을 특정 Application에 맞추어서 Specialization하려는 노력들이 있어왔다.

Importance

Unikernel과 같은 경우에는 적용 대상이 한정되고, Fork나 Clone을 허용하지 않으며, GPU나 FPGA와 같은 가속기를 사용하지 못한다는 단점이 있었다. 또한 Unikernel를 사용하기 위해서는 General-purpose OS의 소스 코드를 많이 수정하거나 아니면 새로운 OS를 만들어내야 하는 노력이 필요하였다. OS만 수정하는 것이 아니라, Application도 상당 부분 수정하거나 Porting하는 노력이 필요하였다. 기존에 Linux Kernel를 재활용해서 Unikernel을 만들고자 하였던 Research들은 Application와 Kernel code가 같이 Linking되어서 Specialization이 이루어지도록 하지 못하였다.

Main Idea

리눅스에 Unikernel Mode로 동작할 수 있는 새로운 설정을 주고, System call은 Function call로 대체해서 Application이 Kernel mode위에서 돌아가도록 하였다. 또한 Unikernel과는 다르게, 여러개의 Process를 허용하며, Address space layout이 커널과 Application이 구분되고, 커널과는 분리된 Execution model을 가지도록 설계되었다.

Design

Multiple processes
UKL은 커널에서 특정 Application이 Unikernel모드로 동작하고 다른 Application들은 모놀리틱 커널 위에서 동작하도록 할 수 있다. 또한 UKL은 Unikernel Application이 Clone과 Fork를 할 수 있도록 하였다.
Address space layout
Linux kernel과의 Compatibility를 위해서 UKL은 Virtual address space를 구분하였다. 이때 User의 Heap, Mmap, Stack, VDSO와 같은 영역들은 User virtual address에 매핑되지만, User code와 data영역은 Kernel과 같이 링킹됨으로 커널에 매핑되는데 이는, Application코드가 매우 큰 경우 많은 영역이 Pinned되는 문제가 생기게 하였다.
Execution model
UKL의 Application은 Preemptable이고, Application-specific library를 Static linking으로 해서 사용해야 한다. UKL은 Binary source code를 직접 돌릴 수는 없는데, 이는 -mno-red-zone그리고 -mcmodel-kernel이라는 GCC flags를 사용해서 커널 Address space에서 돌아가도록 해야 하기 때문이다.
Optimization
Application 개발자는 UKL이 제공하는 Library, Configuration options들을 통해서 편하게 Linux kernel의 Optimization을 수행할 수도 있으며, 혹은 직접 커널의 함수를 부르거나 수정함으로서, Optimization을 수행할 수도 있다. 예를 들어서 Kernel stack과 User stack을 공유하거나, Iret을 Ret으로 바꾸는 등의 Optimization을 설정으로 사용할 수 있으며, VFS스택을 타지않는 Helper functions들을 제공되는 Library을 통해서 직접 사용할 수도 있다.

Contribution

Unikernel의 단점으로 계속 거론되던, Porting efforts를 극복하는 방법으로서 Linux커널의 코드 베이스를 재사용하는 방법을 제시함. 이를 통해서 큰 Porting efforts없이 Application의 성능을 최대 40%까지 올릴 수 있음을 보임. 또한 기존의 Unikraft와 같은 시스템과 비교해 보았을 때도, 만족할 만한 성능 향상을 보임. 그러나 대부분의 경우에 Application specific한 Policy를 구현하기 위해서 Unikernel을 사용하는데, 이러한 경우에는 포팅하려는 노력이 필요할 것으로 생각됨. 또한 Unikernel은 FaaS와 같은 데서 주로 사용하기 때문에 빠른 Booting time이 요구되는데, 이러한 실험 분석이 없음. 그리고 느릴것으로 예측됨. 그리고 보안 측면에서도, Unikernel은 커널 크기를 줄이고, Type safety한 언어를 쓰는등, 커널의 TCB를 줄이기 위한 노력들이 있었음. 그러나 UKL과 같은 경우에는 그러한 부분에서 부족할 것으로 생각됨. UKL은 그러나, Linux kernel로 Practical한 Unikernel을 만들기 위해서 필요한 Implementation details과 Optimization points들, 그리고 기존 X-Container나 Lupine과 같은 related work에서 다루지 못하였던 Kernel-User Integration과 같은 문제를 해결하여서, Practical한 Unikernel의 모델을 보여줌.