DPDK Timer Library原理(學習筆記)


0 前置知識學習跳表(SkipList)

跳表應具有以下特征:

1)一個跳表應該有多個層(level)組成,通常是10-20層。

2)跳表的第0層包含所有的元素。

3)每一層都是一個有序的鏈表。層數越高應越稀疏,這樣在高層次中能跳過許多不符合條件的數據。

4)如果元素x出現在第i層,則所有比i小的層都包含x;

5)每個節點包含key及其對應的value和一個指向下一層相同內容的節點位置。

skiplist的查詢過程示例:

以已有數據13、22、75、80、99為例,查找80。從最高層(此例為2)開始:

1)level2找到結點Node75小於80,且level2.Node75->next 大於80,則進入level1查找(此處已經跳過了13~75中間的結點(22)。

2)level1.Node75 < 80 < level1.Node75->next,進入level0。

3)level0.Node75->next 等於80,找到結點。

clipboard

1 定時器庫

定時器庫為DPDK執行單元提供定時器服務,以異步執行回調函數。該庫的功能有:

  • 定時器可以是周期性執行或單次執行。
  • 定時器可以從一個內核加載並在另一個內核上執行。但必須在對rte_timer_reset()的調用中指定它。
  • 定時器提供精度高計數(取決於對rte_timer_manage()的調用頻率,該調用頻率檢查本地內核的定時器到期情況)。
  • 如果應用程序中不需要,可以通過不調用rte_timer_manage()來提高性能,從而在編譯時禁用定時器。

定時器庫使用rte_get_timer_cycles()函數,該函數使用高精度事件定時器(HPET)或CPU時間戳計數器(TSC)提供可靠的時間參考。

該庫提供添加,刪除和重新啟動定時器的接口。該API基於BSD callout(),但有一些區別。請參閱標注手冊。

2 實施細節

定時器以每個邏輯核為基礎進行跟蹤,並在跳表(skiplist)數據結構中按定時器到期的順序維護核內的所有待處理定時器。使用的跳表有十個級別,並且表中的每個條目以(¼^級)的概率出現在每個級別中。這意味着所有條目都存在於級別0中,每4個條目中就有1個存在於級別1中,每16個條目中就有1個存在於級別2中,依此類推,直到第9級為止。這意味着從一個定時器列表中添加和刪除條目的時間復雜度為log(n),每個邏輯核最多能容納4^10個條目,即約1,000,000個定時器。

定時器結構包含一個稱為狀態的特殊字段,該字段是定時器狀態(已停止,掛起,正在運行,配置)和所有者(lcore id)的聯合體。

union rte_timer_status {
    RTE_STD_C11
    struct {
        uint16_t state;  /**< Stop, pending, running, config. */
        int16_t owner;   /**< The lcore that owns the timer. */
    };
    uint32_t u32;            /**< To atomic-set status + owner. */
};

根據定時器的狀態,我們知道列表中是否存在定時器:

  • STOPPED停止:沒有所有者,不在列表中
  • CONFIG配置:由一個核擁有,不能被另一個核修改,在不在列表中未知,取決於先前的狀態。
  • PENDING待處理:由一個核擁有,在列表中
  • RUNNING運行:由一個核擁有,不能被另一個核修改。在列表中。

不允許在CONFIG或RUNNING狀態下重置或停止定時器。修改定時器的狀態時,應使用CAS(比較並交換)指令來保證狀態及所有者被原子地修改。

在rte_timer_manage()函數內部,跳表將作為一個常規鏈表來遍歷級別0的列表(包含所有定時器條目)直到遇到尚未到期的條目。當列表中有條目,但是沒有任何定時器到期時,為了提高性能,第一個定時器條目的到期時間保存在每個邏輯核的定時器列表結構中。在64位平台上,可以直接檢查該值,而無需對整個結構進行鎖定。(由於將到期時間是一個64位值,32位平台上如果不使用比較交換(CAS)指令或使用鎖,將無法直接對該值進行檢查。因此將跳過此附加檢查,而在某次獲得鎖后再進行檢查)。在64位和32位平台上,調用核的定時器列表為空的情況下對rte_timer_manage()的調用將不帶鎖返回。

3 用例

在垃圾收集器或某些狀態機(ARP,橋接等)下,定時器庫被用於定期調用。

4 參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM