本發(fā)明涉及FPGA(Field-Programmable Gate Array現(xiàn)場可編程門陣列)領(lǐng)域,涉及以太接入網(wǎng)領(lǐng)域,提出了一種基于FPGA實現(xiàn)的大批量流表老化的高效的方法。
背景技術(shù):
在以太接入網(wǎng)通常需要對流進行管理,這里的流是指在某一段持續(xù)的時間內(nèi),具有相同五元組元素的一組連續(xù)的報文序列。流具有從建立到結(jié)束的完整生命周期。流管理是指在流建立到結(jié)束(即流老化)的整個生命周期中,對該流的報文進行計數(shù)、轉(zhuǎn)發(fā)和丟棄的操作。
流管理的處理流程及流表結(jié)構(gòu)如圖1、2所示,圖2中的N表示桶深。流表項內(nèi)容如表1、2所示。流表老化的方式有兩種:刷新流老化和非刷新流老化。刷新流老化是指從最后一個報文開始,該流在指定老化時間內(nèi)沒有被采集到而被自動老化,這種老化稱為刷新流老化;非刷新流老化是指從建立流的第一個報文開始計算時間,超過設(shè)定時間后被老化,這種老化稱為非刷新老化。本發(fā)明主要針對非刷新老化。
表1:HASH桶表項:
表2HASH節(jié)點表項
通常的流表老化機制都是通過遍歷當前表項所在hash桶直到遍歷完所有表項,是單一表項操作的。但當流表項數(shù)量特別龐大(上千萬條流),老化精度又比較高(幾秒)的應(yīng)用場景下,使用單一表項老化的方式使得老化效率非常低。假設(shè)流表項數(shù)量為3000萬,老化精度為1s,存儲流表的內(nèi)存(DDR3-1600SDRAM)的讀寫操作延時為27.5ns,內(nèi)存讀寫時鐘頻率為200MHz,完成單個表項老化需要兩周期(讀hash桶+讀hash節(jié)點),若使用單一表項的方式進行老化,完成3000萬條流表可以使用25bit位寬的hash桶,假設(shè)內(nèi)存只用于老化操作,則完 成一次遍歷需要3200萬*(27.5ns+5ns)+3000萬*(27.5ns+5ns)=2s的時間,老化精度無法達到1s,并且老化操作占用的內(nèi)存過多,留給建流、查表等內(nèi)存操作的比例就非常少,使得整個流管理效率非常低。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)中存在的技術(shù)問題,本發(fā)明的目的在于提供一種提高大批量網(wǎng)絡(luò)流表老化效率的方法及裝置。
本發(fā)明對原有系統(tǒng)硬件不做任何改變,完成老化效率的提高;其特征在于應(yīng)用可編程邏輯器件的現(xiàn)有資源,實現(xiàn)流表的高速老化。
為實現(xiàn)上述目的,本發(fā)明的技術(shù)方案為:
一種提高大批量網(wǎng)絡(luò)流表老化效率的方法,其特征在于,對網(wǎng)絡(luò)流表進行分批老化,對于每一批讀取的N個桶,其步驟為:
1)將該批hash桶中的有效指針存到指針FIFO中;當該批hash桶讀取結(jié)束時,進行步驟2);
2)從內(nèi)存中查找指針FIFO中指向的hash節(jié)點,然后根據(jù)配置的老化時間判斷該hash節(jié)點是否需要老化,若需要老化,則對該hash節(jié)點進行老化并將該hash節(jié)點中的下一個指針標志有效的hash節(jié)點指針存入指針FIFO中;
3)判斷當前指針FIFO是否為空,如果不為空,則進行步驟2)。
進一步的,采用可編程邏輯器FPGA對網(wǎng)絡(luò)流表進行分批老化;根據(jù)FPGA的內(nèi)存操作時延T和FPGA的存儲FIFO的深度D確定每批hash桶個數(shù)N。
進一步的,內(nèi)存操作時延T=C*1/F;其中,F(xiàn)為FPGA的內(nèi)存控制器讀寫時鐘頻率,C為老化內(nèi)存讀時延周期數(shù)。
進一步的,N>T*F1,其中,F(xiàn)1為FPGA的時鐘頻率。
進一步的,N<D-P,P表示FIFO的余量。
一種提高大批量網(wǎng)絡(luò)流表老化效率的裝置,其特征在于,包括流老化模塊和流老化配置模塊;其中,流老化配置模塊,用于配置網(wǎng)絡(luò)流表老化時間以及每批讀取的hash桶個數(shù)N;流老化模塊,用于根據(jù)配置的hash桶個數(shù)N分批讀取并緩存網(wǎng)絡(luò)流表的hash桶;以及將hash桶中的有效指針存到指針FIFO中;以及從內(nèi)存中查找指針FIFO中指向的hash節(jié)點,然后根據(jù)配置的老化時間判斷該hash節(jié)點是否需要老化,若需要老化,則對該hash節(jié)點進行老化并將該hash節(jié)點中的下一個指針標志有效的hash節(jié)點指針存入指針FIFO中,直至當前指針FIFO是否為空。
本發(fā)明流程如圖3所示,包括:
a.分多次完成所有流表的老化,每次小批量讀取hash桶并老化hash桶下一個指針有效的有效hash節(jié)點。
根據(jù)FPGA的內(nèi)存操作時延T和FPGA的存儲FIFO的深度D確定每批hash桶個數(shù)N。假設(shè)內(nèi)存控制器讀寫時鐘頻率為F,老化內(nèi)存讀時延周期數(shù)C,則T=C*1/F;一次小批量老化時間只有大于內(nèi)存讀延時,才能避免等待,提高老化內(nèi)存利用率。假設(shè)邏輯處理時鐘頻率為F1,則N>T*F1。
假設(shè)FPGA內(nèi)部FIFO深度D,則N<D-P,P表示FIFO的余量,用于反壓的處理。
假設(shè)所有流表的hash桶總深度為M,則按HASH值大小順序小批量刷新hash桶的次數(shù)為[M/N]+1。
b.讀取hash桶的有效節(jié)點地址存到FIFO中,一次批量讀取hash桶結(jié)束時,從FIFO中讀節(jié)點地址并從內(nèi)存中查找hash節(jié)點,將hash節(jié)點的流建立時間與當前時間對比,若時間差大于等于配置的老化時間,即當前hash節(jié)點需要老化,則刪除該hash節(jié)點,若當前hash節(jié)點不需要老化則結(jié)束。
c.對于有hash沖突的場景,即不同的流有相同的hash值,同一條hash桶下掛了多個hash節(jié)點的場景,只需在b處理過程中判斷有效hash節(jié)點中的下一個節(jié)點指針是否有效,若有效,則說明有hash沖突,把沖突節(jié)點的地址存入沖突FIFO,等上一批節(jié)點處理結(jié)束從沖突FIFO中讀取沖突節(jié)點地址并從內(nèi)存中查找沖突節(jié)點。
d.在每次小批量老化間隙可以進行流管理處理的建流,流查找等操作,實現(xiàn)分時復用內(nèi)存,提高內(nèi)存的利用率。
與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果:
本發(fā)明基于FPGA實現(xiàn),分多次完成大批量流表的老化,每次完成小批量hash桶的老化,使用pipeline模式,抵消了內(nèi)存操作結(jié)果等待時間,提高了老化性能,降低了老化的內(nèi)存占用率。同時在每次小批量老化的間隙可進行建流,查表等操作,最大限度利用內(nèi)存,提高流管理的性能。
附圖說明
圖1為流管理處理流程圖;
圖2為流表結(jié)構(gòu)圖;
圖3為本發(fā)明流表老化的處理流程圖;
圖4為本發(fā)明裝置功能結(jié)構(gòu)整體示意圖;
圖5為單次老化的流程圖。
具體實施方式
下面結(jié)合附圖,進一步詳細描述本發(fā)明的實施例:
如圖4所示,本發(fā)明的整個裝置模塊,由多個子功能模塊構(gòu)成,其中包括
MIG_APP模塊:內(nèi)存控制器,由FPGA內(nèi)部的IP core提供。
flow_aging模塊:流老化模塊。批量讀取內(nèi)存流表信息,將有效流表結(jié)果存在FIFO(先入先出隊列)里,再從FIFO里讀取流表節(jié)點內(nèi)容,根據(jù)節(jié)點的建立時間和老化時間進行老化處理,根據(jù)節(jié)點的下一個指針是否有效判斷是否有hash沖突,對沖突節(jié)點進行重復相同的老化處理。
aging_dbg模塊:流老化配置模塊。PowerPC通過RGMII接口與FPGA相連,全局靜態(tài)配置流表老化時間,小批量刷新個數(shù)等信息。
大批量的hash桶和hash節(jié)點存在內(nèi)存sdram中,小批量讀取的hash桶和hash節(jié)點結(jié)果存于FPGA內(nèi)部的FIFO中,然后根據(jù)FIFO中存儲的小批量hash桶和hash節(jié)點的結(jié)果內(nèi)容(hash鏈指針是否有效,是否有hash沖突,是否到老化時間)決定是否需要進行多次操作。
以hash沖突為2的流表老化為例,其時間維度的老化模塊流程為:
1、從內(nèi)存讀取N(假設(shè)N=1000)個hash桶;
2、把返回的hash桶的有效指針存入指針FIFO,無效指針丟棄;
3、在讀完1000個hash桶時,指針FIFO若非空,讀取指針FIFO,同時從內(nèi)存SDRAM中讀取當前指針FIFO確定的有效hash節(jié)點;
指針FIFO若為空,則說明此次批量讀取的hash桶下沒有有效節(jié)點,等待下一次的批量讀取。
4、比較返回的有效hash節(jié)點的建立時間和FPGA邏輯內(nèi)部的計時器內(nèi)容,若時間差大于或等于老化時間,說明該節(jié)點需被老化,把待老化節(jié)點內(nèi)容存入節(jié)點FIFO;若時間差小于老化時間,說明當前節(jié)點無需老化,進入步驟5;同時如果節(jié)點的下一個指針標志有效,說明有hash沖突,把沖突節(jié)點指針存入指針FIFO。指針是指節(jié)點地址。
5、若指針FIFO為非空(hash沖突的指針),重復步驟3,4,即將沖突節(jié)點作為有效節(jié)點進行處理,沖突節(jié)點的時間達到老化時間,就將其刪除;若指針FIFO為空,判斷節(jié)點FIFO,若非空,則轉(zhuǎn)到步驟6;若節(jié)點FIFO為空,則此次批量老化結(jié)束,等待下一次的批量處理。
6、刪除待老化的節(jié)點:即通過寫節(jié)點把hash桶或hash節(jié)點中的有效指針置0。
圖5中的T1表示單次刷新沒有hash沖突,并且節(jié)點不到老化時間情況下的刷新所需時間;
T2表示hash沖突為2,節(jié)點無需老化的刷新時間;
T3表示hash沖突為2,節(jié)點需要老化的刷新時間。