一種面向云架構的高性能網絡接口實現技術
HPNI主要包括以下幾項關鍵技術:
本文引用地址:http://www.j9360.com/article/270287.htm(1)通過Linux提供的UIO框架,實現了網卡用戶空間驅動程序,UIO能夠把網卡設備內存空間通過文件系統的方式傳遞給用戶空間,比如dev/uioXX,因此用戶空間程序能夠讀取到設備地址段并映射到用戶空間內存中,比如通過mmap()。通過上述方式可以在用戶空間程序中完成驅動程序的功能。這種方法的優點是去掉了內存拷貝,同時因為所有工作都在用戶空間完成,也節省了系統調用的開銷。
(2)關掉網卡中斷,驅動程序采用輪詢方式,消除中斷引起的開銷。
(3)用戶空間的數據包緩沖區采用huge page分配的連續物理內存區,通過LinuX提供的huge page接口能夠分配大于4k的頁,從而減少頁表的大小,降低TLB Miss發生的概率。另外連續的物理內存塊也能減少地址轉換引起的查表次數,進一步提高性能。
(4)任務線程和CPU核心之間采用靜態綁定,比如接收包線程綁定1核,處理包線程綁定2核,發送包線程綁定3核,從而消除核間切換產生的開銷。
另外,對于NUMA架構的CPU,每個任務都使用本地內存,進一步提高內存訪問速度。
(5)通過CAS(Compare And Swap)原子操作,多個任務可以在不加鎖的情況下對共享隊列進行訪問,增加和刪除節點。在X86架構下CAS是通過CMPXCHG指令實現的,該指令的作用就是把一個指針指向內存的值同一個給定的值進行比較,如果相等,就對對應內存賦一個新的值,否則不做任何操作。通過上述方法可以實現一種沖突檢測機制,當任務發現該隊列己經被訪問時,主動等待直到隊列空閑。無鎖隊列消除了加鎖引起的開銷,同時也能避免死鎖的情況。
(6)基于網卡RSS(Receive-side Scaling)功能可以平滑擴展成多任務模式,RSS功能可以將收到的數據包基于五元組做哈希運算,從而分發到不同的隊列當中進行并行處理,每一個隊列可以對應一個收包任務,從而成倍地提高處理性能。
3對比實驗及結果分析
3. 1實驗一
實驗環境描述如下:一臺數據包發生器,最大可產生流量為80Mpps的64字節的數據包。一臺服務器配置Intel的Sandy Bridge 8核處理器,每個核心2.0GHZ.操作系統采用RedHat Enterprise Linux 6.2.網卡采用Intel 82599 10G以太網控制器。運行的軟件包含三個線程,一個收包線程,一個轉發線程,一個發送線程。傳統網絡實現方式下采用了RAWSocket方式直接收發處理層二數據包,如圖4所示。

圖4 單線程模式下性能比較圖
評論