ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPDK] SPDK Structural Overview
    논문 정리/Vertical optimization 2019. 10. 3. 02:11

    Overview

    SPDK의 코드는 lib 폴더의 C 코드들과 include/spdk 폴더의 공용 인터페이스 헤더파일, 그리고 이를 사용하는 몇 가지의 애플리케이션 집합들로 구성되어 있다. 사용자들은 SPDK의 C 라이브러리만 가져다가 원하는 소프트웨어를 만들 수도 있고, 이미 만들어진 SPDK 애플리케이션들을 사용할 수도 있다.

    앞서 설명했듯이 SPDK는 lock을 회피하고 message passing 기법을 이용하는 방식으로 설계되었으며, 이로인해 대부분의 SPDK 라이브러리들은 이를 사용하는 애플리케이션의 기본 스레드 모델에 대해 몇 가지 가정을 한다. 그러나 최대한 특정한 message passing, event, co-routine, light-weight threading framework에 얽매이지 않도록 노력하고 있다. 이를 달성하기 위해 SPDK는 include/spdk/thread.h 에서 정의하는 추상 쓰레드를 구현한 lib/thread의 추상화 라이브러리를 사용한다. 어떤 프레임워크를 사용하더라도 SPDK의 추상화된 쓰레드를 초기화 할 수 있으며, 콜백 기능을 이용하여 SPDK가 원하는 기능을 구현할 수 있다 .자세한 내용은 Message Passing and Concurrency Theory 를 참조하자.

    SPDK의 대부분의 동작들은 POSIX를 기반으로 한다. POSIX가 지원되지 않는 환경에 쉽게 이식할 수 있도록 하기 위해, 실제 POSIX를 사용하는 헤더파일들을 include/spdk/stdinc.h 에 분리해두었다. 이외에도 PCI 장치 번호를 부여하거나 DMA를 위한 메모리를 할당하는 작업등의 POSIX가 지원하지 않는 동작들도 필요하다. 이러한 추가적인 동작들은 env라고 불리는 별도의 라이브러리로 구현하였으며, 헤더파일은 include/spdk/env.h 에서 찾을 수 있다. 기본적으로 SPDK는 DPDK 기반의 라이브러리를 통해 env 인터페이스를 구현한다. 기본 구현은 언제든지 대체될 수 있으며, SPDK Porting Guide 에 자세히 설명되어 있다.

    Applications

    최상위 디렉토리에는 SPDK를 사용하는 완전히 독립적인 애플리케이션이 존재한다. 기본 애플리케이션들에 대해서 알아보고 싶다면 An Overview of SPDK Applications를 참조하자.

    SPDK 기본 애플리케이션들은 보통 몇 가지의 환경설정 옵션들과 함께 사용되며, 애플리케이션의 전체 환경설정을 위해서 JSON-RPC를 사용한다.

    Libraries

    lib 폴더에 실제 SPDK가 제공하는 기능들이 구현되어 있다. 모든 구성요소들은 C 라이브러리이며 lib 폴더의 하위폴더로 존재한다. 아래의 두 가지는 가장 대표적인 라이브러리 이다.

    Documentation

    doc 디렉토리에는 SPDK와 관련한 모든 문서가 있다. Doxygen을 사용하요 코드에서 곧바로 생성된 API 문서와, 일반적인 문서들과 Doxygen을 위한 설정파일도 같이 포함되어 있다.

    해당 폴더의 문서들을 보기 좋은 하나의 문서로 변환하고 싶을 경우 doc 폴더 내에서 make를 수행하면 된다.

    Examples

    examples 폴더에는 사용자들이 참고할 수 있도록 만들어진 예제 코드들이 들어있다. 최상위 폴더에 존재하는 application들은 하나의 기능을 수행하는 하나의 프로그램이기 때문에 곧바로 사용될 수 있지만, example 폴더의 예제들은 그렇지 않다. 예제들은 SPDK 기능의 일부분을 보여주기 위해 완전히 조작된 시나리오에서 동작하거나, 하나의 독립적인 애플리케이션이라고 불리기는 어려운 정도의 코드들이다.

    이 코드들이 SPDK를 이해하고 사용하는 데 가장 큰 도움이 될 수 있으며, 기본적으로 examples/nvme/hello_world 를 살펴보도록 하자.

    Include

    include 폴더는 모든 헤더파일들이 위치해 있는 곳이다. 공용 API들은 include/spdk 에 존재하며, SPDK를 사용하는 앱들은 해당 폴더의 내용만을 참조하면 된다. 실제로 사용할 때는 include path에 include를 등록하고 코드 내에서는 spdk/nvme.h 와 같이 spdk prefix 로 사용하길 추천한다.

    #include "spdk/nvme.h"

    대부분의 헤더파일들은 lib 폴더에 구현된 라이브러리들의 이름과 상응하며, 몇가지 추가적인 헤더파일들이 존재한다. 아래는 추가적인 헤더파일의 목록이다.

    • assert.h
    • barrier.h
    • endian.h
    • fd.h
    • mmio.h
    • queue.h and queue_extras.h
    • string.h

    spdk_internal 폴더는 SPDK의 라이브러리들이 공통적으로 사용하는 기능들에 대해 정의하고 있으며, 공용 API가 포함되어 있지 않기 때문에 사용자의 시스템에 설치 되지 않는 헤더파일들을 포함하고 있다.

    Scripts

    scripts 폴더는 여러 작업들을 편하고 수행하도록 도와주는 스크립트들을 포함하고 있다. 가장 많이 사용되는 두 가지 스크립트는 astyle과 pep8을 사용하여 C, C++, Python의 코딩 스타일이 SPDK의 코딩 컨벤션과 일치하는지 체크하는 check_format.sh 와, 커널 장치를 SPDK로 사용하는 데 기초작업을 수행하는 [setup.sh](http://setup.sh) 이다.

    Tests

    test 폴더는 SPDK의 구성요소들에 대한 테스트를 포함하고 있으며 하위 폴더들은 전체 코드 저장소의 구조를 반영하는 상태이다. 테스트들은 유닛 테스트와 기능 테스트의 집합이다.

Designed by Tistory.