一種面向云架構的高性能網絡接口實現技術
0概述
本文引用地址:http://www.biyoush.com/article/270287.htm在傳統(tǒng)的電信IT產品中,高性能網絡接口一般采用特殊的硬件模塊來實現,比如網絡處理器、ASIC、FPGA等等。這些特殊硬件模塊一般會采用特殊的架構和指令集對網絡數據收發(fā)過程進行優(yōu)化以達到更好的性能。然而,這也相應使得開發(fā)和維護這些模塊的成本非常的昂貴,同時還有一個無法解決的問題是基于這些特殊硬件模塊實現的網絡接口不能移植到云中,因為它們跟硬件的耦合度太高了。摩爾定律的出現,使得通用處理器的性能得到了極大的提升,這也為基于通用處理器實現高性能網絡接口提供了可能,同時也為移植到云中提供了前提條件。
圖1 網絡接口實現的發(fā)展趨勢
本文對基于通用X86架構處理器和Linux下的傳統(tǒng)網絡接口實現模式進行了分析,同時針對其不足提出了一種高性能網絡接口實現方案-HPNI.
1傳統(tǒng)網絡接口實現分析
傳統(tǒng)網絡接口實現如圖2所示,Linux下傳統(tǒng)網絡接口處理流程一般包含以下幾個步驟:
圖2 傳統(tǒng)網絡接口實現
(1)系統(tǒng)啟動之后,內核中的驅動程序進行相應的資源分配以及網卡寄存器配置,比如分配數據包緩沖區(qū),使能DMA傳輸通道等等;
(2)網卡初始化完成以后,當網卡從網絡收到數據包的時候,會將數據包通過DMA方式傳送到內核中的數據包緩沖區(qū)中,并生成相應的數據包描述符存放在環(huán)形隊列里面;
(3)網卡觸發(fā)硬中斷通知內核,內核在中斷處理程序中產生相應軟中斷給應用程序收包任務;
(4)應用程序收包任務通過系統(tǒng)調用收取數據包,數據包也將從內核空間拷貝到用戶空間;
(5)收包任務通過共享隊列把數據包傳遞給處理任務;
(6)處理任務通過共享隊列把處理好的數據包傳遞給發(fā)包任務;
(7)發(fā)包任務通過系統(tǒng)調用把數據包傳遞給內核,通過采用一次內存拷貝實現;
(8)驅動程序根據存放在環(huán)形隊列里面的數據包描述符啟動相應的DMA傳輸任務;
(9)數據包傳輸完成后,網卡觸發(fā)中斷通知內核做相應處理。
下面先對傳統(tǒng)網絡接口的性能關鍵點進行分析。
1.1中斷和系統(tǒng)調用
Linux下傳統(tǒng)網絡接口實現的一個關鍵因素是中斷技術,網卡通過中斷與內核保持同步。但中斷處理會引入很大的性能損失,因為當CPU處理中斷的時候,它必須儲存和恢復自己的狀態(tài),進行上下文切換以及在進入和退出中斷處理程序的時候可能引入緩存(cache)操作。在進行大流量數據包處理的時候,由于CPU被頻繁地中斷,由此帶來的性能損失會非常嚴重。
當使用Linux系統(tǒng)提供的標準socket接口來實現網絡通信時,會觸發(fā)大量的系統(tǒng)調用,當應用程序通過socket系統(tǒng)調用進行網絡通信時,需要經歷從用戶態(tài)到內核態(tài)的切換以及其反向過程,在切換過程當中需要進行上下文的保存,比如對相關寄存器進行堆棧壓棧操作,保存當前指令指針等等。這些操作都會消耗系統(tǒng)資源,當處理高速的數據流量時,隨著系統(tǒng)調用數量的急劇增加而導致系統(tǒng)資源的大量消耗。
1.2內存相關性能問題
1.2.1內存拷貝
在使用標準套接字進行數據包收發(fā)時,數據在應用程序和內核之間進行傳遞必須通過內存拷貝來完成,原因在于用戶空間的內存和內核空間的內存是處在物理內存不同的位置上。內存拷貝是一個非常消耗資源的過程,當需要收發(fā)的數據包流量很大時,這種開銷將會極大地影響系統(tǒng)的性能。
評論