前言:QoS是網絡中提供差異化服務的重要方法,它通過區分不同的流量和優先級,為不同的應用和使用者提供不同質量的網絡服務,比如,金融網絡,可能購買了專線,要求延遲小,更不能忍受丟包,自然優先級就高些;又比如網絡直播和游戲,對於網絡的延遲要求非常高,而普通的上網用戶則沒有這么高的要求(土豪除外)。DPDK中提供了QoS的參考框架,包含了多個流程組件,十分有趣。
一.DPDK QoS 概述
在DPDK提供的QoS框架中,一個復雜的處理流程被分成了幾個不同的處理階段,如下圖所示:

對於這些流程中模塊,其具體解釋是這樣的:

從這個圖中可以看出,整個包的處理過程被分成了4個階段完成。
- 1.第一階段是在線程0中的,主要的工作就是接收包然后進行檢查校驗。
- 2.第二階段是一個重點,主要工作是進行流分類,測速和負載均衡。把不同的流量導到不同的工作負載核上。
- 3.第三階段是在不同的負載核上處理業務報文。
- 4.第四階段也是一個非常重要的階段,主要工作是根據算法調度,丟棄,最后發送出去。
這次重點介紹QoS的部分,也就是第四階段,第二階段的流分類和負載均衡在后面再進行單獨說明。
二.DPDK QoS模塊分析
因為重點分析的是第四階段的處理過程,所以,這個階段中主要包含3個模塊:測速標記模塊(流量監督,police),棄包策略模塊(擁塞避免,dropper),調度模塊(擁塞管理,sched)。依次說明這三個部分。
在QoS里,有兩個概念:流量監督和流量整形。他們的區別是流量監督對於不符合流量特征的報文直接丟棄,而流量整形對於不符合流量特征的報文進行緩存,減少了丟包;自然,相對的,流量整形可能就引入延遲,而流量監督幾乎不會導致延遲。
2.1 測速標記模塊
測速模塊主要就是測量一個流的速度,然后根據速度情況打上顏色標記。DPDK中提供了2種測速標記算法---srTCM(單速三色標記)和trTCM(雙速三色標記)。通過算法計算,會根據結果為每個包標記上紅或者綠或者黃三種顏色。
2.1.1 令牌桶算法
無論是srTCM還是trTCM都是基於令牌桶算法實現的,了解了令牌桶算法,就了解了這兩種測速標記算法的大部分。簡單的說,令牌桶算法測速限速的原理就是:每個符合規則的報文,只有在從桶中拿到令牌后才能發送出去。那桶中的令牌是怎么來的呢?可以自己設置桶中令牌生成的速度,也就是通過設置生成令牌的生成速度來定義發送數據包的速度。通常為了數據包解決突發性問題等,會使用2個令牌桶,根據他們各自生成令牌的速度,分為單速三色標記和雙速三色標記。具體詳細的令牌桶算法可以參考如下鏈接:http://blog.csdn.net/maotianwang/article/details/41310957
2.1.2 DPDK測速標記接口
測速標記接口使用起來,非常簡單,主要接口定義在rte_meter.c和rte_meter.h中,在使用前先配置一下限速的參數。struct rte_meter_trtcm_params,這是使用雙速三色算法的配置參數結構體。配置完成后,就在處理每個符合規則的包時,調用rte_meter_trtcm_color_blind_check()來給當前的包標記顏色,這里使用了色盲模式,對於單速和雙速算法,都可以使用色盲或者非色盲模式,他們的差別就是色盲模式對於包已經標記的顏色不關心,只計算當下應該標記什么顏色;而非色盲模式會關心包已經被標記的顏色,再結合當下的情況,綜合以后再標記顏色。
2.2 擁塞避免模塊
擁塞避免使用的主要算法是RED(早期隨機丟棄),當擁塞快要發生前,提前丟棄一些報文,避免最后擁塞發生。當然,這里的隨機丟棄是這樣的:算法設置有兩個閥值,當小於最小閥值時不丟棄,當介於最小閥值和最大閥值之間,隨機丟棄,當大於最大閥值時,采用尾丟棄。如下盜圖:

自然,在隨機丟棄階段,因為所有的包一視同仁,可能會丟棄真正重要的包。因此,可以采用WRED等,帶有權重的隨機丟棄算法,根據優先級的不同選擇丟包。
2.2.1 DPDK擁塞避免接口
擁塞避免接口主要定義在rte_red.c和rte_red.h文件中,使用起來也很簡單,也是要先配置閥值等參數。配置完成后,當數據包到來時,會根據隊列剩余的空間大小,來決定是否需要丟棄數據包。
rte_red_config_init(),對算法的參數進行配置。rte_red_enqueue(),如果返回值為0,則不丟棄;如果返回值為1,則表示超過最大閥值丟棄;如果返回值為2,丟棄,因滿足隨機丟棄條件而丟棄。
擁塞避免模塊經常和擁塞sched一起使用。
2.3 擁塞管理模塊
在擁塞管理模塊中,主要就是一個調度功能。DPDK的調度功能是分層調度,共分為4個層次,如下圖:

其每一層次代表的意思看下圖的解釋:

這種分層調度是個很復雜的過程,具體細節就沒有細究了。最后看一下其接口吧。
2.3.1 擁塞管理接口
首先也是進行每一個層次的初始化配置:
rte_sched_port_config();rte_sched_subport_config();rte_sched_pipe_config(),對於每一層的配置,都有對應的結構體。如struct rte_sched_subport_params等。根據需要設置參數。rte_sched_port_enqueue()嘗試入隊,在其中就會進行RED算法和調度處理,如果符合條件,則可能會丟棄數據包,所以,返回值是實際調度的數據包個數。rte_sched_port_dequeue(), 取出存在隊列中經過調度的包,然后就可以發送了。
三.總結:
QoS為數據包的發送管理提供了一整套的機制,目的在於提高網絡的平穩性,根據網絡業務的情況,合理分配資源,最大限度保障各方網絡使用者都能滿足需求。對於其中的流量監督,整形,調度等多種手段,既可以單獨使用,也可以結合使用,如果配合流分類技術,即可使得QoS對流量的管理更加有針對性。
