İçeriğe geç
DPDK ile Kernel Bypass Ağ: Testpmd ve Yüksek Throughput

DPDK ile Kernel Bypass Ağ: Testpmd ve Yüksek Throughput

5 dk okuma Ağ Yönetimi

Linux kernel ağ yığını, esneklik odaklı bir tasarımın bedelini paket başına ödüyor. Gelen her çerçeve için kesme, softirq, socket buffer tahsisi ve katman katman protokol işleme adımı var. 10G bir hatta 64 byte çerçevelerle hat hızı yaklaşık 14,88 milyon paket/saniyeye karşılık gelir; bu tempo paket başına düşen süreyi yüz nanosaniyenin altına sıkıştırır. Kernel bu bütçeyi karşılayamadığı için yüksek pps senaryolarında drop ve gecikme artar. DPDK bu soruna cevaben ağ kartını kernel kontrolünden çıkarıp kullanıcı alanına taşır ve paket yolunu birkaç fonksiyon çağrısına indirir.

Temel taş Poll Mode Driver, kısaca PMD. Kesme yerine sürekli polling: ayrılmış bir çekirdek RX kuyruğunu döngüyle tarar, dolu deskriptörleri mempool üzerinden alır, işler, TX kuyruğuna iter. Süreçte syscall yok, paket kopyası yok, kesme maliyeti yok. Bedeli şu: o çekirdek /proc/stat içinde %100 meşgul görünür ve gerçekten de meşguldur. Boş beklemek, yöntemin kendisi.

Hugepage olmadan DPDK ayağa kalkmaz

Bütün paket bufferları hugepage üzerinde tutulur. Sebep DMA ve TLB. 2MB ya da 1GB sayfalar kullanılır; sayfa büyüdükçe TLB isabetsizliği düşer, ayrıca fiziksel olarak daha düzgün bellek kartın doğrudan erişimine uygun hale gelir. Kurulumda /proc/meminfo içindeki HugePages_Total değerine bakılır. 2MB sayfalar sysctl ile atanabilir, 1GB sayfalar boot parametresi ister. Dağıtımların çoğu hugetlbfs dizinini /dev/hugepages altına öntanımlı bağlar.

sysctl -w vm.nr_hugepages=1024

Kartı kernel elinden almak

Bir PCI kart aynı anda hem kernel sürücüsü hem kullanıcı alanı tarafından yönetilemez. DPDK tarafında kart vfio-pci ya da uio_pci_generic sürücüsüne bağlanır, eski sürücüsü (örneğin ixgbe, i40e) devre dışı kalır. Kaynak ağacındaki usertools dizinindeki dpdk-devbind.py betiği bu işi yapar; --status parametresiyle mevcut bağlama durumu görülür. vfio-pci daha güvenli olan yoldur ama IOMMU gerektirir; Intel platformlarda kernel satırına intel_iommu=on eklenmesi gerekir.

Bir port DPDK tarafına geçtiğinde o arayüz artık ip link çıktısında görünmez, tcpdump bir şey yakalayamaz. Yönetim trafiği için mutlaka ikinci bir kart bırakın.

mlx5 istisnası

NVIDIA/Mellanox kartlarda mlx5 PMD kartı vfio-pci ile bağlama ihtiyacı duymaz; /dev/infiniband düğümleri üzerinden doğrudan çalışır ve kernel sürücüsü yerinde kalır. Bu modelde hem DPDK hem kernel aynı karta hizmet edebilir.

Testpmd konsolu

Kaynak ağaçla gelen testpmd hem benchmark aracı hem öğrenme ortamıdır. Klasik başlatma şöyle görünür:

testpmd -l 0-3 -n 4 -- -i

-l iş parçacıklarının bağlanacağı çekirdekleri, -n bellek kanalı sayısını belirtir. Çift tire sonrası testpmd kendi argümanlarını alır; -i interaktif kabuk açar. Çekirdek sayısı ile port kuyruk yapısı uyuşmazsa konsol sizi uyarır, uyarıyı ciddiye alın.

testpmd> set fwd io
testpmd> start
testpmd> show port stats all
testpmd> stop

io modu iki port arasında kabloyu taklit eder; gelen çerçeve MAC ve IP başlıklarına dokunulmadan öbür porta verilir. show port stats all çıktısı pps ve Mbps cinsinden sayaçları basar. Ölçüm bitince stop, çıkmak için quit.

Üretici ve yönlendirici modlar

set fwd ile değişen davranış test senaryosuna göre seçilir. txonly belirtilen hızda trafik üretir, jeneratör olarak kullanılır. rxonly gelen her şeyi sayar ve düşürür. mac modu ileriye yönlendirirken Ethernet başlığındaki adresleri yeniden yazar; macswap ise kaynak ve hedef MAC adreslerini yer değiştirir, iki ucun birbirini tanıdığı testlerde pratiktir. Güncel sürümlerde csum, icmpecho gibi ek modlar da mevcut.

Izolasyon ve yerleşim

Performansın büyük kısmı testpmd argümanından değil sistem düzeninden gelir. Kernel zamanlayıcı polling çekirdeklerine iş vermemeli; bunun için boot parametreleri kullanılır:

isolcpus=2-7 nohz_full=2-7 rcu_nocbs=2-7

CPU frekans yöneticisi performance moduna alınır (cpupower frequency-set --governor performance), aksi halde governor ölçüm ortasındaki yükü düşük frekansla karşılar ve rakamlar küçük çıkar. NUMA yerleşimi kritik: kart ile polling çekirdekleri aynı socket üzerinde olmalı. Kartın hangi NUMA düğümünde olduğu sysfs altında, PCI cihaz dizinindeki numa_node dosyasından okunur; lscpu çıktısı da düğüm haritasını verir. Yanlış socket üzerinde çalışan bir testpmd, doğru yapılandırılmış halinin yarısı kadar bile çıkmayabilir.

Bedeli

Kernel bypass, TCP/IP yığınının ve beraberinde socket arayüzünün yok olması demektir. DPDK size çerçeve verir, TCP bitlerine karışmaz; TCP ya da UDP servisleri için kullanıcı alanında bir yığın (F-Stack, mTCP, Seastar gibi) entegre etmek gerekir. Kart DPDK modundayken o arayüz üzerinden SSH kurulamaz, kernel tabanlı firewall ve QoS devre dışıdır. Süreç ölürse normal ağ yığınına otomatik dönüş yoktur, izleme ve log mekanizmasını kendiniz kurarsınız. Karşı ucun DPDK çalıştırması gerekmez; testpmd io modu genel bir yönlendirici ya da trafik jeneratörü ile eşleşebilir.

Testpmd ile başlamak doğru bir ilk adım; sürücü bağlama, hugepage ve kuyruk yerleşimi sorunlarını gerçek uygulama yazmadan önce bu konsolda çözmeniz gerekir. Sayaçlar stabilize olup 64 byte çerçevede hat hızına yaklaştığında geri kalan iş, kendi veri düzleminizi kurmaktır.