DPDK 內存子系統兩個操作模式:dynamic/legacy;
內存根據應用使用情況自動擴展或減小,rte_malloc(), rte_memzone_reserve()函數導致更多的hugepages被保留。
rte_memzone_reserve(RTE_MEMZONE_IOVA_CONTIG)是西安IOVA連續空間的分配。內存分配器檢查是否有足夠的內存
可被使用。-m和--socket-mem命令行選項實現在初始化時預分配內存。--single-file-segments會導致所有pages放入一個文件中。
內存分配回調函數註冊:rte_mem_event_callback_register();超過設置的閾值報警:rte_mem_alloc_validator_callback_register()
--socket-limit選項啓動了默認的檢驗器回調函數。
--legacy-mem:啓動內存的legacy模式,在此模式下,-m和--socket-mem選項的功能也可用。
hugepage分配匹配:
--match-allocations選項開啓此功能,不支持同--legacy-mem和--no-huge選項一起用。
最大內存量限制配置:
CONFIG_RTE_MAX_MEMSEG_LISTS:段列表的最大數
CONFIG_RTE_MAX_MEM_MB_PER_LIST:段列表可尋址的最大內存
CONFIG_RTE_MAX_MEMSEG_PER_LIST:每個segment中最大segments數目
CONFIG_RTE_MAX_MEMSEG_PER_TYPE:每種內存類型可以有的最大segment數目
CONFIG_RTE_MAX_MEM_MB_PER_TYPE:每種內存類型可以有的最大segment空間
CONFIG_RTE_MAX_MEM_MB:全局最大可預留內存量
segment文件描述符
在EAL中存儲segment文件描述符,當內存頁尺寸更小可能產生問題。解決這個問題的方法:--single-file-segments選項。
支持外部分配的內存
使用heap API's
rte_alloc(), rte_ring_create(),需要檢驗內存分配是否成功。
一般流程;
(1)獲取一個指向內存區的指針;(2)創建命名的heap(3)將內存區添加到heap中;(4)獲取使用heap的套接字id;
(5)使用普通的DPDK內存管理方法,入參包含套接字id, (6)內存區太小,從heap中移除該內存區;
(7)heap不再需要,移除heap;
術語:lcore: CPU的logical執行單元。
共享變量和線程本地變量:
日誌:
DPDK提供日誌API。在Linux上,日誌默認傳遞個syslog或者console。
rte_panic()函數觸發SIG_ABORT信號,由信號處理函數生成一個dump文件。
CPU功能識別
在運行時查詢CPU判斷哪些功能可用可使用函數rte_cpu_get_features();
用戶空間中斷事件
host線程拉取UIO文件描述符探測中斷。
RX中斷事件
設備移除事件
黑名單
PCI設備黑名單功能標記特定的NIC端口。