DPDK Kernel Bypass Networking — DPDK #1
Yüksek Throughput ve Ultra-Low Latency için DPDK Data Plane Development Kit
DPDK Kernel Bypass Networking — DPDK #1
Yüksek Throughput ve Ultra-Low Latency için DPDK Data Plane Development Kit
DPDK (Data Plane Development Kit), yüksek hızda network data paketlerini işlemek amacıyla geliştirilecek uygulamalar için bir dizi driver, library ve Low-level API sunan development kitidir.
Bu yazı DPDK hakkında temel bilgiler içermektedir. Konuyla ilgili sonraki yazılarda DPDK uygulama geliştirme ve testi ele alınmış olup pratik gerçek yapılandırma bilgileri ve test sonuçları paylaşılmıştır. Yazılarda ev ortamında (homelab) eş zamanlı 1 milyon socket bağlantısı kurma ve ortalama gecikmesi 500µs altında 1 milyon RPS karşılamak için gerekli yapılandırmalar hakkında detaylı bilgilere yer verilmiştir.

DPDK konvansiyonel network stacklara göre radikal değişiklikler getirerek daha yüksek başarım elde eder. Şu an için DPDK performasına ve özelliklerine sahip bu alanda bir alternatifi yoktur. En çok kullanıldığı alanlar Software-Defined Networking (SDN), Network Functions Virtualization (NFV), High Frequency Trading (HFT) ve telekomünikasyon dur. DPDK tam ve kararlı olarak Linux’u destekler. FreeBSD desteği sınırlıdır. DPDK performansının temel kaynağı şu şekilde özetlenebilir.
- Kernel Bypass
- Pull Mode Driver (PMD)
- Hugepage
- Zero-Copy
Kernel Bypass
DPDK, NIC’i (Network Interface Card) Kernel yönetiminde çıkararak direkt kendisi kullanır. Bu sayede syscall, Kernel Space-User Space context-switch’inden ve Kernel interrupt, lock, scheduling overhead’inden etkilenmez. Genel amaçlar için tasarlanmış Kernel Network Stack kaynaklı performans kayıpları da yaşamaz. DPDK tamamen User Space’de çalışır.
Pull Mode Driver (PMD)
Normal Kernel driverlar interrupt tabanlı çalışır. PMD driver ise sürekli spin-loop yaparak NIC’i kontrol eder, veri olup olmadığına bakarak çalışır. DPDK, Kernel’i normal NIC driver yerine PMD driver kullanarak bypass eder. PMD driverler User Space’ de çalışan bir sürücüdür.
CPU’yu sürekli meşgul eden bir driver mimarisinin çok verimsiz olduğu düşünülebilir. Fakat DPDK tabanlı uygulamalar sürekli yüksek yük altında çalışan yada düşük gecikme beklenen uygulamalardır. Bu durumda veri geldiğinde tetiklenen bir interrupt yerine, veri olup olmadığını sürekli kontrol etmek daha verimlidir. Çünkü her interrupt processi kesintiye uğratır.
# DPDK device bind-unbind aracı
$ dpdk-devbind.py -s
Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'Ethernet Controller 10-Gigabit X540-AT2 1528' drv=vfio-pci unused=ixgbe
Network devices using kernel driver
===================================
0000:06:12.0 'Virtio network device 1000' if=ens18 drv=virtio-pci unused=vfio-pci *Active*
Hugepage
Linux memory managment için belleği 2KB bölümlere (Page) ayırır. Bu durum yüksek bellek kullanması olası uygulamalar için memory allocation ve mapping işlemlerinin zaman almasına neden olur. Daha hızlı ölçeklemek için 2KB den daha büyük bellek bölümleri kullanılır. Buna Hugepage denir. DPDK Paging’de performans kaybetmemek için direkt Hugepage kullanır. Normal şartlarda 2MB, çok daha düşük gecikme istenildiğinde ise 1GB gibi çok büyük pageler kullanılır.
# Hugepage Status
$ dpdk-hugepages.py -s
Node Pages Size Total
0 8 1Gb 8Gb
Hugepages mounted on /dev/hugepages
Zero-Copy
DPDK, NIC’den okuduğu veriyi hiç kopya oluşturmadan direkt User Space’e yani application seviyesine taşır.
# Kernel Data Path
NIC → Kernel driver → Kernel network stack (TCP/IP stack) → Socket → Application
# DPDK Data Path
NIC → User-space PMD driver → Application
TRADE OFF
DPDK her durumda avantaj sağlayan ve genel amaçlar için kullanılabilecek bir teknoloji değildir.
Tuning
DPDK’den performans almak, bir tuning (ince ayar) işidir. DPDK ham haliyle yüksek performans vermez. Hardware, OS, NIC, varsa VM ve uygulamaya göre ince ayar yapılması gerekir. Çoğu zaman bir parametre değişikliğinde diğer tüm parametreleri buna göre tekrar ayarlamak gereklidir. Genel kurallar olmasına rağmen her yapılandırma sisteme özeldir. Her sistemde ve her uygulamada aynı performansı vermez. DPDK ‘dan Kernel Network Stack’e göre 5x–10x kat performans almak çok sıradışı bir durum değildir.
Daha fazla donanım her zaman veya tek başına daha fazla throughput ve/veya daha az gecikme değildir. Örneğin, Core sayısını arttırdığınızda CPU karakteristiğine bağlı olarak CPU thermal throttling yapabilir. Daha az Core kullanarak aldığınız performanstan daha kötü bir sonuç elde edebilirsiniz. Aynı durum paket boyutları için de geçerlidir.
Tuning çalışmaları, mantık, tahmin ve sezgiler ile yapılmamalıdır. Gerçek verilere ve testlere (Data Driven Development) dayanmalıdır.
Ne Zaman DPDK? Ne Zaman Değil?
1Gbps üzeri network trafiğinde DPDK’nın avantajı görülmeye başlar. Büyük performans farkları 10Gbps ve üzeri trafiklerde gözlemlenir.
Ultra-Low Latency gerekiyorsa yani 1ms altında gecikme isteniyorsa DPDK bunun için biçilmiş kaftandır. Yüksek throughputlarda 1ms altında gecikmeye Kernel Bypass yapmadan ulaşmanın imkanı yoktur.
DPDK yüksek throughputlarda daha az kaynak kullanarak daha iyi ve deterministik performans verir. Deterministik bir gecikme ve throughput isteniyorsa DPDK bu konuda çok iyidir ve çoğu senaryoda tek seçenektir.
Uygulamanız network bağlamında I/O-Bound ise DPDK kullanmak mantıklı hale gelir. DPDK her konuda sihirli bir değnek değildir. Uygulamanız CPU-Bound ise buna bir katkı sağlamaz, hatta ters etki eder.
Aşırı Duyarlılık
DPDK hatalı sistem yapılandırmalarına karşı aşırı duyarlıdır. Küçük bir yapılandırma hatası dramatik performans kayıplarına neden olur. DPDK beklenen performansı verebilmesi için temiz bir yapılandırmaya ihtiyaç duyar. Bir maliyeti olmayacağı düşünülen küçük değişiklikler bile DPDK’nın Kernel Network Stack ile benzer hatta bazen daha kötü performans göstermesine kolayca neden olur.
DPDK, NUMA’ya (Non-Uniform Memory Architecture) karşı aşırı duyarlıdır. DPDK processlerinin pinlendiği CPU Coreları ve kullanılan NIC aynı NUMA nodelarına bağlı olmalıdır.
DPDK Hyper-Threading’den hoşlanmaz. Kardeş Core’ların çekişmesine neden olur. Dolayısıyla Hyper-Threading kapatılmalı (önerilen) ya da processler kardeş corelardan sadece birine pinlenmelidir.
DPDK için en uygun Core yapısı, Hyper-Threading olmayan sabit saat frekansında çalışan mümkün oldukça yüksek frekanslı Core dir.
DPDK’nın sistem ile uyumlu yapılandırılması ve uygulamanın buna göre darboğaz oluşturmayacak şekilde geliştirilmesi kritiktir. Aksi halde DPDK’dan elde edeceğiniz performans kazancını kolayca kaybedebilirsiniz.
Kernel Bypass’ın Götürdükleri
NIC, PMD sürücüsü ile Kernel kontrolünden çıktığı için Kernel tarafından yönetilemez. Bu durum pratik olarak hiçbir Kernel tabanlı aracın NIC’e etki edemeyeceği veya onu izleyemeyeceği anlamına gelir. ifconfig, ip, arp, iptables vb. araçlar NIC’i göremez. DPDK’nın kendine özel yönetim ve test araçları vardır ve bunlar kullanılır.
Adaptasyon
DPDK ile direkt olarak klasik bir socket uygulaması geliştiremezsiniz ya da varolan socket uygulamanıza adapte edemezsiniz. Şöyle ki; DPDK, layer 2'e karşılık gelen OSI katmanında işlem yapar. Neden “karşılık gelen” deniyor çünkü ortada Kernel olmadığı için OSI katmanı da yoktur.
DPDK içinde ARP, IP, TCP vb. hiç bir protokolün stackı yoktur dolayısı ile bu protokolleri işletmez. Bu gibi protokol implementasyonları DPDK development kitinin amacı ve kapsamı dışındadır. Sadece bazı protokolleri tanıyacak, bazılarını da parse edecek temel fonksiyonlara sahiptir. Bu protokollerin ihtiyacınız olan kısmını sizin implemente etmeniz beklenmektedir.
Geliştirme
DPDK, C programlama dili ile geliştirilmiştir. Tüm yapı C dili üzerine kuruludur. DPDK tabanlı bir uygulamadan yüksek performans beklendiği için C ve/veya C++ ile geliştirilmesi öngörülmektedir. DPDK uygulamaları GDB ile debug edilebilir. Hata bulmak runtimede oldukça zor olabilmektedir.
Çok iyi kategorize edilmiş ve detaylandırılmış, harika bir dökümantasyona sahiptir.
Network Interface Card (NIC)
DPDK kullanmak için uyumlu NIC gereklidir. DPDK sitesinde desteklenen güncel NIC listesi mevcuttur. DPDK sanal NIC (virtio-net) destekler fakat tüm özellikleri kullanması ve performans beklenmemelidir. Başlangıç seviyesinde sanal NIC kullanılabilir. Gerçek anlamda DPDK geliştirmesi ve testi yapmak için sunucu tabanlı en az 2,5Gbps mümkünse 10Gbps destekli NIC kullanılmalıdır.
Sanallaştırma
PCIe passthrough veya SR-IOV ile VF passthrough olarak VM’e atanmış NIC ile DPDK sorunsuz çalışır. Bunlar en yaygın kullanım şekilleridir.
Kurulum
DPDK işletim sistemine kurulum yapılarak direkt kullanılabilecek bir SDK değildir. Kernel olmadan NIC ve Memory erişimi yapacağından üzerinde çalıştığı OS’un, varsa hypervisor bootloader, VM bootloader ve VM machine config’inin yapılandırılması gerekir. Bu tür yapılandırma bilgileri DPDK dökümanlarında mevcuttur.
Ölçekleme ve Process Tipleri
DPDK’nın multi-thread yaklaşımı, Thread Per Core dur. Genelde Process yaklaşımı Process Per Thread dir. Yani her processde sadece bir thread olmalı, O thread de bir core’a pinlenmelidir.
Bir process içinde birden fazla thread kullanılması önerilmez. Bir process’te birden fazla thread kullanılacaksa CPU affinity, lock, contention durumlarına aşırı özen gösterilmelidir.
Mümkünse her process’in tek bir thread olması önerilir. Mümkün olan en yüksek performans ve kararlılık bu yapıda alınır.
Process Tipleri
DPDK primary ve secondary process olmak üzere iki process tipine sahiptir. Tipi ne olursa olsun her process farklı bir CPU Core pinlenerek çalışır.
Primary Process
NIC, mempool, hugepage, queue, ring buffer vb. kaynakları initalize eder. Aynı DPDK EAL’de (Environment Abstraction Layer) sadece bir tane primary process olabilir.
Secondary Process
Primary process’in initalize ettiği kaynaklara bağlanır. Birden fazla olabilir. NIC üzerindeki paketleri işleyebilir. Paralel paket işleme, yük dengeleme ve ölçekleme için kullanılır. Secondary processler worker adıyla da anılır.
DPDK monitoring ve managment toolları çalışan DPDK primary processe’e secondary process olarak bağlanarak çalışır.
# DPDK PMD Test Aracı
$ dpdk-testpmd -l 0,1 -n 4 -a 0000:01:00.0 -- -i --nb-cores=1 --forward-mode=txonly
EAL: Detected CPU lcores: 4
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: VFIO support initialized
EAL: Using IOMMU type 1 (Type 1)
EAL: Probe PCI driver: net_ixgbe (8086:1528) device: 0000:01:00.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
Interactive-mode selected
Set txonly packet forwarding mode
Warning: NUMA should be configured manually by using --port-numa-config and --ring-numa-config parameters along with --numa.
testpmd: create a new mbuf pool <mb_pool_0>: n=155456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
Warning! port-topology=paired and odd forward ports number, the last port will pair with itself.
Configuring Port 0 (socket 0)
Port 0: B1:36:1A:31:47:51
Checking link statuses...
Done
Port 0: link state change event
testpmd>
Process Codebase
DPDK geliştirme kurallarına uyulduğu sürece processler farklı codebase’e sahip olabilirler. Fakat bu durum pek yaygın değildir. Ölçeklemede esnekliği bozar ve karmaşıklığı artırır.
DPDK ile Yazılım Geliştirme
DPDK öğrenme eğrisi oldukça dik bir konudur. Ön koşul olarak C, Linux, Network, Hardware bilgisi gerektirir.
Geliştirme sürecini kolaylaştırmak ve kısaltmak mümkündür. DPDK’nın tüm özelliklerinden ve tam performansından bir miktar feragat etmeyi göze alırsanız User Space TCP Stack kullanarak süreci oldukça kısaltabilirsiniz. Bu sayede daha az efor harcayarak mevcut uygulama yapınız ile nisbeten daha uyumlu geliştirme yapmak mümkün olabilir. Bir sonraki yazı DPDK için geliştirilmiş TCP Stack olan F-Stack hakkındadır.
Görüşmek üzere.
DPDK Kernel Bypass Networking — DPDK #1
F-Stack — Hızlı DPDK Adaptasyonu — DPDK #2
메타데이터
- post_id
- 655b8a29c7ad
- slug
- dpdk-kernel-bypass-networking-dpdk-1-655b8a29c7ad
- url
- https://medium.com/@bakituranatmaca/dpdk-kernel-bypass-networking-dpdk-1-655b8a29c7ad
- canonical_url
- https://medium.com/@bakituranatmaca/dpdk-kernel-bypass-networking-dpdk-1-655b8a29c7ad
- author_url
- https://medium.com/@bakituranatmaca
- status
- ok
- fetched_at
- 2026-06-15 20:49:13