透過HTB共享頻寬和優先即時流量,哪種場景效果更好?

透過HTB共享頻寬和優先即時流量,哪種場景效果更好?

我想為我們的網路線路添加某種流量管理。在閱讀了大量文件後,我認為 HFSC 對我來說太複雜了(我不明白所有曲線的東西,我擔心我永遠不會正確),不推薦 CBQ,基本上 HTB 是解決問題的方法適合大多數人。

我們的內部網路有三個“部分”,我希望在這些部分之間或多或少平等地共享頻寬(至少在開始時)。此外,我必須根據至少三種流量(即時流量、標準流量和批量流量)對流量進行優先排序。頻寬共享並不重要,重要的是即時流量應始終被視為優質流量,但當然其他流量類別也不會匱乏。

問題是,什麼更有意義並且還能保證更好的即時吞吐量:

  1. 每個段創建一個類,每個類具有相同的速率(根據HTB 開發人員的說法,對於沒有葉子的類,優先級並不重要),並且每個類都有3 個優先級的三個子類(葉子)(具有不同的優先順序)和不同的費率)。

  2. 每個優先級在頂部有一個類,每個類具有不同的速率(同樣,優先級無關緊要),每個類都有3 個子類,每個段一個,而實時類中的所有3 個子類都具有最高的優先級,批量中最低的優先級類,等等。

我將嘗試使用以下 ASCII 藝術圖像使這一點更加清晰:

Case 1:

root --+--> Segment A
       |       +--> High Prio
       |       +--> Normal Prio
       |       +--> Low Prio
       |
       +--> Segment B
       |       +--> High Prio
       |       +--> Normal Prio
       |       +--> Low Prio
       |
       +--> Segment C
               +--> High Prio
               +--> Normal Prio
               +--> Low Prio

Case 2:

root --+--> High Prio
       |        +--> Segment A
       |        +--> Segment B
       |        +--> Segment C
       |
       +--> Normal Prio
       |        +--> Segment A
       |        +--> Segment B
       |        +--> Segment C
       |
       +--> Low Prio
                +--> Segment A
                +--> Segment B
                +--> Segment C

案例 1 似乎是大多數人都會這樣做的方式,但除非我沒有正確閱讀 HTB 實作細節,否則案例 2 可能會提供更好的優先順序。

HTB 手冊說,如果一個類別達到了其速率,它可以從其父級借用,並且在藉用時,優先順序較高的類別總是首先獲得提供的頻寬。然而,它也表示,在較低樹級別上具有可用頻寬的類始終優先於在較高樹級別上的類,無論優先順序如何

我們假設以下情況:段 C 未發送任何流量。網段 A 僅盡可能快速地發送即時流量(足以單獨使鏈路飽和),而網段 B 僅盡可能快速地發送批量流量(同樣,足以單獨使整個鏈路飽和)。會發生什麼事?

情況 1:
Segment A->High Prio 和 Segment B->Low Prio 都有資料包要傳送,由於 A->High Prio 具有更高的優先級,因此它始終會首先被調度,直到達到其速率。現在它嘗試從 Segment A 借款,但由於 Segment A 處於較高級別,而 Segment B->Low Prio 尚未達到其利率,因此現在首先服務該類別,直到它也達到利率並想要從段B。者都達到了其利率,兩者再次處於同一水平,現在段A->高Prio 將再次獲勝,直到它達到段A 的利率。分段C 沒有使用任何其保證流量),但同樣,它必須等待分段B->低優先權也達到根級。一旦發生這種情況,就會再次考慮優先級,這次段 A->高優先級將獲得段 C 剩餘的所有頻寬。

情況2:
高優先級->段A和低優先級->段B都有資料包要發送,同樣高優先級->段A將獲勝,因為它具有更高的優先權。一旦達到其速率,它就會嘗試從具有空閒頻寬的 High Prio 借用,但在更高的等級上,它必須等待 Low Prio->Segment B 再次達到其速率。一旦兩者都達到了各自的利率並且都必須藉款,High Prio->A 段將再次獲勝,直到達到 High Prio 類別的利率。一旦發生這種情況,它會嘗試從root借用,而root仍然有足夠的頻寬(此時Normal Prio的所有頻寬都未使用),但它必須再次等待,直到Low Prio->Segment B達到了Low Prio ->Segment B的速率限制。最後,兩個類別都嘗試從根借用,考慮優先級,高優先級->段 A 獲得根剩餘的所有頻寬。

這兩種情況似乎都不是最佳的,因為無論哪種方式,即時流量有時都必須等待批量流量,即使有足夠的頻寬可以藉用。然而,在情況 2 中,實時流量的等待時間似乎比情況 1 短,因為它只需要等到達到批量流量速率,這很可能小於整個段的速率(並且在情況1 這是它必須等待的速率)。或者我在這裡完全錯了?

我考慮了更簡單的設置,使用優先級 qdisc。但優先權佇列有一個大問題,如果不加以限制,它們會導致飢餓。飢餓是不可接受的。當然,可以在每個優先權中放置一個 TBF(令牌桶過濾器)來限制速率,從而避免飢餓,但這樣做時,單一優先權不能再自行使連結飽和,即使所有其他優先權是空的,TBF 將阻止這種情況發生。這也是次優的,因為如果目前沒有其他類別需要任何線路頻寬,為什麼一個類別不能獲得 100% 的線路頻寬呢?

關於此設定有什麼意見或想法嗎?使用標準 tc qdisc 似乎很難做到。作為一名程式設計師,如果我可以簡單地編寫自己的調度程式(我不允許這樣做),那麼這是一項非常簡單的任務。

答案1

如果我正確理解htb,那麼利率是「有保證的」。這意味著你關於「即時」流量速率的想法。只有超過這個利率,它才會借錢。如果有幾個班級想要藉錢,prio應該啟動。不然就太麻煩了。

恕我直言,情況 A 永遠不會真正起作用,因為您需要在根級別進行優先級或速率限制。不同段的優先順序/費率彼此不了解,並且將被同等處理。

您可能想要的是:將低優先級和正常優先級的“速率”設置為 0 或接近它,並為其餘頻寬添加“上限”,對於高優先級,您保證 100% 的物理速率。

相關內容