王兆輝,沈劍良,張霞,陳艇
(國家數字交換系統工程技術研究中心,河南 鄭州450003)
光纖通道(fibre channel,FC)[1]協議是美國國家標準委員會定義的高速串行通信協議,由于其傳輸距離遠、抗干擾能力強等特點而廣泛應用在航空航天環境下的電子指揮、控制、儀器儀表、仿真、信號處理、傳感器以及視頻數據分發等[2]領域,具有高可靠、高容錯和高帶寬的性能指標需求,而鏈路聚合技術是在不改變原設計架構基礎上增加通道有效帶寬的一種常用方案。
鏈路聚合是將離散數量的多條物理鏈路聚合為一條邏輯鏈路的技術,這是在Internet服務提供商(Internet service provider,ISP)網絡中實現高帶寬連接的一種廣泛使用的方法[3]。當不存在更高帶寬的技術時,通過捆綁幾條帶寬較小的鏈路實現帶寬增加是一種廣泛用于高速交換芯片的數據鏈路技術應用[4],該技術可以提升數據包傳輸的可伸縮性和可靠性,大幅降低額外開銷。同時為了實現成本和公平性的平衡,必須在可用鏈路上平均分配數據包,否則數據包過度集中在少量鏈路上,進而造成鏈路有效通道利用效率低下,導致傳輸時延增加,同時擁塞鏈路端點處的緩沖區溢出也可能導致數據包丟失[5]。
本文針對基于FC的交換芯片設計中鏈路聚合負載均衡、負載不均衡以及可靠性差的問題,提出一種動態負載均衡(flow adaptive load dalancing,FALB)鏈路聚合算法,該設計可以在更加復雜多變的網絡環境中提升對各種聚合鏈路的負載均衡調度靈活性、增加實際可用帶寬、提高鏈路聚合技術的整體功效和系統穩定性。
鏈路聚合技術由于是對子鏈路的“捆綁重組”,在流量傳輸時如何對負載合理分配是研究的核心難點。在配置好一組鏈路聚合組之后,每條子鏈路的流量負載不均衡可能會導致部分鏈路擁塞,同時也會造成整體聚合鏈路的實際可用帶寬過低。為了避免這種情況,系統需要在多條鏈路上執行負載的均衡分配[6],提升負載均衡算法的均衡性和可靠性是優化聚合鏈路設計的主要研究方向[7]。
(1)均衡性
IEEE 802.3ax標準的鏈路聚合控制協議(link aggregation control protocol,LACP)是關于動態鏈路聚合配置的協議[8],它通過協議報文鏈路聚合控制協議數據單元(link aggregation control protocol data unit,LACPDU)和相連的設備交互信息。當端口啟用LACP后,端口通過發送LACPDU給CPU,上報優先級、系統MAC地址、端口的優先級、端口號和操作指令等信息[9-10],然后CPU再根據這些端口和鏈路信息對數據包路由傳輸動態調度,但是該協議僅支持以太網協議傳輸的設備,如何在基于FC協議的交換設備中通過LACP進行動態鏈路聚合還少有相關機構研究。而TFRC(TCP-friendly rate control)算法是一種針對視頻流數據傳輸的調度算法[11],該算法使用傳輸速率作為鏈路擁塞控制的基礎,并以此來反映鏈路質量的動態變化。通過系統實時獲得的鏈路傳輸速率,可以做到對各鏈路的動態調度。可以有效地提高鏈路帶寬并監控鏈路狀態。但是由于該算法僅針對視頻流數據,在擁塞控制的基本單元選擇上不適用于FC交換網絡。
(2)可靠性
Akbari等[12]提出的STreLo算法是用于在聚合鏈路存在的情況下定位鏈路故障,該算法使用分段路由,通過發送周期探測包來定位鏈路的故障位置,保證鏈路的可靠性,具有毫秒級的定位速度和可擴展性,但同時也存在功耗大、設計復雜的不足,在對于一些拓撲簡單的聚合鏈路組中的實用性較低。Wenzel等[13]提出的單獨的分發策略方案,可以在聚合鏈路部分失敗的情況下通過引用備份鏈路來保障整個鏈路組的正常運作,具有高度的靈活性,但同時增加備用鏈路也意味著資源開銷的增加。在目前實際工程設計中,鏈路聚合的主流設計還是采用哈希算法對子鏈路進行靜態權重配置,隨著技術的不斷發展,對于聚合鏈路的實際可用帶寬比要求不斷提高,需要對傳統靜態負載均衡算法進行平衡性和可靠性優化。
本文根據LACP的動態交互和備份鏈路設計思想,結合FC協議特點,提出了動態負載均衡算法FALB,可靠性方面提出斷鏈重配置機制,保證在個別子鏈路出現掉鏈的情況時不影響整個鏈路組的數據傳輸,均衡性方面支持流量自適應的負載均衡調度,實驗表明可以在多種流量轉發模式下均收斂到95%以上的有效帶寬比,并通過了多種可靠性功能驗證。
本節首先介紹基于FC協議的動態鏈路聚合整體設計思路,然后介紹FALB負載均衡調度算法,本文針對FC協議報文特點,通過流量監控加哈希條目重分配的方式實現基于流量的動態負載均衡。
由于需要對子鏈路的負載分配權重進行動態調整,所以如何設計流量監控和負載均衡算法是核心要點。為了實現基于動態的負載均衡,本設計采用流量監控反饋和鏈路權重計算的方式實時負載調整,整體設計框架如圖1所示。首先配置好整個鏈路聚合組的子鏈路通道端口號,在未有流量通過時平均分配哈希條目權重,在有流量通過鏈路組子鏈路進行路由傳輸時,對每個子鏈路的通道入端口進行流量統計和狀態監控,并將每個端口的狀態信息數據實時上傳控制平面。

圖1 聚合鏈路組設計整體框架
在數據包進入聚合鏈路組后首先進行包頭字段處理。FC協議包頭字段格式如圖2所示,FC-FS-4協議規定最大可支持2 148 bit(不含擴展幀頭)的FC協議報文。為了提取數據包路由指示信息,保證數據包的傳輸序列不變,本文中選取包頭域段中的D_ID和S_ID作為哈希函數的計算輸入值,域段D_ID表示數據包的目的地址,S_ID則表示數據包的源地址,根據兩組共48 bit位寬的域段信息可以將每個數據包的次序定位,以保證不會出現數據包傳輸亂序的情況。在完成包頭字段提取操作后將兩組位寬24 bit的域段值進行拼接后作為每個數據包的哈希函數輸入值,哈希表共設置256個條目值作為每條子鏈路的映射地址,通過對這256個條目的分配來決定每條子通道的負載分配權重。在流量監控方面采用對每條子鏈路端口的進包數進行統計并上傳,根據各子鏈路的負載情況進行調度重配置后實現對哈希輸出條目映射域的動態控制。

圖2 FC協議包頭字段格式
由于是哈希查表結果決定具體每條子鏈路的負載分配方案,所以動態調度算法是整個聚合鏈路的核心設計。FALB動態調度算法的設計是通過計算并更新每條子鏈路對應的哈希條目地址權重值來實現負載的動態均衡配置。這里首先計算每條子鏈路的端口負載速率,記每條子鏈路的端口速率為Xt,Xt的計算式如式(1)所示:

其中,Xt表示第t個子物理鏈路的端口負載速率,St表示第t個子物理鏈路的端口負載長度,T表示時鐘周期。根據從控制平面中得到的端口速率數值反饋,權重調度算法可以得到每個子鏈路的哈希地址條目有效值Pt,其計算式如式(2)所示:

其中,R代表總哈希條目值,c代表敏感系數,流量自適應的負載均衡效果受敏感系數的影響,取值為1時為完全動態負載均衡(默認為1),根據每時刻的Pt值對哈希查表的結果條目值映射域變化實現動態的負載均衡控制。具體流程如圖3所示,首先提取S_ID和D_ID的輸入值,然后根據式(2)計算每條子鏈路的哈希有效條目值(Pt),當有流量通過入端口時就會觸發流量監控模塊,此時會將各子通道的流量數據上傳CPU并重新計算Pt值,如果不變則不改變子鏈路通道的哈希條目值映射范圍,如果Pt值改變則重新計算和分配哈希條目的地址映射。

圖3 流量監控調度流程
可靠性優化方面,為了保證鏈路的穩定性,設計了斷鏈重分配機制,如圖4所示。每條子鏈路對應一段哈希地址的映射域。由于該調度算法可以實時監控每條子鏈路的流量情況,所以當其中一條或幾條鏈路出現故障時,該機制可以使故障鏈路的映射賦值使能關閉,并將屬于該鏈路的哈希映射地址平均分配給該鏈路組的其他成員,同時根據目前已建鏈的子鏈路數重新分配哈希表的條目地址映射,從而不影響整個鏈路組的數據傳輸。由于斷鏈后僅僅是將問題鏈路的映射使能位關閉而其物理端口號仍屬于原聚合鏈路組,所以當故障排除完畢后,可以立即恢復該鏈路的正常工作狀態,節省了二次配置的時間,同時也提升了整體鏈路組的可靠性。

圖4 斷鏈重分配機制
本文實驗使用數據仿真加FPGA功能驗證作為實驗設計方案,仿真使用Vivado驗證平臺對基礎功能模塊進行時序分析驗證,FPGA驗證使用Xilinx Virtex UltraScale440的FPGA板卡作為本實驗的環境開發板卡和Xgig光纖通道發包儀作為FC數據包發送設備來構建實驗環境,并對實驗結果進行了分析。
數據仿真方面Vivado仿真驗證平臺是FPGA廠商賽靈思公司2012年發布的集成設計環境,采用層次化器件編輯器和布局規劃器設計可以用于快速綜合和verilog模塊級代碼的邏輯功能仿真和時序分析,本實驗以 Virtex 7vx980tffg1930-2L 為核心芯片,采用312.5 MHz的時鐘頻率進行時序仿真驗證。
Vivado仿真結果如圖5所示,8條子物理鏈路的聚合鏈路組配置后,設置隨機類型域特征的S_ID和D_ID值的包頭,共配置8條子通道計數器(trunk0_num0_cnt0-7),每個計數器代表每條通路的實際流量情況。結果顯示正常發送不同的S_ID和D_ID數值的FC數據包后,每條子通路計數正常且符合預期,符合時序功能要求。

圖5 Vivado仿真結果
由于鏈路聚合技術是將多條子鏈路整合為一條邏輯電路的技術,所以理論上整合后的鏈路組帶寬應該為所有子鏈路帶寬之和,但是實際工程應用中,鏈路組的實際帶寬取決于其負載均衡特性,所以本實驗分別設計3種流量發送模型,具體參數見表1。通過縮小數據包的S_ID和D_ID取值范圍,可以有效地增加流量的集中度(范圍越小,代表流量轉發端口區域越集中,均衡難度越大)。

表1 流量測試模型
建立如圖6所示實驗連接拓撲模型,將兩塊440FPGA開發板的兩個bank對接后,設置port0~port7端口為一條聚合鏈路,并采用8 GB/s(滿負載)的速率發送數據包,計算每組3種模式的有效帶寬比(實際有效帶寬與理論帶寬之比)。實驗結果如圖7所示,其中橫軸為時間點,縱軸為聚合鏈路組的有效帶寬比。

圖6 實驗連接拓撲

圖7 FALB負載均衡算法實驗結果
根據實驗數據結果可以看出,在發送測試數據流時兩種算法的流量負載均衡效果區別明顯,隨著流量集中度的增加(模式1~模式3),傳統靜態負載均衡算法的均衡性不斷下降,在模式3流量集中度到達50%時,聚合鏈路組的有效帶寬比下降到50%以下,可以看出隨著流量集中度的增加,傳統靜態負載均衡算法的負載均衡性能在不斷下降,這是由于傳統靜態負載均衡算法無法根據實際流量情況動態調整各子鏈路的負載分配策略而導致負載分配不均,尤其當負載集中于部分子鏈路時由于無法及時調整分配策略從而導致有效帶寬的浪費。而FALB在3種模型中均保持80%以上且收斂于95%的有效帶寬比,且3種模式下的變化程度很小,說明該算法無論在高擁擠的還是分布更加發散的流量模型中均可以保持高效的負載均衡。實驗結果表明FALB具有更好的負載均衡特性和穩定性。
在實際工程中,鏈路的可靠性測試是檢驗在遇到常見故障時整體功能的完整性。本節中設置了3種測試方法,分別在1 GB/s、2 GB/s、4 GB/s、8 GB/s端口發包速率下進行熱插拔(數據包正常發送過程中光纖端口的拔出和插入)、鏈路成員移除和鏈路成員增加的數據包發送可靠性測試,結果見表2,在所有支持速率下進行的3種可靠性測試均可以正常工作,具有較高的可靠性。

表2 可靠性測試
本文提出一種動態負載均衡的FALB調度算法的鏈路聚合設計,并最終在FPGA上實現,該設計可以在保證鏈路可靠性的基礎上實現基于流量自適應的負載均衡效果,支持斷鏈重連,提升鏈路傳輸效率。在選擇鏈路時,使用優化的動態平衡算法可以有效地避免子鏈路負載分配不均所造成的有效帶寬比過低的問題。FALB鏈路聚合算法在相比較于傳統靜態負載均衡方案具有更好的負載均衡效果,可靠性更強,更適用于當前流量分布不均、實際帶寬要求更高的網絡應用環境,未來通過結合可編程協議解析技術,還可以使該算法的調度選擇域由用戶自定義選擇,從而增加整體設計的安全性和靈活性。