緩存的概念并不陌生,尤其是網絡交換機,現在絕大部分的交換機均采用存儲轉發模式。所謂存儲轉發模式,是交換機接收數據包,從前導碼開始,一直到報文最后的CRC,這個報文接收完之后,才開始啟動轉發進程,在啟動轉發之前,這些數據包都要存儲到交換機緩存中,這就是存儲轉發模式,緩存說白了就是存儲轉發報文的。一般交換機的緩存都比較小,只滿足了線速轉發,當流量超過端口最大帶寬時,報文會很快將僅有的一點緩存迅速占滿。緩存就好比是一個水池子,有出水管和入水管,當入水管開的大,出水管開的小,水池子里的水就會很快裝滿,直到溢出。如果入水管開的小,出水管開的大,水池子里幾乎不會存下水,但水的流速就會慢,這是一個權衡利弊的過程。對于交換機的緩存也如此,針對出入水管的調節引申出了兩大技術,一個是QoS技術,一個是流控技術。對出水管進行管控的技術就是QoS技術,其中包括比如WRR、隊列整形GTS、限速、WRED、最小帶寬保證等很多技術,這些技術基本本質上就是對出水管的開關大小和優先級進行設置,當然要比開關水管要復雜得多,只是這樣的一個比喻。對入水管進行管控的技術就是流控技術,包括:Flow-control和PFC,基于端口和隊列的流控控制,對入水管的門限進行設置,當水量達到門限時觸發設備發送流控幀,同時當端口收到流控幀時,也可以向下一級設備傳遞。這兩大類技術包含的內容都很多,技術也較為成熟,但實際應用中使用的并不多,原因也是緩存比較小。比如一般的交換機,緩存就幾MB,均分到各個端口也就幾百KB,有突發流量時能存下幾十個包就不錯了,還費力設置那么多閾值干啥,突發一來基本將緩存打滿,各種技術都成了擺設,發揮不了太大作用,所以從交換機誕生之日起,緩存技術就有了,但一直不為人們所關注。
因為緩存小,交換機上的緩存一直是其比較雞肋的部分。那一定有人會問,就不能將緩存做得大些嗎?可以,其實后來有人研究出采用外擴DRAM來擴大緩存能力,不過這樣基本都會降低報文轉發速度,使得延遲增大,對網絡影響也比較大,對于一些對時延比較敏感的業務網絡,就不能采用這種大緩存的方式,不過在一些突發流量比較多,比如搜索業務中,對時延不敏感,這種大緩存設備就可以派上用場,避免在突發時出現丟包,即便延遲大一些也能接受,不過因為多了一個專門存儲數據的芯片,設備造價上要高得多,所以一般大緩存的設備價格都比較昂貴,基本是越大越貴。這里所說的延遲大,都是指的有擁塞的情況,如果沒有擁塞,其實大小緩存都沒有區別,存儲轉發時延都是幾個微秒,與緩存大小無絕對關系。交換機上的轉發芯片,受制造工藝和技術所限,還無法在片內將緩存做得很大。當然,這些年轉發芯片的技術也在不斷進步,不僅是轉發表項規格越來越大,緩存也在變大,現在片內緩存達到20~30M的已經比較常見,這要比十年前只有1M~2M的交換機緩存要大得多。緩存變大,以前的那些技術的意義就大了,可以設置各種閾值和優先級,對緩存的使用進行管控,這樣才能真正發揮作用。緩存大小閾值設置要適度,過大的緩存空間會影響正常通信狀態下數據包轉發速度(因為過大的緩沖空間需要相對多一點的尋址時間),并增加設備的成本。而過小的緩沖空間在發生擁塞時又容易丟包出錯。所以,適當的緩存空間加上先進的緩存調度算法是解決緩存問題的合理方式。
借助于RDMA技術的熱門,緩存技術引起了人們的關注。眾所周知,RDMA技術是一種提升數據包處理速度的新技術,一直采用專有網絡協議和專有網卡,應用來實現的,造價非常貴,一般只有在高性能計算的網絡中才會部署,隨著以太網技術的成熟,RDMA的一種替代技術RoCE出現,RoCE是一種允許通過以太網使用遠程直接內存訪問(RDMA)的網絡協議,就是通過以太網來跑RDMA協議,PFC和ECN是RoCE實現的基礎,而PFC是實現基于隊列的流控,ECN是實現基于WRED打標技術,兩種技術都與緩存密切相關,這讓人不得不將緩存技術重拾起來。而現在的交換機緩存有數十MB,在技術上也足夠可以做做文章,很多人開始深入研究交換機的緩存技術。
當一臺交換機出廠之后,它的緩存大小就確定了,無法再改變,這就像我們買的手機一樣,CPU和內存大小都無法改變。我們只能通過命令去設置出入門限,管控緩存的使用情況,將緩存盡可能公平地分給各個端口使用,同時針對突發流量、流控攻擊等異常情況,都可以應對。緩存雖不涉及到轉發表項,但每個數據包都要經過緩存存儲,所以一旦緩存出了問題,影響是全局性的,可能導致整個設備的業務異常,影響很大。早期的設備緩存都不會開放給使用者去隨意修改各種閾值,隨著RoCE網絡的出現,為了更好地適應RDMA網絡,各家網絡廠商才將緩存這部分調整放開。即便這樣,也建議遵從廠商提供的建議數值進行設置,這些閾值背后有很多緩存的技術含義,稍有不慎就可能調整錯誤,同時針對特殊應用場景,評估后再調整。有沒有不用緩存的交換機?答案是有,就是直通轉發模式,優點自然是轉發快,時延低,這種交換機在還沒有收到完整報文就開始轉發,無法檢驗CRC,這樣錯包也發現不了,實際應用中使用會有很大限制。