PMD와 가상 환경에서 DPDK
- Intel DPDK란?
- Linux 커널로 네트워크를 처리하려면 오버헤드가 발생한다.
- 오버헤드를 줄이고 더 간단하고 빠른 네트워크 처리 방식을 위한 도구이다.
Linux 커널의 네트워크 처리 (오버헤드 분석)
- 왜 Linux 커널의 네트워크 처리에 오버 헤드가 일어날까?
- 예를 들면
- Linux 커널은 네트워크 패킷을 "인터럽트'로 구현한다.
- 네트워크 뿐만아니라 다양한 프로세스를 처리하지만
- 외부에서 NIC으로 네트워크 패킷이 도착하면 NIC는 커널로 인터럽트를 건다.
- 커널은 지금 실행하는 처리를 중단하고
- NIC의 장치 드라이버로 처리를 할당하며
- 인터럽트가 발생한 네트워크 NIC에서 늘어온 패킷을 처리한다.
- 따라서 커널이 네트워크 패킷에 대한 인터럽트 처리와 함께
- 실제 패킷 처리 프로세스로 바뀔때까지 지연이 발생한다.
- 이런 오버 헤드는 커널의 기존 프로세스였지만,
- 네트워크를 소프트웨어로 구현하는데는 다소 큰 오버헤드가 된다.
- Linux 커널은 네트워크 패킷을 "인터럽트'로 구현한다.
- 네트워크 뿐만아니라 다양한 프로세스를 처리하지만
- 외부에서 NIC으로 네트워크 패킷이 도착하면 NIC는 커널로 인터럽트를 건다.
- 커널은 지금 실행하는 처리를 중단하고
- NIC의 장치 드라이버로 처리를 할당하며
- 인터럽트가 발생한 네트워크 NIC에서 늘어온 패킷을 처리한다.
- 따라서 커널이 네트워크 패킷에 대한 인터럽트 처리와 함께
- 실제 패킷 처리 프로세스로 바뀔때까지 지연이 발생한다.
- 이런 오버 헤드는 커널의 기존 프로세스였지만,
- 네트워크를 소프트웨어로 구현하는데는 다소 큰 오버헤드가 된다.
DPDK의 기본 동작
- DPDK의 동작
- DPDK는 PMD (Poll Mode Driver)라는 특별한 장치 드라이버를 사용한다.
- 이 장치 드라이버는 특정 CPU 코어에 상주하며,
- 외부에서 패킷이 도달하는 지 항상 감시합니다.
- 네트워크 장치(NIC)에 패킷이 도착하면,
- 바로 패킷을 처리합니다.
- 즉 인터럽트의 오버헤드를 줄이는 것이지요.
- DPDK는 PMD (Poll Mode Driver)라는 특별한 장치 드라이버를 사용한다.
- 이 장치 드라이버는 특정 CPU 코어에 상주하며,
- 외부에서 패킷이 도달하는 지 항상 감시합니다.
- 네트워크 장치(NIC)에 패킷이 도착하면,
- 바로 패킷을 처리합니다.
- 즉 인터럽트의 오버헤드를 줄이는 것이지요.
DPDK의 실행 방식 (2가지)
- Run-to-Completion
- PMD를 실행하는 CPU 코어가 네트워크 패킷까지 한꺼번에 실시하는 방식.
- Pile-line
- PMD를 실행하는 CPU 코어가 있고 실제 패킷의 처리는 다른 CPU 코어에서 하는 방식.
- PMD를 실행하는 CPU 코어가 네트워크 패킷까지 한꺼번에 실시하는 방식.
- PMD를 실행하는 CPU 코어가 있고 실제 패킷의 처리는 다른 CPU 코어에서 하는 방식.
DPDK의 패킷 처리
- DPDK를 사용하면
- Linux 커널이 제공하는 패킷 처리 방식을 무시하고
- DPDK를 사용하는 사용자 응용 프로그램이 직접 패킷을 처리한다는 것이다.
- 다시말하면 DPDK의 어플리케이션은 네트워크 패킷의 헤더를 보고
- TCP / IP 등의 프로토콜을 판별부터 시작해서 자신이 하려는 기능까지
- 사용자 응용 프로그램에서 전부 구현해야 하는 것을 의미합니다.
- 즉 DPDK를 사용한다고 해서 네트워크 성능이 향상되는 것만은 아니고.
- DPDK를 얼마나 잘 이용해서 네트워크 기능을 구현하는지가 중요하게 된다.
DPDK를 사용한 성능 평가
- 기존의 네트워크 평가처럼
- NIC과 NIC에 패킷 전달만 가지고
-
DPDK의 성능을 평가하기는 부족하다.
-
RSS (Receive-Side Scaling) 기능을 지원하는 최신 NIC이라면
- NIC이 수신한 패킷을 여러 그룹으로 나누어
- 각 그룹별로 CPU 코어를 병렬로 해서 처리할 수 있다.
-
10Gbps 이상의 고속 NIC을 사용할 경우
- PMD가 점유된 단일 코어로는 성능이 떨어지므로,
- 여러 CPU 코어에서 PMD를 실행하여
- 단일 CPU 코어 성능 병목이되는 것을 방지한다.
DPDK의 성능을 평가하기는 부족하다.
RSS (Receive-Side Scaling) 기능을 지원하는 최신 NIC이라면
- NIC이 수신한 패킷을 여러 그룹으로 나누어
- 각 그룹별로 CPU 코어를 병렬로 해서 처리할 수 있다.
10Gbps 이상의 고속 NIC을 사용할 경우
- PMD가 점유된 단일 코어로는 성능이 떨어지므로,
- 여러 CPU 코어에서 PMD를 실행하여
- 단일 CPU 코어 성능 병목이되는 것을 방지한다.
가상 환경에서 DPDK
- Linux KVM 가상 환경에서 두 종류의 커널이 있다.
- 호스트 Linux 커널
- 게스트 OS의 커널
-
DPDK 응용 프로그램은 커널을 기반으로 패킷을 처리하기 때문에
- 호스트 커널이 DPDK를 사용할지.
- 게스트와 호스트 커널 모두 DPDK를 사용할지.
- 아니면 어느 커널은 아무것도 안하지만 다른 커널에서 처리할지를 함께 고려해야한다.
-
DPDK는 패킷 처리를 응용 프로그램에서 처리하기 위한 도구이기 때문에
- 가상 머신 환경에서 어떻게 DPDK를 사용할지는 사용자의 자유이며,
-
현재 다양한 레이어를 어떻게 구현할지 다양한 구현방법을 제안/검증하는 단계이다.
-
예시 1 (사용자 어플리케이션이 직접 가상 NIC에 접근)
- 물리적 장치에 의존하는 환경으로 만든 DPDK 지원 응용 프로그램이라면
- 게스트 OS의 커널을 생략하고,
- 사용자 응용 프로그램에서 직접 가상 NIC에 액세스한다.
- 가상 NIC와 물리 NIC 사이의 패킷 처리는
- 기존처럼 하이퍼 바이저가 제공하는 가상 스위치를 사용하므로
- 오버 헤드는 기존과 크게 다르지 않다.
-
예시 2 (사용자 어플리케이션이 가상 OS의 DPDK를 거쳐 가상 NIC에 접근)
- 게스트 OS의 DPDK 지원 응용 프로그램에서
- 물리적 NIC를 직접 조작하는 방법
- 하이퍼 바이저의 기능은 특정 물리적 NIC를 가상 머신까지 통과시킨다.
- 하이퍼 바이저가 제공하는 가상 스위치의 기능은 사용할 수 없고,
- 여러 가상 시스템에서 물리적 NIC를 공유하려 한다면,
- SR-IOV를 지원하는 특별한 물리적 NIC이 필요하다.
- SR-IOV란 하나의 물리적 NIC를 가상으로 여러 NIC으로 보여주는 기능을 NIC 하드웨어로 제공한 것이다.
-
예시 3 (호스트의 가상 NIC을 DPDK가 사용)
- 다른 가상 머신의 네트워크 기능은 종래대로 게스트 OS의 커널에 맡겨두고,
- 호스트 Linux 측의 가상 NIC를 DPDK 가 사용하는 방법
- Linux에서 가상 스위치 기능을 제공하는 오픈 소스 Open vSwitch에 DPDK를 사용하여
- Open vSwitch와 물리적 NIC 사이의 패킷 처리 속도를 향상시키는 방법입니다.
-
예시 4
- 하이퍼 바이저의 가상 스위치 기능 및
- 게스트 OS 내부의 패킷 처리를 다시 새롭게 구현하여
- 호스트와 게스트의 네트워크 처리를 터널이 아니어도
- 빠르게할 수 있는 방법
-
예시 5 (NetVM)
- 하이퍼 바이저와 가상 머신이 메모리를 공유하여
- 메모리 간의 데이터 복사없이 패킷을 교환하는 방식
- 공유 메모리와 물리적 NIC 사이의 데이터 교환은 DPDK를 사용
- DPDK는 물리 NIC에서 공유 메모리에 패킷 데이터가 로드 된 후
- 여러 가상 머신이 협력하여
- 패킷에 필요한 처리를 해갑니다.
-
예시 5의 좀더 구체적인 예시 (방화벽 기능이 있는 라우터를 구현)
- 라우팅 기능을 담당하는 가상 머신과
- 방화벽 기능을 담당하는 가상 머신으로 역할 분담
- 이런 두가지 가상 머신 간 패킷 정보를 공유 메모리의 큐를 통해서 전달
- 호스트 Linux 커널
- 게스트 OS의 커널
DPDK 응용 프로그램은 커널을 기반으로 패킷을 처리하기 때문에
- 호스트 커널이 DPDK를 사용할지.
- 게스트와 호스트 커널 모두 DPDK를 사용할지.
- 아니면 어느 커널은 아무것도 안하지만 다른 커널에서 처리할지를 함께 고려해야한다.
DPDK는 패킷 처리를 응용 프로그램에서 처리하기 위한 도구이기 때문에
현재 다양한 레이어를 어떻게 구현할지 다양한 구현방법을 제안/검증하는 단계이다.
예시 1 (사용자 어플리케이션이 직접 가상 NIC에 접근)
- 물리적 장치에 의존하는 환경으로 만든 DPDK 지원 응용 프로그램이라면
- 게스트 OS의 커널을 생략하고,
- 사용자 응용 프로그램에서 직접 가상 NIC에 액세스한다.
- 가상 NIC와 물리 NIC 사이의 패킷 처리는
- 기존처럼 하이퍼 바이저가 제공하는 가상 스위치를 사용하므로
- 오버 헤드는 기존과 크게 다르지 않다.
예시 2 (사용자 어플리케이션이 가상 OS의 DPDK를 거쳐 가상 NIC에 접근)
- 게스트 OS의 DPDK 지원 응용 프로그램에서
- 물리적 NIC를 직접 조작하는 방법
- 하이퍼 바이저의 기능은 특정 물리적 NIC를 가상 머신까지 통과시킨다.
- 하이퍼 바이저가 제공하는 가상 스위치의 기능은 사용할 수 없고,
- 여러 가상 시스템에서 물리적 NIC를 공유하려 한다면,
- SR-IOV를 지원하는 특별한 물리적 NIC이 필요하다.
- SR-IOV란 하나의 물리적 NIC를 가상으로 여러 NIC으로 보여주는 기능을 NIC 하드웨어로 제공한 것이다.
예시 3 (호스트의 가상 NIC을 DPDK가 사용)
- 다른 가상 머신의 네트워크 기능은 종래대로 게스트 OS의 커널에 맡겨두고,
- 호스트 Linux 측의 가상 NIC를 DPDK 가 사용하는 방법
- Linux에서 가상 스위치 기능을 제공하는 오픈 소스 Open vSwitch에 DPDK를 사용하여
- Open vSwitch와 물리적 NIC 사이의 패킷 처리 속도를 향상시키는 방법입니다.
예시 4
- 하이퍼 바이저의 가상 스위치 기능 및
- 게스트 OS 내부의 패킷 처리를 다시 새롭게 구현하여
- 호스트와 게스트의 네트워크 처리를 터널이 아니어도
- 빠르게할 수 있는 방법
예시 5 (NetVM)
- 하이퍼 바이저와 가상 머신이 메모리를 공유하여
- 메모리 간의 데이터 복사없이 패킷을 교환하는 방식
- 공유 메모리와 물리적 NIC 사이의 데이터 교환은 DPDK를 사용
- DPDK는 물리 NIC에서 공유 메모리에 패킷 데이터가 로드 된 후
- 여러 가상 머신이 협력하여
- 패킷에 필요한 처리를 해갑니다.
예시 5의 좀더 구체적인 예시 (방화벽 기능이 있는 라우터를 구현)
- 라우팅 기능을 담당하는 가상 머신과
- 방화벽 기능을 담당하는 가상 머신으로 역할 분담
- 이런 두가지 가상 머신 간 패킷 정보를 공유 메모리의 큐를 통해서 전달
댓글 없음:
댓글 쓰기