隨著網(wǎng)絡(luò)的普及,為了滿足日益增長的需求、應對大量的用戶請求,對網(wǎng)絡(luò)流量的要求越來越高。而網(wǎng)絡(luò)通訊的的核心是報文的轉(zhuǎn)發(fā),Linux通過內(nèi)核協(xié)議棧進行轉(zhuǎn)發(fā)。在轉(zhuǎn)發(fā)的過程中,報文先進入內(nèi)核區(qū)然后拷貝到用戶區(qū),供給上層應用程序處理,再加上協(xié)議棧中嵌入了大量用于對接的接口,對性能也造成了大量消耗,不適合于處理大規(guī)模網(wǎng)絡(luò)數(shù)據(jù)包。
如果能讓應用程序直接接管網(wǎng)絡(luò)數(shù)據(jù)包處理、內(nèi)存管理以及CPU調(diào)度,那么性能可以得到一個質(zhì)的提升,因而DPDK技術(shù)應時而生。
Intel? DPDK全稱Intel Data Plane Development Kit,是intel提供的數(shù)據(jù)平面開發(fā)工具集,為Intel architecture(IA)處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供庫函數(shù)和驅(qū)動的支持,它不同于Linux系統(tǒng)以通用性設(shè)計為目的,而是專注于網(wǎng)絡(luò)應用中數(shù)據(jù)包的高性能處理。目前已經(jīng)驗證可以運行在大多數(shù)Linux操作系統(tǒng)上,包括FreeBSD 9.2、Fedora release18、Ubuntu 12.04 LTS、RedHat Enterprise Linux 6.3和Suse EnterpriseLinux 11 SP2等。
DPDK應用程序是運行在用戶空間上利用自身提供的數(shù)據(jù)平面庫來收發(fā)數(shù)據(jù)包,繞過了Linux內(nèi)核協(xié)議棧對數(shù)據(jù)包處理過程。Linux內(nèi)核將DPDK應用程序看作是一個普通的用戶態(tài)進程,包括它的編譯、連接和加載方式和普通程序沒有什么兩樣。
1 DPDK實現(xiàn)原理
DPDK實現(xiàn)提升速度的主要模塊如下:
網(wǎng)絡(luò)模塊,傳統(tǒng)Linux網(wǎng)絡(luò)層數(shù)據(jù)包流程:硬件中斷—>向內(nèi)核線程分發(fā)數(shù)據(jù)包—>軟件中斷—>線程在協(xié)議棧中處理數(shù)據(jù)包—>通知用戶層—>用戶層接收數(shù)據(jù)包—>網(wǎng)絡(luò)層—>邏輯層—>業(yè)務(wù)層。
DPDK網(wǎng)絡(luò)層數(shù)據(jù)包流程:硬件中斷—>放棄中斷—>用戶層通過設(shè)備映射接收數(shù)據(jù)包—>用戶層協(xié)議?!?網(wǎng)絡(luò)層—>邏輯層—>業(yè)務(wù)層。
如上述流程所示,DPDK攔截中斷機制,不觸發(fā)后續(xù)中斷和流程流程,繞過協(xié)議棧直接從網(wǎng)卡驅(qū)動獲取到數(shù)據(jù)包,把包提交給用戶空間,減去了中斷和內(nèi)核中內(nèi)存拷貝消耗的時間,加快了數(shù)據(jù)包的處理速度。
內(nèi)存管理模塊
HugePages相比默認4k頁表的優(yōu)點:1、HugePages 會在系統(tǒng)啟動時,直接分配并保留對應大小的內(nèi)存區(qū)域,沒有管理員的介入,是不會釋放和改變的。2、HugePages 不會swap,沒有頁表的換入和換出。3、降低Page Table查詢負載。4、由于虛擬內(nèi)存需要兩步操作才能實際對應到物理內(nèi)存地址,因此更少的Pages減輕了Page Table訪問熱度,避免了Page Table熱點瓶頸問題。
DPDK使用HugePage的思想就是讓程序盡量獨占內(nèi)存防止內(nèi)存換出,擴大頁表提高Hash命中率;此外,DPDK在內(nèi)存分配上還可通過proc提供的內(nèi)存信息,使CPU盡量使用靠近其所在NUMA節(jié)點的內(nèi)存,避免訪問遠程內(nèi)存影響效率。
內(nèi)核管理模塊
Affinity是進程的一個屬性,這個屬性指明了進程調(diào)度器能夠把這個進程調(diào)度到哪些CPU上。在Linux中,可利用CPU Affinity 把一個或多個進程綁定到一個或多個CPU上。CPU Affinity分為2種,分別為soft affinitysoft affinity和hard affinity。soft affinity僅是一個建議,如果不可避免,調(diào)度器還是會把進程調(diào)度到其它的CPU上。hard affinity是調(diào)度器必須遵守的規(guī)則。
使用Affinity的優(yōu)點:
1、增加CPU緩存的命中率。CPU之間是不共享緩存的,如果進程頻繁的在各個CPU間進行切換,需要不斷的使舊CPU的Cache失效。如果進程只在某個CPU上執(zhí)行,則不會出現(xiàn)失效的情況。在多個線程操作的是相同的數(shù)據(jù)的情況下,如果把這些線程調(diào)度到一個處理器上,大大的增加了CPU緩存的命中率。
2、適合Time-Sensitive應用。在Real-Time或Time-Sensitive應用中,我們可以把系統(tǒng)進程綁定到某些CPU上,把應用進程綁定到剩余的CPU上。典型的設(shè)置是,把應用綁定到某個CPU上,把其它所有的進程綁定到其它的CPU上
2 OVS-DPDK和原生OVS對比
原生OVS數(shù)據(jù)流處理過程如下首先查看有沒有事先訂閱的事件,如果有直接轉(zhuǎn)交給該對應的處理函數(shù),然后匹配流表,最后按照傳統(tǒng)網(wǎng)絡(luò)協(xié)議棧進行處理
1、數(shù)據(jù)包到達物理網(wǎng)卡后上傳給Datapath;
2、 Datapath 檢查緩存中的是否有Fast Path可以直接轉(zhuǎn)發(fā)這個包,如果在緩存中沒有找到記錄,內(nèi)核通過Netlink將消息發(fā)送給用戶態(tài)。在用戶態(tài)有線程監(jiān)聽消息,一旦有消息,則觸發(fā)用戶空間的數(shù)據(jù)包upcall處理;3、vswitchd檢查數(shù)據(jù)庫以查看數(shù)據(jù)包的目的端口位置; 4、vswitchd對未知路徑的數(shù)據(jù)包尋找流表規(guī)則,刷新內(nèi)核態(tài)流表內(nèi)容; 5、 將流表信息發(fā)送給Datapath,刷新內(nèi)核態(tài)流表內(nèi)容,重發(fā)數(shù)據(jù)包; 6、再次查詢流表,按照所獲取數(shù)據(jù)包精確轉(zhuǎn)發(fā)規(guī)則進行數(shù)據(jù)包轉(zhuǎn)發(fā)操作。 ? ?OVS-DPDK方式數(shù)據(jù)流處理如下
用戶態(tài)進程直接接管網(wǎng)卡收發(fā)的數(shù)據(jù)包,采用“IO獨占核”技術(shù),即每個端口分配一個核專門用于數(shù)據(jù)收發(fā),輪詢式處理方式代替中斷式處理,顯著提高IO性能。
3?DPDK技術(shù)在AWCloud產(chǎn)品中的應用AWCloud云計算管理平臺使用DPDK技術(shù),配合CPU Affinity和HugePages技術(shù),加速虛擬機和物理機處理數(shù)據(jù)包的速度。 產(chǎn)品中攜帶OVS-DPDK軟件,可用于替換原生OVS,在用戶進行開啟DPDK操作后,原OVS軟件包即刻進行卸載,更替為OVS-DPDK版本,調(diào)整所有OVS網(wǎng)橋相關(guān)設(shè)備的屬性,并且保留原有的OVS上的所有網(wǎng)橋、端口設(shè)備;該操作在物理機重啟后仍然生效。
fqj
評論