03.16 交換機的零拷貝是什麼?交換機零拷貝詳解!

零拷貝

零拷貝是指在整個數據包的處理過程中,使用指針做參數,不進行整個數據包的拷貝。這樣可以大大提高CPU的處理效率。使用零拷貝後,會一定程度上降低軟件處理的靈活性,我們會面臨到這樣的問題:如果協議棧需要更改一個數據包的內容,會直接在接收緩存(buffer)上修改,但是如果需要在數據包中刪除或添加字段(例如添加或刪除一層標籤(tag)),即數據包的長度需要變化時,應該如何處理。

添加或刪除字段,必然會導致數據包頭一側或包尾一側的位置發生移動,如果包尾一側移動,問題比較簡單,只要數據包總長度不超過buffer邊界即可。由於通常此類操作都靠近包頭的位置,如果包頭一側移動,效率會比較高,所以協議棧在處理時可能更傾向於在包頭一側移動,這時就需要驅動在分配buffer時做一些處理:

(1)接收數據包時,頭指針不能指向buffer邊界,需要向後偏移一定裕量,同時單個buffer的大小也必須兼顧到最大傳送單元(MTU)和該裕量。

(2)釋放數據包時buffer首指針需要作歸一化處理

交換機的零拷貝是什麼?交換機零拷貝詳解!

目前第三層交換機涉及到的外部中斷主要由交換芯片產生,交換芯片主要的外部中斷包括DMA操作(如收到包、發包結束、新地址消息等等)和一些出錯消息。如果中斷請求過於頻繁,中斷服務程序(ISR)和其他進程之間頻繁地上下文切換會消耗大量CPU時間。如果有持續大量的中斷請求,CPU會始終處於繁忙狀態,各種協議得不到足夠的調度時間,從而導致協議狀態機超時等嚴重故障。為了避免事件觸發頻率不可控的問題,可以使用輪詢機制,通常的做法是用CPU定時器觸發原先由外部中斷觸發的ISR,由於定時器觸發的間隔是固定的,所以ISR執行的頻率得到了控制,避免了上述的問題。

輪詢和外部中斷相比,只是節奏可控(外部中斷的節奏取決於外部事件發生的頻率,CPU不可控)。但是,輪詢也有其不可避免的缺點——響應慢。不能滿足某些實時性要求較高的功能。另外,人們會發現用ping命令檢測第三層交換機3層接口大包時,使用輪詢方式的第三層交換機比使用中斷方式的第三層交換機的時延明顯要大。如果能通過某種機制,避免持續、大量的中斷請求,則既可以保證CPU不會過於繁忙,又保留了中斷實時處理的優點。

交換機的零拷貝是什麼?交換機零拷貝詳解!

典型的會產生大量中斷事件的行為是CPU接收數據包和MAC地址消息上報。以收包為例,在前面“CPU負載與收包節奏控制”部分提到的Burst方式就是根據實時的流量,控制接收DMA的開關,這樣就達到了使中斷源受控的目的,這種類似負反饋的機制可以很好的避免持續的中斷事件上報CPU。

總之,輪詢控制簡單,但實時性較差;中斷實時性好,但是使所有的中斷源受控有一定難度。在系統初始設計階段,我們需要綜合考慮需求以及芯片對外部事件的處理方式,來決定採用中斷或者輪詢方式,或者兩者兼用。

隨著以太網相關技術的發展,交換芯片和網絡處理器的處理能力不斷被提升;相比之下,數據交換設備中CPU處理性能的提升程度遠遠不及交換芯片和網絡處理器;同時數據交換設備支持的業務種類也在不斷增加,對CPU承載的業務量也有了更高的要求。在這種情況下,交換設備容量以及支持業務種類的大幅提升和有限的CPU資源之間的矛盾會日益凸顯。因此,做好CPU和交換芯片以及網絡處理器接口的緩衝管理、隊列調度以及流量監管,合理利用CPU資源,是保證數據交換設備安全、穩定運行的前提,也是目前及將來數據交換設備開發的重要課題。

交換機的零拷貝是什麼?交換機零拷貝詳解!


分享到:


相關文章: