[종이] [동영상]
UDPDK 는 서버 간 빠른 지점 간 통신을 위한 DPDK 기반의 최소 UDP 스택입니다.
완전히 사용자 공간에서 실행되므로 번거로운 커널 스택을 거치지 않고도 패킷을 빠르게 이동할 수 있습니다.
게다가 POSIX와 유사한 API 덕분에 기존 애플리케이션을 UDPDK로 포팅하는 것이 매우 쉽습니다! 1
UDPDK란 무엇입니까?
UDPDK가 아닌 것:
1 일부 기능은 아직 지원되지 않을 수 있습니다.
UDPDK를 사용하려면 컴퓨터에 DPDK 지원 NIC가 장착되어 있어야 합니다. 이는 일반적으로 랩톱 및 데스크톱 컴퓨터가 아닌 서버에서 발견됩니다. DPDK가 공식적으로 지원하는 하드웨어 목록은 여기에서 확인할 수 있습니다. 특히 UDPDK는 igb_uio 및 vfio 드라이버를 사용하여 Intel X710-DA2 에서 개발 및 테스트되었습니다. 다른 장치는 DPDK가 지원하는 한 작동해야 합니다.
UDPDK에는 다음이 필요합니다.
이 저장소에는 이미 하위 모듈로 포함되어 있으므로 끌어옵니다.
git submodule init
git submodule update
DPDK
DPDK는 UDPDK의 중추적인 요소입니다. NIC를 관리하고 이더넷을 구현합니다.
cd dpdk/usertools
./dpdk-setup.sh
메뉴에서 다음을 수행합니다.
x86_64-native-linuxapp-gcc
에 대해 컴파일합니다.vfio
모듈 로드
️ VFIO 드라이버를 사용하는 경우 시스템에서 IOMMU를 활성화해야 합니다.
활성화하려면/etc/default/grub
열고GRUB_CMDLINE_LINUX_DEFAULT
에intel_iommu=on
플래그를 추가한 다음sudo update-grub
하고 마지막으로 재부팅하세요.
에에
inih는 .ini
구성 파일을 구문 분석하는 데 편의를 위해 사용됩니다.
cd inih
meson build
cd build
ninja
UDPDK는 최종 애플리케이션과 연결되어야 하는 정적 라이브러리로 구축됩니다.
cd udpdk
make
sudo make install
UDPDK의 API는 기존 BSD 소켓의 API와 매우 유사합니다.
int udpdk_socket(int domain, int type, int protocol);
int udpdk_bind(int s, const struct sockaddr *addr, socklen_t addrlen);
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t *optlen);
ssize_t udpdk_sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t udpdk_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
int udpdk_close(int s);
또한 DPDK 내부(구조 및 프로세스)의 적절한 설정 및 해체를 위해서는 다음 방법이 필요합니다.
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
참고: select()는 아직 구현되지 않았습니다.
apps/
폴더에는 ping-pong 및 pkt-gen 애플리케이션이라는 두 가지 간단한 예가 포함되어 있습니다.
UDPDK는 두 개의 별도 프로세스에서 실행됩니다. 기본 프로세스는 애플리케이션 로직(예: syscall이 호출되는 위치)을 포함하는 프로세스이고, 보조 프로세스( poller )는 데이터를 보내고 받기 위해 지속적으로 NIC를 폴링합니다. 패킷은 잠금 없는 링 큐를 사용하여 공유 메모리를 통해 애플리케이션과 폴러 간에 교환됩니다.
처리량 및 대기 시간 측면에서 UDPDK를 표준 UDP 소켓과 비교합니다.
환경
두 개의 동일한 서버가 10G 인터페이스에서 지점 간 연결됩니다. 그들의 사양은 다음과 같습니다:
CPU: 인텔 제온 E5-2640 @2.4GHz
램: 64GB
OS: 우분투 18.04
커널: 4.15.0
NIC: 인텔 X710 DA2 10GbE
NIC 드라이버: VFIO(DPDK) 또는 i40e(일반 소켓)
처리량
우리는 패킷 크기에 따라 달성되는 최대 처리량을 측정합니다.
후자에는 UDP, IP 및 MAC 헤더가 포함됩니다.
그림에서 볼 수 있듯이 UDPDK는 기존 소켓보다 최대 18배 더 좋습니다 .
UDPDK는 10G 연결을 포화시킨다는 점에 유의해야 합니다. 불행하게도 이것이 우리가 가진 전부였습니다. 40G 추론을 사용하면 확실히 빛을 발할 것입니다!
숨어 있음
지연 시간과 지터를 측정합니다.
다시 말하지만, UDPDK는 표준 소켓보다 훨씬 더 나은 것으로 입증되었습니다.
UDPDK | 기준 | |
---|---|---|
평균(μs) | 13.92 | 116.57 |
표준(μs) | 0.74 | 18.49 |
UDPDK의 코드는 BSD 3-Clause 라이센스에 따라 공개됩니다.
이 작업은 네트워크 기능 가상화 및 소프트웨어 정의 네트워킹에 관한 제7회 IEEE 컨퍼런스인 IEEE NFV-SDN 2021에서 발표되었습니다. 저자는 L. Lai, G. Ara, T. Cucinotta, K. Kondepu, L. Valcarenghi입니다.
라이, 레오나르도 등. "DPDK를 사용한 초저지연 NFV 서비스" 네트워크 기능 가상화 및 소프트웨어 정의 네트워크(NFV-SDN)에 관한 2021 IEEE 컨퍼런스. IEEE, 2021.
새로운 기능을 구현하거나, 기존 기능을 확장하거나, 단순히 버그/문제를 보고하여 UDPDK에 기여하는 것은 누구나 환영입니다.