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