- 什麼是負載分擔
- 如何通過Hash算法實作負載分擔
- 如何處理Eth-Trunk負載分擔不均
- 成員數量是否為2的N次方
- 是否存在跨裝置堆疊
- 是否存在Hash極化問題
- 流量類型與負載分擔模式是否比對
什麼是負載分擔
在網絡部署當中,當存在多條轉發路徑的時候,常常會部署負載分擔功能。通過部署負載分擔,裝置可以基于封包内容等進行逐流轉發,或者基于随機數、輪轉方式進行逐包轉發,以達到充分利用鍊路,提高轉發效率的目的。
基于逐包負載分擔方式的實際部署較少,因為該方式可能導緻同一個使用者的流量經過網絡的不同路徑傳輸後,到達目的裝置出現封包亂序或多份的情況。常見的負載分擔方式一般選擇基于逐流進行負載分擔。
逐流負載分擔即按照一定的規則,如根據五元組(源IP位址、目的IP位址、協定号、源端口号、目的端口号),将封包分成不同的流。同一條流的封包,經過Hash計算後,會在同一條鍊路上轉發。
如圖1-1所示,假設DeviceA上有6個封包要通過DeviceA和DeviceB之間的LinkA和LinkB進行負載分擔,其發送順序為P1、P2、P3、P4、P5、P6,其中P2、P3和P5去往DeviceC,P1、P4、P6去往DeviceD。假設負載分擔采用逐流方式,則去往DeviceC的封包都通過LinkA發送,去往DeviceD的封包都通過LinkB發送;或者去往DeviceC的封包都通過LinkB發送,去往DeviceD的封包都通過LinkA發送。
圖1-1 逐流負載分擔示意圖

如何通過Hash算法實作負載分擔
常見的負載分擔處理過程包含輸入(流量、封包的有效字段)、處理(通過Hash算法進行計算)和輸出(根據計算結果将流量通過相應的出接口轉發)。其中,通過Hash計算的結果會直接影響負載分擔的效果,是以如何利用好Hash算法進行計算,在負載分擔部署當中就顯得尤為重要。
圖1-2 Hash算法流程
如圖1-2所示,Hash計算的流程如下:
- 擷取封包的資訊,對于普通的IP封包,為源MAC、目的MAC、源IP、目的IP、VLAN、四層端口号等。按照配置的流量模型,将這些資訊作為Hash因子的參考值。
- 根據Hash算法和Seed對Hash因子進行計算,得到Hash Key。
其中,Hash算法是晶片提供固定種類的算法,不同的算法對于不同的流量模型計算的效果不同,有多種算法以供選擇,可以通過hash-mode hash-mode-id參數選擇Hash算法。
另外,Seed是一個數值,用于參與計算。在相同Hash因子的情況下,Seed值會影響計算出的Hash Key的值,通過指令seed seed-data設定Seed值。
- 為了讓同一個Hash因子衍生更多的變化,以更加靈活地适應不同的Hash場景,裝置晶片可以對Hash Key的值進行0~15位的偏移,可以通過universal-id universal-id參數進行設定Hash Key的值。
- 将Hash Key轉化為Offset值,Offset值與出口個數進行取餘運算,根據結果決定封包從裝置的哪一個接口發出去。
如何處理Eth-Trunk負載分擔不均
正常情況下,流量在Eth-Trunk負載分擔後,會被配置設定到多條鍊路上傳輸。Eth-Trunk負載分擔不均是指流量通過負載分擔後,僅被集中配置設定到一條或者某幾條鍊路上傳輸,而其他鍊路無流量或者流量較少的情況。如果單條鍊路的流量較大,可能會影響業務的正常運作。
成員數量是否為2的N次方
Eth-Trunk每個發送周期有16個發送封包的時隙,Eth-Trunk成員口輪流使用這16個時隙發送封包。
當Eth-Trunk成員口數量是2的N次方時,可以使得負載分擔更均勻。例如,如果Eth-Trunk成員口數量是2、4或8(可以整除16),每個接口得到的發送封包的時隙是整數,負載分擔就均勻;如果成員口數量不是2的N次方(比如3個),在16個時隙裡有1個接口得到了6次發送封包的機會,另外兩個接口隻得到5次發送封包的機會,負載分擔就不均勻。是以,Eth-Trunk成員口數量最好是2的N次方,保證負載分擔更均勻。
是否存在跨裝置堆疊
CE交換機在堆疊場景下預設開啟Eth-Trunk本地優先轉發功能,即從本裝置進入的流量,優先從本裝置的出接口轉發出去。本地優先轉發可以降低轉發延時,降低堆疊鍊路的使用率。
如圖1-3所示,SwitchA與SwitchB組成堆疊,上下行加入到Eth-Trunk。如果沒有本地優先轉發,則從SwitchA進入的流量,會有一部分經過堆疊線纜,從SwitchB的實體接口轉發出去。裝置啟用本地優先轉發之後,從SwitchA進入的流量,優先從SwitchA的接口轉發。
圖1-3 流量本地優先轉發示意圖
預設開啟本地優先轉發的情況下,同框的Eth-Trunk成員口負載分擔均勻,不同框的Eth-Trunk成員口負載分擔不均勻。要解決跨裝置堆疊場景中的不同裝置的成員口負載分擔不均問題,可以按照以下步驟處理。
- 在任意視圖下,執行指令
,檢查Eth-Trunk成員口是否跨裝置,如堆疊場景下不同裝置上的接口捆綁成Eth-Trunk端口。display interface eth-trunk [ trunk-id [ .subnumber ] | main ]
- 如果Eth-Trunk成員口是跨裝置的,去使能Eth-Trunk接口流量本地優先轉發功能。即在Eth-Trunk接口視圖下,執行指令
。local-preference disable
<HUAWEI> system-view
[~HUAWEI] interface eth-trunk 10
[*HUAWEI-Eth-Trunk10] local-preference disable
[*HUAWEI-Eth-Trunk10] commit
關閉本地優先轉發功能後,部分流量會跨裝置之間的堆疊鍊路,需要保證該鍊路帶寬足夠。
是否存在Hash極化問題
Hash極化,也被稱為Hash不均,是指流量經過2次或2次以上Hash後出現的負載分擔不均勻的現象。常見于跨裝置的多次Hash場景,即第一級進行Eth-Trunk Hash,第二級再進行ECMP Hash或者Eth-Trunk Hash。在同一裝置上,若存在ECMP的出接口為多個Eth-Trunk也可能會出現Hash極化。
圖1-4 Hash極化示意圖
如圖1-4所示,Switch A的入接口有4種流量,出接口為2條等價鍊路,經Hash計算,流量1和流量2走上面的鍊路到Switch B;流量3和流量4走下面的鍊路到Switch C。在Switch B出接口同樣為2條等價鍊路,若采用與Switch A相同或者類似的Hash算法,其Hash的結果将為流量1和流量2走上面的鍊路,而下面的鍊路沒有流量。Switch C的情況類似。這種經過多次Hash後,ECMP或者Eth-Trunk各成員口之間流量極度不均勻的現象稱為Hash極化。
實際上,交換機Hash功能的實作很大程度上取決于晶片,是以當使用同類型晶片的交換機位于網絡中相鄰的層級時,就可能會出現Hash極化問題。是以,在多級網絡中部署ECMP或者Eth-Trunk負載分擔,需要考慮出現Hash極化問題的風險。
解決兩級負載分擔場景下的哈希極化問題,就是要避免兩級裝置使用相同的負載分擔參數。
- 如果流量有多個特征有較大變化時,可以讓兩級裝置采用不同的哈希因子,比如第一級Eth-Trunk使用源IP進行哈希,第二級使用目的IP進行哈希。
第一級Eth-Trunk使用源IP進行哈希。
<HUAWEI> system-view
[~HUAWEI] load-balance profile default
[~HUAWEI-load-balance-profile-default] ip src-ip
[*HUAWEI-load-balance-profile-default] commit
第二級Eth-Trunk使用目的IP進行哈希。
<HUAWEI> system-view
[~HUAWEI] load-balance profile default
[~HUAWEI-load-balance-profile-default] ip dst-ip
[*HUAWEI-load-balance-profile-default] commit
- 如果調整哈希因子後效果不明顯,通過執行指令
,調整兩級的雜湊演算法為不同的算法。eth-trunk hash-mode hash-mode-id
- 如果調整雜湊演算法任然沒有效果,通過執行指令
,調整Eth-Trunk的偏移量universal-id。eth-trunk universal-id universal-id
流量類型與負載分擔模式是否比對
判斷Eth-Trunk接口轉發的封包特征和配置的負載分擔方式是否比對。如果不比對,例如轉發封包的MAC位址變化,而設定的負載分擔方式為src-ip,則無法負載分擔。
識别封包類型
- 确定封包的類型。
确定封包為IP封包、MPLS封包、TRILL封包、FCoE封包等。
- 不同封包的負載分擔方式。
針對不同類型的封包,可以分别配置負載分擔模式。以CE6856HI為例,負載分擔方式如表1 不同封包的負載分擔方式所示。例如,對于IPv4封包,預設情況下根據源IP、目的IP、目的端口号、源端口号進行負載分擔,也可以通過指令行配置負載分擔模式。需要擷取其他款型的負載分擔方式,請參考配置負載分擔方式進行配置。
表1-1 不同封包的負載分擔方式
配置負載分擔方式
- 配置已知單點傳播的負載分擔方式
- 執行指令
,進入Eth-Trunk接口視圖。interface eth-trunk trunk-id
- 執行指令
,配置Eth-Trunk負載分擔方式。load-balance { dst-ip | dst-mac | random | round-robin | src-ip | src-mac | src-dst-ip | src-dst-mac | enhanced [ resilient ] profile profile-name }
- 執行指令
,送出配置。commit
- 配置未知單點傳播的負載分擔方式
- 執行指令
,配置未知單點傳播的負載分擔方式。load-balance unknown-unicast { mac | enhanced }
- 執行指令
,送出配置。commit