在路由器產品的血拼中,最火的莫過于轉發性能。基于此,思科開發了名為CEF的快速轉發平臺,國內各大廠商也迅速跟進,各自開發了自己的快轉平臺,冠以XEF的名稱。雖然各家名字相近,但實際性能卻有較大的差別。性能指標通常以kpps來衡量,分為空轉性能和負載性能。個人認為,對轉發平臺性能的評價要以負載性能,甚至是滿載性能作為評價標準。優秀的轉發平臺在滿載時應幾乎沒有性能損失,據我所知,RJ在這方面做得不錯。
要使轉發平臺達到以上所說的優秀,個人覺得可以在兩方面入手:1. 構建好的轉發架構;2. 針對具體硬件做相應的性能優化。其中好的架構是關鍵所在。
構建好的轉發架構。好的架構包括各種優秀的快轉算法,高效的同步互斥機制,可量化的進程調度等。在這些因素中,我最感興趣的是可量化的進程調度。試想,在一個系統中,如果在任何情況下都能保證有70%的CPU時間在處理快速轉發,那要達到在滿載時沒有性能損失似乎也不是什么困難的事情。怎樣才能使快轉運行時間得到保證呢?個人覺得分組優先級的策略可以借鑒,其基本思路是:比如將所有進程分為A, B兩組,每組各有3個進程,以A0 - A2,B0 - B2來表示,其中A組的運行時間需要得到保證。那調度時可以按A0->A1->A2->B0->A0->A1->A2->B1->A0->A1->A2->B2->A0->A1->A2的方式來進行調度。結合到路由器平臺的實現中,A組中包括的可以是快轉相關的進程,B組中包括的為設備管理(負載)相關的進程。基本的調度策略可以采用優先級加時間片的方式,可以不設計搶占,兩組的時間片根據需要也可以設計得不同。
針對具體硬件的性能優化。此處,討論的范疇限定在通用處理器范圍內,像NP這類高深的東西不去說它。個人覺得硬件對性能的影響來講,主要集中在內存的訪問上面。通過簡單的計算很容易得出內存瓶頸這個結論。解決方法是要充分的運用cache,盡量減少cache miss的次數,從而盡量減少訪問內存的次數。一個具體的實例是,曾經有一款使用PPC CPU的路由器,FCC使用DMA來更新數據,為了保證CPU訪問到數據的正確性,FCC驅動每次更新后都要做cache_invalid的操作,這就導致了每次收發包都要訪問內存,性能極低。解決方法是使用CPU的cache一致性功能,去除cache_invalid的動作,這樣處理后性能有了很大的提升。除內存訪問的優化外,還可以充分利用CPU提供的特殊指令來提升性能。比如,有的CPU提供CRC32這樣的指令,使用這類指令來實現CRC算法,運行速度會提高很多。