멀티커널 연구

매니코어OS
이동: 둘러보기, 검색

연구배경 / 문제점

  • 미래 컴퓨터 시스템이 extreme-scale의 시스템으로의 변화가 예상됨에 따라, 최근 Top-end의 HPC(High Performance Computing)이 다시 연구되고 있다. 하지만 모든 기능을 포함하는 FWK(Full Weight Kernel, 대표:리눅스)는 부가적인 운영체제의 간섭으로 인해 성능이 저하되기 때문에 스케일러빌러티와 장애 허용(fault tolerance)가 필요한 top-end HPC 응용에 적합하지 않다.
  • 따라서 새로운 운영체제의 변화가 필수적이다. 새로운 운영체제는 기존의 운영체제를 개선하는 방식과 근본적으로 다시 개발하는 방식이 모두 가능하다. 하지만 매니코어 환경에서의 extreme-scale 컴퓨팅을 위해서는 기존의 운영체제를 개선하는 방식보다 새로운 하드웨어에 맞춰 새로운 커널을 개발하는 방식이 적합하다. 새로운 커널을 개발하는데 고려사항은 다음과 같다.
    • 매니코어 환경에서 성능의 확정성(Scalability)를 지원해야 한다. 현재 리눅스는 많은 코어에서 실험시 OS 간섭으로 인해 확정성에 문제가 있다. OS 간섭을 줄이고, 자원의 낭비를 줄여 확장성을 지원하는 커널이 필요하다. 
    • 이기종(heterogeneous) 코어를 지원해야 한다. 향후 미래에는 Intel x86, ARM, GPGPU 뿐만아니라 머닌러닝에 사용될 뉴로모픽 칩 등이 개발될 것이며, 이것들이 통합된 매니코어 시스템이 연구될 것이다. 이에 따라 이기종 코어간 응용을 실행 할수 있도록 이를 지원하는 커널이 필요하다. 
    • 전력 관리 기능이 필요하다. 자원 낭비와 같은 개념으로 매니코어 환경에서 많은 코어에 균일한 전력을 공급하기 위해서는 많은 전력이 필요할 뿐만 아니라, 다크 실리콘(Dark Silicon)과 같은 문제를 발생시킬 수 있다. 매니코어 환경에 적절한 전력 관리를 지원하는 커널이 필요하다.

연구내용

멀티커널 (Multi kernel)

  • 멀티커널(Multi Kernel)은 하드웨어에 LWK와 FWK를 함께 적용하여, 기능에 따라 분리하여 활용하는 기술이다.
  • 매니코어 시스템이 발전함에, 많은 코어에서의 확장성(Scalability)과 안정적인 성능을 제공이 요구되었다. LWK (Light Weight Kernel)은 커널의 기능을 최소화하여 매니코어 시스템에서 확장성 및 병렬 성능(parallel performance)를 제공한다. 하지만 여전히 응용에서는 FWK (Full Weight Kernel)인 리눅스의 API를 활용하거나 풍부한 API 들을 사용하고 있다. 기존 리눅스와의 호환성 및 LWK에서 제공하지 않는 API (I/O, system call 등)을 처리하기 위해 FWK 커널 활용이 필요하다.
  • 매니코어 시스템 환경에서는 CPU, 메모리 자원이 충분하기 때문에 가존 자원을 나누어 활용하던 시분할 기법(time sharing)은 적합하지 않다. 이에 따라 응용 프로그램에게 사용할 자원을 지정해주고 커널의 간섭 없이 할당된 자원을 충분히 사용할 수 있도록 공간분할 기법(space sharing) 을 정의하였다. 공간분할 기법을 통해 커널의 간섭과 자원의 낭비를 최소화할 수 있다.
    • One core-One thread - 하나의 스레드를 CPU에 지정하여 스레드가 종료될 때까지 인터럽트 없이 수행됨을 보장한다.
    • One core-One memory - CPU 별로 사용할 수 있는 메모리 영역을 지정하여, 특정 CPU에서 동작 중인 쓰레드가 메모리를 요청할 경우, 지정된 구역안의 메모리만 사용함으로써 코어 간 메모리 경쟁(contention)을 제거하는 기법이다.


Multikernel LWK FWK.png

LWK (Light Weight Kernel)

LWK(Light Weight Kernel, 경량커널)은 커널의 기능을 최소화한, 경량화된 커널이다. (범용으로 활용 가능하도록 모든 기능을 가진 커널을 FWK(Full Weight Kernel)이라고 하며, 대표적으로 리눅스가 있다). FWK는 커널의 간섭으로 인해 코어의 수가 증가함에 따라 성능이 비례적으로 상승하는 스케일러빌러티에 제약이 있다. 이에, LWK는 FWK에서 사용하는 시간 분할(Time Sharing) 기법 대신 공간 분할(Space Sharing)기법을 활용하여 커널의 간섭을 최소화하였다. 시간 분할 기법은 기존 멀티코어 환경에서 CPU, 메모리와 같은 물리적인 자원의 활용성(Utilization)을 극대화 하기위한 기법으로 매니코어 환경에서는 적합하지 않다. 매니코어 환경에서는 많은 자원을 효과적으로 활용한 공간 분할 기법을 통해 코어 수에 대한 성능 스케일러빌러티를 제공한다. 또한 응용 프로그램의 수행을 보장할 수 있기 때문에, 특히 고성능 컴퓨팅 시스템에서 각각의 컴퓨팅 노드가 지니고 있는 CPU, Memory 등의 리소스를 최대한 활용할 수 있다. 따라서 사용자의 병렬화된 애플리케이션에게 예측 가능한 성능을 제공하는 장점을 가진다.

  • LWK의 특징

LWK의 특징으로는 크게 1. 수천 개 이상의 프로세서, 분산된 메모리 구조의 결합형 네트워크를 가지고 있는 병렬 고성능 컴퓨팅 시스템을 타깃으로 적합하며, 2. 확장성을 제공하며, 과학 응용프로그램 같은 특수 응용프로그램에 최적화된 성능을 제공한다. 3. 병렬화된 애플리케이션 및 라이브러리의 개발을 위한 적합한 환경을 제공하며, 4. 범용적인 기능들보다 효율성에 초점을 둠 애플리케이션에 할당될 수 있는 자원의 양을 최대화할 수 있다는 것이다.

LWK는 민첩함(Nimbleness)의 특징이 있다. LWK는 불필요한 커널의 기능을 제거한 최소화된 커널이기 때문에 새로운 하드웨어 특징에 잘 적응할 수 있다는 장점이 있다. 마찬가지로 새로운 메모리 운영 전략(management strategies)을 빠르게 구현 및 테스트가 가능하여 효과적으로 다양한 전략을 적용할 수 있다. 또한 새로운 프로그래밍 모델에 잘 적응하여 전문화된 기능을 제공한다는 것이다. 또한 단순함(Simpleness)을 가진다. 기존 운영체제에서 불필요한 오버헤드를 제거함으로써, 애플리케이션 개발자는 운영체제의 방해 없이 성능과 스케일러빌러티에 집중하여 개발할 수 있다. 프로세스 관점에서는 cooperative, non-preemptive 한 스케쥴링 전략 및 논리 CPU별로 1개의 쓰레드를 수행(one core ont thread)을 제공한다. 메모리 관점에서는 swap을 최소화 하고 논리 CPU에 고정된(pinned) 메모리를 설정(one core-one memory)하여 사용하며, 제공되는 메모리는 모두 물리적으로 연속적인 메모리를 제공한다.

기능 및 구조

LWK는 스케일러빌러티 확보를 위해 커널 단순화 / 공간 분할 기법 적용하였다. 이를 위해 태스크, 주소관리, 쓰레드 스케쥴링, IPC 등 기본 기능을 가지고 있으며 저수준 하드웨어 추상화 기능 (Low-level HW abstration) 지원한다. 스케일러빌러티를 고려한 자료구조(per-core 구조)를 적용하여 Lock 등의 자원 경쟁을 최소화하여 스케일러빌러티를 확보하였다. 이러한 모든 기능들은 매니코어 환경에서의 물리적 자원 특성을 고려하여 구현하였다. 목표 시스템인 Xeon-phi에서 동작시키기 위해 LWK 부팅이 구현되었다.

쓰레드와 스케줄러는 CPU time sharing, idle thread, thread identifier, thread 실행상태 관리, user mode thread와 kernel mode thread 지원, thread suspend 및 resume, thread 자원 회수, thread 정보 관리를 지원한다. 주소관리는 페이지 테이블의 구조 정의, 쓰레드와 address space 관리, 물리메모리 관리, 경량커널과 user thread 분리, kernel thread의 address space 관리, LWK 보호를 지원한다. 타이머는 Thread preemption과 경량커널 내부의 시간 관리를 위해서 타이머 인터럽트를 사용하며, local APIC를 사용하여 커널별로 각각 타이머 관리한다. 하지만 one core-one thread 기능을 통해 타이머와 상관없이 쓰레드는 CPU자원을 충분히 활용할 수 있다.

IPC(Inter Process Communication)기능을 제공한다. 특히, Synchronous IPC 기본 제공 및 프로그래밍 편의를 위한 Aynchronous notification 기능 제공한다. Synchronous IPC를 위한 시스템 호출로 ipc_send(=closed blocking send), ipc_sendnb(=closed non-blocking send), ipc_recv(=closed blocking receive), ipc_wait(=open blocking receive), ipc_call(ipc_send + ipc_recv), ipc_reply(ipc_send + ipc_wait) 제공하며, Asynchronous notification을 위한 시스템 호출로 ipc_notify(non-blocking event notify), ipc_getnotify(non-blocking event check) 제공한다.


LWK의 전체 구조는 아래 그림과 같다.

LWK Structure.jpg

공간 분할 기법

공간 분할 (Space Sharing) 기법이란, CPU와 Memory 가 충분한 매니코어 환경에서 물리적 자원의 활용성(Utility)보다 많은 자원을 효과적으로 분산하여 활용할 수 있도록 응용프로그램에게 사용할 자원에 대해 공간을 분할하고 할당하여 나누어 주고 알아서 사용하도록 하는 기법이다. 이를 통해 응용 프로그램은 자원 경쟁이나 인터럽트 같은 커널의 간섭이나 노이즈 없이 자원을 충분히 활용할 수 있으며 또한 매니코어 환경에서 성능의 스케일러빌러티를 지원할 수 있다. 공간 분할 기법에는 쓰레드가 코어를 독점하여 preemption 없는 동작을 보장하는 one core-one thread 와 core별로 사용할 수 있는 메모리 영역을 지정하며 메모리 연산시 자원 경쟁을 없앤 one core-one memory로 구성된다.

  • One core-one thread

One core-one thread는 쓰레드가 코어를 독점하여 preemption 없이 실행하기 위해 실행될 코어 지정(pinning)하여 수행된다. 분할되어 할당된 자원은 응용 프로그램에서 자체적으로 관리되기 때문에 커널의 인터럽트(타이머 등)에 영향을 받지 않고 응용 프로그램이 종료될 때까지 수행한다.(time quantum/slice를 무제한으로 설정) 하지만, 응용 프로그램이 할당된 코어의 수보다 더 많은 쓰레드를 동작시킬 경우에는 정책에 따라 시간 분할 기법을 활용할 수 있다. 하지만 이는 커널에서 지원하는 기능이 아니고 응용 프로그램 자체적으로 지원되어야 한다.

  • One core-one memory

One core-one memory는 코어별로 사용할 수 있는 메모리 영역을 지정하여 메모리 연산(alloc/free 등)에 자원 경쟁을 없이 수행된다. 메모리에서의 자원 경쟁은 자유 공간(free memory)에서 물리 메모리를 할당/반환 하는 경우(alloc/free)와 가상 메모리를 관리를 위해 페이지 테이블을 업데이트 하는 경우(map/unmap)가 있다.


LWK Memory Structure.jpg


물리 메모리의 할당/반환에 생기는 자원 경쟁을 없애기 위해 코어별로 사용할 수 있는 물리 메모리 영역을 구분하였다. 전체 자유 공간에서 커널이나 공통적으로 사용되는 영역을 구분하고 나머지 부분을 코어별로 사용할 수 있도록 영역을 구분하였다. 매니코어 환경에서는 메모리 역시 충분하기 때문에 코어별로 할당받는 메모리 역시 충분하다. (추후 응용 프로그램 별로 메모리를 할당 하는 기법을 고민 중, Cache line에 맞춰 메모리를 구분해야 하는지 여부 확인 중)


LWK Free Memory.jpg


가상 메모리 관리의 경우는 동일 Task의 다른 쓰레드가 같은 가상 주소를 접근하려고 할 경우에만 페이지 테이블에 대한 자원 경쟁이 발생한다. 이를 해결하기 위해 다른 쓰레드가 같은 가상주소에 접근하지 못하도록 구분하는 방식을 구현하였다. 이를 위해 쓰레드별로 사용할 수 있는 가상 주소 영역을 설정하고, 2MB 나 1GB 단위로만 사용하도록 하여 자원 경쟁을 해결하였다.


공간 분할 기법이 적용된 현재 LWK와 향후 연구 계획은 아래 그림과 같다. 현재 적용된 one core-one thread, one core-one memory 뿐만 아니라, power management, fault handling, virtualization, libOS, support heterogeneous core 의 기능이 추가될 예정이다.


Lwk plan.png

멀티커널 아키텍쳐 및 기능

아키텍처

  • PCIe 버스에 Xeon과 I/O 디바이스(Storage, Network), 다수의 Xeon-phi와 NVMe 가 연결되어 있다. 실제 응용 프로그램은 LWK에서 실행되며 확장성(Scalability)를 제공한다. LWK는 CPU를 독점하면서 응용을 수행시키기 위해 커널의 기능을 최소화하였지만, 응용 프로그램을 동작시킬때 필요한 기능(대표적으로 DISK 사용)은 I/O 오프로딩을 통해 FWK에 요청한다. LWK에서 대상으로 하는 HPC 응용에서는 I/O 는 많이 발생하지 않고 주로 연산(computation) 위주의 작업이기 때문에 LWK가 I/O의 기능을 가지고 있지 않도록 설계하였다.


Multikernel architecture.png

시스템 컴포넌트

Multikernel component.png

I/O Offloading

  • I/O Offloading이란 LWK의 응용 프로그램에서 발생하는 IO를 FWK에서 그 I/O를 수행하고 결과를 LWK의 응용 프로그램에서 사용하는 방식이다. LWK의 응용 프로그램에서 I/O와 관련된 시스템 콜이 발생하면 그 내용을 FWK에서 대기하고 있는 I/O 데몬에 전달하고 요청된 시스템 콜은 I/O 데몬에 의해 수행되게 된다. 수행된 시스템 콜의 결과는 FWK의 I/O 데몬에서 LWK의 응용 프로그램에 전달된다. 응용 프로그램과 I/O 데몬 사이의 데이터 전달을 위한 방식은 응용 프로그램과 I/O 데몬 사이에 SCIF 매핑을 통하여 공유되는 영역을 만들고 공유된 메모리를 기반으로 Circular Queue를 이용하여 통신하는 방식을 사용한다.


Multikernel iooffloading.png

실험 평가

LWK 소스 코드 현황

  • 소스코드 : 58 총 파일, 9,708 총 라인


Lwk kernel files.png

동적/정적 실험

동적 시험

  • 스트레스 시험

스트레스 시험은 부하가 가해진 상태에서의 API 및 시나리오 기반 시험케이스를 실행하여 시스템의 안정성 검증하는 것으로, 별도의 부하 생성 도구를 활용하여 코어 점유율을 증가시켜 시험하였다.

  • 롱런 시험

롱런 시험은 특정 기간 동안 API 및 시나리오 기반의 시험케이스를 반복 실행하여 장시간 운용에 대한 안정성을 검증하는 것으로, 특정 시험케이스를 정의하여 1주일간 반복 시험하였다.

  • 확장성(Scalability) 시험

확장성 시험은 코어 증가에 따라 성능 지표들에 대한 처리량 측정한 것으로, LWK에서는 Address space map/unmap, 메모리 Alloc/Free 에 대하여 코어 증가에 따른 처리량 변화 측정하였다.

아래 측정결과는 코어 증가에 따른, 단위 시간(ms) 당 alloc/free 처리량 측정 결과이다. 코어가 증가함에 따라 처리 성능도 비례하여 증가함을 확인할 수 있다.


Lwk scalability result.png


  • 공간 분할 기법 적용 시험

공간 분할 기법(one core-one thread, one core-one memory)를 적용하였을 경우의 성능 향상 및 스케일러빌러티 확인을 위해 리눅스와의 처리량 변화 비교 측정하였다.

아래 그림은 HPC 쓰레드에 대해, 단위 시간당(sec) 처리량을 공간 분할(LWK)과 시분할(리눅스) 비교 시험이다. 일정코어까지는 리눅스와 LWK가 큰 차이를 보이지 않지만, 코어가 증가할수록 LWK가 좋은 성능을 보임을 확인할 수 있다. 이는 코어가 증가는 환경에서 리눅스는 자원 경쟁으로 성능이 저하되는 반면 LWK에서는 자원 경쟁이 엾기 때문에 상대적으로 좋은 성능을 보인다.


Lwk spacesharing result.png

정적 시험

  • 코딩 규칙 검증

코딩 규칙 검증을 위해 MISRA-C 규칙 중에 중요 규칙을 적용하여 잠재적 결함 검출하였다. 상용 코딩 규칙 검증 도구인 CodeScroll Code Inspector 사용한 결과, 총 681개 위배 발견하여, 도구의 False Alarm을 재외한 모두 수정 완료하였다.


Lwk codeinspector result.png


  • 실행 시간 오류(RTE, Run Time Error) 검증

실행 시간 오류 검증은 SW가 실행 중 오류 또는 시스템 장애를 초래할 수 있는 원인을 문장 의미에 근거해 오류 검출하는 것으로, 상용 RTE 검증 도구인 CodeScroll SNIPER 사용하여 검증하였다. 적용 규칙으로 CWE 658(cwe.mitre.org) 기반 RTE 규칙 적용하였고, 총 2개의 오류를 발견하여, 모두 수정 완료하였다.


Lwk sniper result.png

응용 프로그램 실험(Edge-detection)

  • 테두리 검출(Edge-detection) 응용 프로그램을 통한 확장성 시험

매니코어 테스트베드에서 입력된 이미지의 테두리를 검출(Edge detection)하는 대표적인 HPC 응용 프로그램으로, 코어를 증가시키면서 처리되는 이미지 개수를 통해 확장성 시험


Lwk edge detection.png


아래 그림은 경량커널의 공간분할과 시분할 성능 비교한 결과이다. 코어가 증가할수록 공간분할 기법 성능이 시분할 대비 성능 향상됨을 확인할 수 있다.


Lwk edge detection result.png

멀티커널의 확장성 실험

  • 매니코어 시스템 테스트베드(Xeon-phi, 228코어)에서 멀티커널의 확장성을 사전 검토

대상 응용 프로그램으로는 1조개의 그래프를 처리하는 응용으로 실험 결과 확장성이 보장됨을 확인하였다.(※ EuroSys 2017논문 제출)


1조개의 그래프를 처리하는 응용의 스케일러빌러티 실험 결과

결과물

소프트웨어

매니코어 시스템에서 고성능 컴퓨팅(HPC)을 위한 경량커널(Light weight kernel)

매니코어 시스템에서 고성능 컴퓨팅(HPC)을 위한 경량 커널(Light weight kernel)용 아이오 오프로드

논문

특허

제온파이에서 경량커널을 위한 파일 입출력 Offload 방법 - 제출