[กระดาษ] [วิดีโอ]
UDPDK เป็นสแต็ก UDP ขั้นต่ำที่ใช้ DPDK สำหรับการสื่อสารแบบจุดต่อจุดที่รวดเร็วระหว่างเซิร์ฟเวอร์
มันทำงานได้อย่างสมบูรณ์ในพื้นที่ผู้ใช้ ดังนั้นคุณจึงสามารถย้ายแพ็กเก็ตของคุณได้อย่างรวดเร็วโดยไม่ต้องผ่านเคอร์เนลสแต็กที่ยุ่งยาก
ยิ่งไปกว่านั้น ต้องขอบคุณ API ที่เหมือน POSIX ทำให้การย้ายแอปพลิเคชันที่มีอยู่ไปยัง UDPDK เป็นเรื่องง่ายมาก! 1
UDPDK คืออะไร:
สิ่งที่ UDPDK ไม่ใช่:
1 คุณสมบัติบางอย่างอาจยังไม่รองรับ
ในการใช้ UDPDK เครื่องของคุณต้องติดตั้ง NIC ที่เปิดใช้งาน DPDK โดยทั่วไปจะพบได้ในเซิร์ฟเวอร์ ไม่ใช่ในแล็ปท็อปและเครื่องเดสก์ท็อป รายการฮาร์ดแวร์ที่รองรับอย่างเป็นทางการโดย DPDK มีอยู่ที่นี่ โดยเฉพาะ UDPDK ได้รับการพัฒนาและทดสอบบน Intel X710-DA2 พร้อมไดรเวอร์ igb_uio และ vfio อุปกรณ์อื่นๆ ควรใช้งานได้ตราบเท่าที่ DPDK รองรับ
UDPDK ต้องการ:
พวกมันถูกรวมอยู่ในที่เก็บนี้เป็นโมดูลย่อยแล้ว ดังนั้นให้ดึงมันออกมา:
git submodule init
git submodule update
กปปส
DPDK เป็นองค์ประกอบสำคัญของ UDPDK มันจัดการ NIC และใช้อีเธอร์เน็ต
cd dpdk/usertools
./dpdk-setup.sh
จากเมนู ให้ดำเนินการดังนี้:
x86_64-native-linuxapp-gcc
vfio
หากคุณใช้ไดรเวอร์ VFIO คุณต้องเปิดใช้งาน IOMMU ในระบบของคุณ
หากต้องการเปิดใช้งานให้เปิด/etc/default/grub
เพิ่มแฟล็กintel_iommu=on
ในGRUB_CMDLINE_LINUX_DEFAULT
จากนั้นsudo update-grub
และรีบูตในที่สุด
ในนี้
inih ใช้เพื่อความสะดวกในการแยกวิเคราะห์ไฟล์การกำหนดค่า . .ini
cd inih
meson build
cd build
ninja
UDPDK สร้างเป็นไลบรารีแบบคงที่ ซึ่งท้ายที่สุดแล้วจะต้องเชื่อมโยงกับแอปพลิเคชันขั้นสุดท้าย
cd udpdk
make
sudo make install
API ของ UDPDK มีลักษณะใกล้เคียงกับซ็อกเก็ต BSD เก่าที่ดี:
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 ทำงานในสองกระบวนการที่แยกจากกัน: กระบวนการหลักคือกระบวนการที่มีตรรกะของแอปพลิเคชัน (เช่น โดยที่ syscalls ถูกเรียก) ในขณะที่กระบวนการรอง ( poller ) จะสำรวจ NIC อย่างต่อเนื่องเพื่อส่งและรับข้อมูล แพ็กเก็ตจะถูกแลกเปลี่ยนระหว่างแอปพลิเคชันและโพลเลอร์ผ่านหน่วยความจำที่ใช้ร่วมกัน โดยใช้คิวริงแบบไม่มีล็อค
เราเปรียบเทียบ UDPDK กับซ็อกเก็ต UDP มาตรฐานในแง่ของปริมาณงานและเวลาแฝง
สิ่งแวดล้อม
เซิร์ฟเวอร์ที่เหมือนกันสองเครื่องเชื่อมต่อแบบจุดต่อจุดบนอินเทอร์เฟซ 10G ข้อมูลจำเพาะของพวกเขาคือ:
ซีพียู: Intel Xeon E5-2640 @2.4GHz
แรม: 64GB
ระบบปฏิบัติการ: อูบุนตู 18.04
เคอร์เนล: 4.15.0
นิค: Intel X710 DA2 10GbE
ไดรเวอร์ NIC: VFIO (DPDK) หรือ i40e (ซ็อกเก็ตปกติ)
ปริมาณงาน
เราวัดปริมาณงานสูงสุดที่ได้รับซึ่งแตกต่างกันไปตามขนาดแพ็คเก็ต
ส่วนหลังนี้รวมส่วนหัว UDP, IP และ MAC ไว้ด้วย
ดังที่แสดงในภาพ UDPDK นั้น ดีกว่าซ็อกเก็ตแบบเดิมถึง 18 เท่า
ควรสังเกตว่า UDPDK ทำให้การเชื่อมต่อ 10G อิ่มตัว ซึ่งน่าเสียดายคือทั้งหมดที่เรามี: อินเฟอร์เฟซ 40G จะทำให้การเชื่อมต่อนั้นโดดเด่นอย่างแน่นอน!
เวลาแฝง
เราวัดเวลาแฝงและความกระวนกระวายใจของมัน
ขอย้ำอีกครั้งว่า UDPDK พิสูจน์แล้วว่ามีลำดับความสำคัญที่ดีกว่าซ็อกเก็ตมาตรฐาน
ยูดีพีดีเค | มาตรฐาน | |
---|---|---|
ค่าเฉลี่ย (μs) | 13.92 | 116.57 |
มาตรฐาน (μs) | 0.74 | 18.49 |
รหัสของ UDPDK ได้รับการเผยแพร่ภายใต้ใบอนุญาต BSD 3-Clause
งานนี้ได้ถูกนำเสนอที่ IEEE NFV-SDN 2021 ซึ่งเป็นการประชุม IEEE ครั้งที่ 7 เรื่อง Network Functions Virtualization และ Software-Defined Networking ผู้เขียนคือ: L. Lai, G. Ara, T. Cucinotta, K. Kondepu, L. Valcarenghi
ไล, เลโอนาร์โด และคณะ "บริการ NFV ที่มีความหน่วงต่ำเป็นพิเศษโดยใช้ DPDK" การประชุม IEEE ปี 2021 เกี่ยวกับการจำลองเสมือนฟังก์ชันเครือข่ายและเครือข่ายที่กำหนดโดยซอฟต์แวร์ (NFV-SDN) อีอีอี, 2021.
เรายินดีอย่างยิ่งให้ทุกคนมีส่วนร่วมใน UDPDK โดยการนำคุณสมบัติใหม่ๆ ไปใช้ ขยายคุณสมบัติที่มีอยู่ หรือเพียงแค่รายงานจุดบกพร่อง/ปัญหา