spdk 소스 해석 (1)

[섹션 전환 https://www.sdnlab.com/21087.html ]

SPDK 응용 프로그래밍 프레임 워크

SPDK (스토리지 성능 개발 키트, http://spdk.io는 ) 백엔드 스토리지 가속 라이브러리로의 NVMe SSD 응용 프로그램 소프트웨어의 사용을 촉진하는 데 사용, 인텔이 후원한다. 소프트웨어 라이브러리의 핵심은 사용자 모드, 비동기, 구동의 NVMe의 폴링 . 동안 크게 지연의 NVMe 명령 (대기 시간)을 줄일 수의 NVMe 드라이브의 (예 : 리눅스 커널 등)과 비교 커널 IOPS의 단일 CPU 코어를 개선 비용 효율적인 솔루션을 형성하기 위해 가상 호스트 솔루션 SPDK를 사용하여 예를 들어, 그것은 가상 머신의 NVMe I / O를 가속 HCI (하이퍼 통합 인프라) 적용 할 수있다

상기 목적을 달성하기 위해 단지 소스 언어의 NVMe 사용자 모드 드라이버의 일부 기능 또는 동작을 제공하기 위해 충분하지 않다. 일부 시나리오에서는 잘못 사용하는 경우,의 NVMe 사용자 모드 드라이버의 성능을 연주해도 프로그램 오류로 이어질 수뿐만 아닙니다. 기본 기능의 NVMe 몇 가지 지침 있지만, 그러나 재생하기 위해 기본의 NVMe의 성능, SPDK 기반 소프트웨어 개발자를 안내하기 위해 사용되는 프로그래밍 프레임 워크 (SPDK 응용 프로그램 프레임 워크)를 제공하는 더 나은 SPDK 사용자 모드와 사용자 모드 드라이버의 NVMe 블록 층 (사용자 공간 Bdev)의 효율적인 스토리지 애플리케이션을 구성. 사용자는 두 가지 옵션이 있습니다 :

  • (1) 직접 SPDK 애플리케이션 프로그래밍 프레임 워크는 애플리케이션 로직을 구현한다;
  • (2) 더 적합 SPDK의 NVMe 구동 상태를 사용자에게 생각 SPDK 프로그래밍 프레임 워크, 애플리케이션 프로그래밍 로직 변환을 사용.

전반적으로, SPDK 응용 프로그램 프레임 워크는 다음과 같은 부분으로 나눌 수 있습니다 :

  • (1) CPU 코어와 스레드 관리;
  • 2 실 사이의 효율적인 통신;
  • 처리 모델 (3) I / O 로크없는기구의 데이터 경로 (경로 데이터).

 

 

CPU 코어 파이프 스레드 관리

SPDK 큰 목표는 대부분의 작업을 완료하는 데 최소한의 CPU 코어와 스레드를 사용하는 것입니다. 초기화 프로그램에이를, SPDK하는 CPU의 결합은 예를 들어, 구성 파일 또는 명명 된 라인으로 구성 될 수있는 핵의 사용을 제한 시작 -c 0x5을 사용 core0 및 코어 2를 참조하는 커맨드 라인을 사용하여 (현재 spdk_app_start 함수 호출) 프로그램. CPU 사용률의 기능을 결합 CPU 코어 연관하여 고정 될 수 있으며, 각각의 코어에 스레드를 실행하는 스레드가 반응기 SPDK을 지칭한다 (도 1에 도시 된 바와 같이). 현재 라이브러리 환경 (ENV) 여전히 EAL 라이브러리 관리의 기본 DPDK를 사용을 SPDK. 요약하면, 함수는 함수의 몸체를 포함하는 리액터 나사 (_spdk_reactor_run)을 수행하는 동안 (1) {} 함수까지 반응기의 상태가 변경되고, 예를 들면, (spdk_app_stop 통화)에 의해. 효율성을 위해, 전술 한 사이클 (수면)을 해당 CPU 자원에 대한 몇 가지 메커니즘을 가질 것이다. 당시 이러한 메커니즘은 대부분의 경우 100 %,이 시점에 CPU 사용량을 일으킬 수 DPDK 같은과 같이 비교한다.

즉, SPDK 두 개의 CPU 코어를 사용하여 응용 프로그램 프로그래밍 프레임 워크를 가정, 각 코어에 원자로 스레드를 시작합니다. 이러한 방법으로, 사용자가 어떻게 자신의 기능을 수행 하는가? 이 문제를 해결하기 SPDK는 폴러 제공을위한 메커니즘 , 즉 사용자 정의 함수를 디스펜스. SPDK은 폴러는 두 가지 유형으로 나누어 제공 :

  • (1) 폴러를 타이머 기반;
  • (2) 비 타이머 폴러.

반응기 스레드는 대응하는 데이터 구조 (구조체 spdk_reactor) 유지기구 폴러 목록에 대응 SPDK. 예를 들어, 연결리스트 유지 보수 타이머 폴러, 연결리스트 유지 보수 폴러 비 타이머, 그리고 폴러 등록 및 파괴 기능을 제공합니다 . while 루프 리액터, 그것은 사용자가 통화를 따라서 대응하는 기능이있다 폴러 해당 통화의 상태를 확인 멈출 것이다. 단 하나의 CPU 원자로 스레드 때문에, 그래서 메커니즘은 자원을 보호하기 위해 동일한 원자로 스레드의 일부를 잠글 수 없습니다. 물론, 스레드가 다른 CPU 코어에있는 여전히 필요한 통신을해야합니다. 이 문제를 해결하기 위해, SPDK 스레드 사이를 통과하는 비동기 메시지 (비동기 메시징 합격)를 캡슐화합니다.

스레드 사이 하이 패스 편지

SPDK은 기존 잠금 방식의 사용이 덜 효율적 같은 프로그램 때문에, 스레드 간의 통신을 포기. 자신이 관리하는 단일 스레드 실행 자원을 만들기 위해, SPDK 이벤트 (이벤트 호출) 메커니즘을 제공합니다. 메커니즘의 본질은 반응기 (구조체 spdk_reactor)에 대응하는 각 데이터 구조는 이벤트의 이벤트 환 (고리)를 유지한다는 것이다. 이 반지는 하나의 생산자와 소비자보다 (MPSC : 여러 프로듀서 단일 소비자) 모델 , 즉, 각 원자로 스레드 처리를 위해 (현재 원자로 실 포함) 다른 이벤트 원자로 스레드에서 메시지를받을 수 있습니다. 이벤트 링 SPDK 현재 기본적으로 구현이 메커니즘 DPDK에 따라,이 선형 잠금 장치,하지만 스레드 간 동기화 잠금 메커니즘의 사용에 비해 훨씬 더 효율적입니다해야한다.

이벤트 링 처리 기능 반응기 (_spdk_reactor_run) 과정을 수행하는 동안 의심의 여지가있다. 각 이벤트 (구조체 spdk_event)의 이벤트 데이터 구조는 실제로 함수가 실행하는 상응하는 파라미터 및 상기 코어와 함께 수행 될 포함한다. 간략하게, 다른 통신에 대한 반응기 반응기 B는 실제로 필요한 반응기 B는 함수 F (X)를 (X는 대응하는 파라미터)를 수행.

상기 메커니즘에 기초하여,보다 효율적인 스레드 간 통신 메커니즘을 달성 SPDK. 구체적으로는 SPDK의 NVMe을-의 참조 할 대상 몇몇 구현 내측 메인 코드 인 (LIB / nvmf) 디렉토리.

I / O의 처리 모델 및 잠금 프리 데이터 경로

SPDK 주요 I / O 처리 모델 런타임에 완성이 완료 될 때까지 실행을 의미한다. SPDK 애플리케이션 프레임 워크를 사용하는 경우 상기 언급하는 CPU 코어는 스레드 (비 타이머 타이머를 포함하여) 많은 폴러을 수행 할 수있는 하나의 스레드 만이있다. 런타임에 완성 목표는 모든 작업을 수행하는 가장 좋은 마무리를 스레드를 만드는 것입니다. 명백한, SPDK 프로그래밍 프레임 워크는 이러한 요구를 충족합니다. 당신이 SPDK 응용 프로그램 프로그래밍 프레임 워크를 사용하지 않는 경우, 당신은 자신의 프로그래머가이 문제에 관심을 지불 할 필요가있다. 예를 들어, SPDK의 NVMe 사용자 모드 드라이버를 사용하는 함수 (spdk_nvme_qpair_process_completions)의 완료를 확인하는 동안 대응하는 I / O QPair가 읽고 제공 SPDK 비동기 읽기 쓰기 및 함수 (spdk_nvme_ns_cmd_read)에 쓰기 액세스한다. 이러한 기능은해야하지 크로스 - 스레드 처리, 완료 스레드를 호출해야합니다.

SPDK의 I / O 경로는 또한 잠금 장치없이 사용할 수. 유저 모드 스레드 동작 복수 SPDK 블록 장치 (bdev)에 동의 할 때 때 SPDK가 제공 개념적 I / O 채널 (즉, 스레드와 장치 사이의 매핑 관계) . 같은 장치를 작동해야 다른 스레드가 다른 I / O 채널, 각 I / O 채널을하여 잠금 장치를 제거 자원에 대한 경쟁을 피할 수있는 I / O 경로에 자신의 독립적 인 리소스를 사용 있습니다.

종종 묻는 질문

01 SPDK 매년 여러 버전을 출시? 릴리스 번호는 방법의 종류입니까?

A :  4 버전. YY.MM (MM 집합 {1,4,7,11}에 속하는) : 릴리스 버전은 올해 플러스 방식의 달을 사용합니다. 1 월, 4 월, 7 월에 각각 매년 네 가지 버전의 총을 게시하고 11 월에 발표했다. SPDK 향후 버전 18.04.

02 SPDK 오픈 소스 프로젝트 및 프로젝트의 관계는 무엇인가 DPDK?

: SPDK 첫 번째 프로젝트는 코드 명 2015 년 이후 개방, WaikikiBeach, 저장을위한 전체 이름 DPDK는 SPDK을 변경했습니다. SPDK는 DPDK는 SPDK 기본 환경 라이브러리이고, 라이브러리 환경 추상화 (위치 LIB / ENV 디렉토리), 애플리케이션 SPDK 스토리지, 메모리 및 다른 PCIe 장치 자원을 사용하는 리소스를 관리하기위한 메인 CPU를 제공한다. 때마다 SPDK은 새 버전이 출시 최신 안정 버전 DPDK를 사용합니다 발표했다. 예를 들어, SPDK 18.04는 DPDK18.02 버전을 사용합니다.

일부 03 SPDK 일반적인 사용 시나리오는 무엇입니까?

A는 : 지금, SPDK 솔루션을 채택 범용 스토리지 애플리케이션이 아닙니다. 사용자 모드로 커널 드라이버 때문에, 사용자 모드 구현에서 발생하는 전체 소프트웨어 기반의 I / O 스택을 기반으로 사용자 모드가 필요합니다. 파일 시스템은 의심의 여지 중요한 주제 중 하나없이, 그리고 커널 파일 시스템 (예를 들어 리눅스 EXT4 및 btrfs를, 등) 더 이상 직접 사용할 수 없습니다. SPDK는 "파일 시스템"blobfs / blostore 매우 간단한을 제공하지만 POSIX 인터페이스를 지원하지 않지만. 응용 프로그램이 당신이 SPDK 사용자 모드 "파일 시스템"에 직접 마이그레이션하는 파일 시스템을 사용하려면 이러한 이유로, 일부 코드를 포팅 할 필요가있다. 예를 들어, 찬성 POSIX 인터페이스를 사용하지 않고 비동기의 읽기 및 AIO와 유사한 방식으로 물품. (2) 가상 머신; 백엔드 그러한 iSCSI 대상 및 대상의 NVMe 현재 스토리지 애플리케이션 (1) 블록 장치 인터페이스를 제공 : SPDK 커뮤니티는 이제 더 다음 애플리케이션 시나리오에 사용 SPDK 그 방향으로 노력이 있었다 는 I / O (인 virtio) 가속, 가상 머신의 하이퍼 바이저에 의해 관리되는 장면 리눅스는 / KVM에서 주요 지원 QEMU, 가상 호스트 상호 작용 프로토콜 효율적인 가상 호스트 사용자 모드 대상 공유 메모리 채널을 사용하여 (예를 들어 가상 호스트 SCSI / BLK /의 NVMe 대상), 따라서 SCSI / BLK 커널 원주민의 NVMe 프로토콜 및 I / O 드라이버 Virto의 가상 머신을 가속화. (3) 데이터베이스 스토리지 엔진을 가속 SPDK, 주요 원칙의 수를 줄일 수 있습니다 (인터럽트, 예를 들어, 및 VM_EXIT) VM 중단 이벤트 및 I / O 스택의 호스트 OS 단축됩니다. RocksDB에서 추상 클래스 파일을 구현함으로써, 사용 RocksDB의 NVMe SSD에 엔진을 가속하기위한 blobfs / Blob 저장소 현재 Rocksdb 및 통합을 SPDK. 작업의 본질은 완전히 우회 커널 파일 시스템 기반 SPDK 사용자 모드 I / O 스택이다. 또한, Rocksdb에 대한 참조 SPDK 지원하고, 또한 SPDK의 blobfs / Blob 저장소와 다른 데이터베이스 스토리지 엔진을 통합 할 수 있습니다.

 

SPDK 소스 해석 (1)

 

추천

출처www.cnblogs.com/yi-mu-xi/p/10966287.html