1. 程式人生 > >(WIP) DPDK理論學習(by quqi99)

(WIP) DPDK理論學習(by quqi99)

rom obj 命中 拷貝 time 緩存 時間服務 object 內核

作者:張華 ?發表於:2016-04-22
版權聲明:能夠隨意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本版權聲明

( http://blog.csdn.net/quqi99 )

組成模塊

  • rte_timer,包裝提供內核的Time-Stamp Couter(TSC)時間服務。讓異步運行函數成為可能
  • rte_malloc, 從memzones中分配大頁,相較於4K heap pages。頁表項更少,TLB命中率更高。
  • rte_ring, 固定大小的環形緩存區。lockless multi-producer, multi-consumer, bulk/burst-enqueue/dequeue的FIFO隊列管理API. 當中per-lcore變量通過Thread Local Storage(TLS)提供per-thread local storage.
  • rte_mempool, 分區pool,pool使用name標記並使用ring分配objects.
  • rte_mbuf, 用於提供對mbuf(ctrlmbuf + pktmbuf)的管理。mbuf存儲在mempool中
  • rte_eal + libc, EAL(Environment Abstration Layer)提供對上述的接口。隱藏App和Lib之間的環境細節。如:Alarm操作、中斷處理、CPU特性識別(rte_cpu_get_feature)、Trace和Debug功能、PCI總線訪問、原子鎖操作、內存分配、Core親和性、多進程&多線程、librte_hash(包轉發算法), librte_lpm (Longest Prefix Match,包轉發算法),librte_net)。EAL通過/sys向用戶空間呈現PCI信息(/sys/bug/pci)與address space,EAL用igb_uio模塊用戶空間提供/dev/uidX設備文件,應用就能夠使用mmap /dev/uidX到PCI address space。

    用戶空間採用了pthread庫。DPDK包含1G和10G的PMDs(Poll Mode Drivers), 及沒有異步和中斷信息機制的virtio控制器。

初始化

技術分享圖片

內存管理

一個連續的內存塊通過rte_memseg來描寫敘述,再通過memzone的概念來聚集(可使用rte_eal_get_configuration()來訪問)。使用aligh參數來對齊數據(2的指數倍但不大於64 bytes)。

memzone能夠保留2MB或1G的大頁。

CONFIG_RTE_MALLOC_DEBUG參數能夠幫助調試緩存區溢出錯誤。
librte_malloc用於分配隨意大小的內存,在NUMA中,是分配該core所在的NUMA socket還是其他socket上的內存由參數顯然決定。常見兩個數據結構:

  • malloc_heap, 管理per-socket上的free內存(每一個NUMA node上有一個heap結構), numa_socket, mz_count, lock, free_head.
  • malloc_elem, memzone中各種管理對象的通用頭部描寫敘述,heap, prev, next_free, state, padding, size.

KNI接口

DPDK提供了兩種方法與linux kernel協議棧交互: TAP和KNI。KNI(Intel DPDK Kernel NIC Interface)同意用戶應用訪問Linux控制平面。能夠讓TUN/TAP設備省去系統調用和數據拷貝(copy_to_user()/copy_from_user())的時間。也能夠同意應用使用kernel tcp/ip棧及使用標準的的管理工具如ethtool, ifconfig,tcpdump等(/dev/kni)。

技術分享圖片


參考


[1] http://www.cnblogs.com/chanwai1219/p/3680239.html
[3] Intel? Data Plane Development Kit (Intel? DPDK)

(WIP) DPDK理論學習(by quqi99)