一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法
【專利摘要】本發(fā)明公開了一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法,借鑒Linux NAPI的設(shè)計,讓I/O線程在處理發(fā)送隊列時,根據(jù)客戶機發(fā)送數(shù)據(jù)包的頻率自動切換通知模式和輪詢模式:如果客戶機發(fā)送數(shù)據(jù)包的頻率高于某個閾值,則持續(xù)輪詢發(fā)送隊列中是否有數(shù)據(jù)需要處理,保持客戶機的通知機制處于關(guān)閉狀態(tài),消減VM Exit數(shù)量;如果客戶機發(fā)送數(shù)據(jù)包的頻率低于某個閾值,則退出輪詢模式,并開啟客戶機的通知機制,等待下一次被喚醒,減少CPU資源的浪費。用兩個I/O線程分別處理發(fā)送隊列和接收隊列,這兩個I/O線程運行在同一個物理核上,它們之間的公平性由CFS調(diào)度器保證,CFS調(diào)度器會根據(jù)線程的運行時間、睡眠時間等實現(xiàn)公平調(diào)度。
【專利說明】
一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及系統(tǒng)網(wǎng)絡(luò)I/O虛擬化、半虛擬化網(wǎng)卡領(lǐng)域,尤其涉及一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法。
【背景技術(shù)】
[0002]半虛擬化網(wǎng)卡技術(shù)通過對客戶機操作系統(tǒng)進行修改,讓其意識到自己處于虛擬化環(huán)境中,從而可以和VMM相互協(xié)作,極大地提升網(wǎng)絡(luò)I/O性能。而與之相比,傳統(tǒng)的全虛擬化網(wǎng)卡,雖然有很高的靈活性和兼容性,但每次I/O操作的路徑太長,有較多的VM Entry和VMExit發(fā)生,且需要多次上下文切換和數(shù)據(jù)復(fù)制,性能較差。因此,半虛擬化網(wǎng)卡已經(jīng)成為當(dāng)前的主流I/O虛擬化技術(shù)之一,被廣泛應(yīng)用于虛擬機的網(wǎng)絡(luò)部署。
[0003]半虛擬化通常由前端(Frontend)和后端(Backend)兩部分組成:前端處理程序是位于客戶機的驅(qū)動模塊,后端處理程序是位于宿主機的I/O線程,兩者通過發(fā)送和接收兩個隊列進行交互。每個半虛擬化網(wǎng)卡會對應(yīng)一個I/O線程,該線程同時負責(zé)發(fā)送隊列和接收隊列的處理,如果當(dāng)前沒有任務(wù),該線程處于睡眠狀態(tài)。
[0004]當(dāng)外界有數(shù)據(jù)包到達半虛擬化網(wǎng)卡時,I/O線程被喚醒并處理接收隊列:將數(shù)據(jù)寫入接收隊列,通知客戶機有數(shù)據(jù)達到,客戶機接收到通知后從接收隊列中獲取數(shù)據(jù)。當(dāng)客戶機需要向外界發(fā)送數(shù)據(jù)包時,首先將數(shù)據(jù)寫入發(fā)送隊列,然后通知I/O線程,I/O線程被喚醒并處理發(fā)送隊列:從發(fā)送隊列獲取數(shù)據(jù),將數(shù)據(jù)傳輸至外界,傳輸成功后告知客戶機。如果發(fā)送隊列和接收隊列都有任務(wù)時,I/O線程會輪流進行處理并保證公平性。
[0005]由于發(fā)送和接收隊列通過共享內(nèi)存來實現(xiàn),半虛擬化網(wǎng)卡在數(shù)據(jù)傳輸上的性能很好,但在通知機制上還存在瓶頸。當(dāng)客戶機通知I/O線程有數(shù)據(jù)包需要傳輸時,會執(zhí)行I/O特權(quán)指令,造成VM Exi t,VMM分析Exi t原因后,幫助客戶機通知I/0線程。因此,客戶機使用半虛擬化網(wǎng)卡向外界發(fā)送數(shù)據(jù)包時,會產(chǎn)生大量的VM Exit,對I/O響應(yīng)延遲和網(wǎng)絡(luò)吞吐量造成影響。
[0006]因此,本領(lǐng)域的技術(shù)人員致力于開發(fā)一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法,消減使用半虛擬化網(wǎng)卡發(fā)送數(shù)據(jù)包時的VM Exit數(shù)量,提升I/O性能。
【發(fā)明內(nèi)容】
[0007]鑒于現(xiàn)有技術(shù)的上述缺陷,本發(fā)明所要解決的問題是盡可能消減使用半虛擬化網(wǎng)卡發(fā)送數(shù)據(jù)包時的VM Exit數(shù)量,提升I/O性能。
[0008]為實現(xiàn)該目的,本發(fā)明提供一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法,包括以下步驟:
[0009]步驟I:在初始化vhost模塊時創(chuàng)建兩個線程,線程A負責(zé)接收隊列的處理,線程B負責(zé)發(fā)送隊列的處理。
[0010]步驟2:對于接收隊列仍采用原來的處理方式,如圖2所示。當(dāng)半虛擬化網(wǎng)卡接收到來自外界的數(shù)據(jù)包時,喚醒線程A。[0011 ]步驟3:線程A查看接收緩沖區(qū)中是否有數(shù)據(jù)。
[0012]步驟3-1:如果有數(shù)據(jù),則處理接收隊列:將數(shù)據(jù)寫入接收隊列,通知客戶機有數(shù)據(jù)達到,客戶機接收到通知后從接收隊列中獲取數(shù)據(jù);處理完畢接收隊列之后,轉(zhuǎn)至步驟3。
[0013]步驟3-2:如果沒有數(shù)據(jù),則線程A進入睡眠狀態(tài),等待下一次被喚醒。
[0014]步驟4:對于發(fā)送隊列,根據(jù)客戶機發(fā)送數(shù)據(jù)包的頻率自動切換通知模式和輪詢模式,如圖3所示??蛻魴C發(fā)送數(shù)據(jù)包,執(zhí)行1特權(quán)指令造成VM Exit,KVM通知線程B有數(shù)據(jù)包需要傳輸,線程B被喚醒。
[0015]步驟5:線程B關(guān)閉客戶機通知機制,進入輪詢狀態(tài),輪詢發(fā)送隊列中是否有數(shù)據(jù),并統(tǒng)計一次輪詢或一段時間內(nèi)處理的數(shù)據(jù)包數(shù)量。
[0016]步驟6:如果數(shù)據(jù)包數(shù)量高于某個閾值,說明客戶機發(fā)送數(shù)據(jù)包的頻率較高,則轉(zhuǎn)至步驟5,繼續(xù)輪詢,減少VM Exit數(shù)量。
[0017]步驟7:如果數(shù)據(jù)包數(shù)量低于某個閾值,說明客戶機發(fā)送數(shù)據(jù)包的頻率較低,則退出輪詢模式,打開客戶機的通知機制,線程B睡眠,等待下一次被喚醒,減少CPU資源的浪費。
[0018]步驟8:線程A和B運行在同一個物理核上,CFS調(diào)度器會根據(jù)線程的運行時間、睡眠時間等實現(xiàn)公平調(diào)度。
[0019]本發(fā)明的設(shè)計思路:首先,借鑒LinuxNAPI的設(shè)計,讓I/O線程在處理發(fā)送隊列時,根據(jù)客戶機發(fā)送數(shù)據(jù)包的頻率自動切換通知模式和輪詢模式。如果客戶機發(fā)送數(shù)據(jù)包的頻率高于某個閾值,則持續(xù)輪詢發(fā)送隊列中是否有數(shù)據(jù)需要處理,保持客戶機的通知機制處于關(guān)閉狀態(tài),消減VM Exit數(shù)量;如果客戶機發(fā)送數(shù)據(jù)包的頻率低于某個閾值,則退出輪詢模式,并開啟客戶機的通知機制,等待下一次被喚醒,減少CPU資源的浪費。其次,由于對接收隊列的處理仍屬于通知喚醒制,當(dāng)持續(xù)輪詢發(fā)送隊列時,很難在一個I/O線程中保證兩者的公平。為此,本發(fā)明提出再創(chuàng)建一個線程用于處理發(fā)送隊列,原來的線程用于處理接收隊列,由CFS調(diào)度器負責(zé)調(diào)度這兩個線程并維護它們之間的公平性。
[0020]以下將結(jié)合附圖對本發(fā)明的構(gòu)思、具體結(jié)構(gòu)及產(chǎn)生的技術(shù)效果作進一步說明,以充分地了解本發(fā)明的目的、特征和效果。
【附圖說明】
[0021]圖1是本發(fā)明一個較佳實施例的KVM半虛擬化網(wǎng)卡架構(gòu)圖;
[0022]圖2是本發(fā)明一個較佳實施例的接收隊列處理流程圖;
[0023]圖3是本發(fā)明一個較佳實施例的發(fā)送隊列處理流程圖。
【具體實施方式】
[0024]以下將結(jié)合附圖對本發(fā)明的實施例做詳細說明。本實施例在本發(fā)明技術(shù)方案的前提下進行實施,并給出詳細實施方式和具體操作過程,但是適用平臺不僅限于下述實施例。
[0025]本實施例的平臺采用主流的虛擬化解決方案之一KVM,KVM的半虛擬化網(wǎng)卡架構(gòu)如圖1所示,前端處理程序是位于客戶機的virt1-net驅(qū)動模塊,后端處理程序是位于宿主機內(nèi)核空間的vhost-net模塊,兩者通過發(fā)送和接收兩個虛擬隊列進行交互。當(dāng)客戶機需要發(fā)送數(shù)據(jù)包時,virt1驅(qū)動先將數(shù)據(jù)寫入發(fā)送隊列,然后執(zhí)行1特權(quán)指令造成VM Exit,KVM分析Exit原因,通過1eventfd通知vhost有數(shù)據(jù)包需要傳輸,vhost收到通知后從發(fā)送隊列中獲取數(shù)據(jù),并借助虛擬交換機將數(shù)據(jù)傳輸至外界。
[0026]本發(fā)明提供一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法,包括以下步驟:
[0027]步驟I:在初始化vhost模塊時創(chuàng)建兩個線程,線程A負責(zé)接收隊列的處理,線程B負責(zé)發(fā)送隊列的處理。
[0028]步驟2:對于接收隊列仍采用原來的處理方式,如圖2所示。當(dāng)半虛擬化網(wǎng)卡接收到來自外界的數(shù)據(jù)包時,喚醒線程A。
[0029 ]步驟3:線程A查看接收緩沖區(qū)中是否有數(shù)據(jù)。
[0030]步驟3-1:如果有數(shù)據(jù),則處理接收隊列:將數(shù)據(jù)寫入接收隊列,通知客戶機有數(shù)據(jù)達到,客戶機接收到通知后從接收隊列中獲取數(shù)據(jù);處理完畢接收隊列之后,轉(zhuǎn)至步驟3。[0031 ]步驟3-2:如果沒有數(shù)據(jù),則線程A進入睡眠狀態(tài),等待下一次被喚醒。
[0032]步驟4:對于發(fā)送隊列,根據(jù)客戶機發(fā)送數(shù)據(jù)包的頻率自動切換通知模式和輪詢模式,如圖3所示??蛻魴C發(fā)送數(shù)據(jù)包,執(zhí)行1特權(quán)指令造成VM Exit,KVM通知線程B有數(shù)據(jù)包需要傳輸,線程B被喚醒。
[0033]步驟5:線程B關(guān)閉客戶機通知機制,進入輪詢狀態(tài),輪詢發(fā)送隊列中是否有數(shù)據(jù),并統(tǒng)計一次輪詢或一段時間內(nèi)處理的數(shù)據(jù)包數(shù)量。
[0034]步驟6:如果數(shù)據(jù)包數(shù)量高于某個閾值,說明客戶機發(fā)送數(shù)據(jù)包的頻率較高,則轉(zhuǎn)至步驟5,繼續(xù)輪詢,減少VM Exit數(shù)量。
[0035]步驟7:如果數(shù)據(jù)包數(shù)量低于某個閾值,說明客戶機發(fā)送數(shù)據(jù)包的頻率較低,則退出輪詢模式,打開客戶機的通知機制,線程B睡眠,等待下一次被喚醒,減少CPU資源的浪費。
[0036]步驟8:線程A和B運行在同一個物理核上,CFS調(diào)度器會根據(jù)線程的運行時間、睡眠時間等實現(xiàn)公平調(diào)度。
[0037]以上詳細描述了本發(fā)明的較佳具體實施例。應(yīng)當(dāng)理解,本領(lǐng)域的普通技術(shù)無需創(chuàng)造性勞動就可以根據(jù)本發(fā)明的構(gòu)思作出諸多修改和變化。因此,凡本技術(shù)領(lǐng)域中技術(shù)人員依本發(fā)明的構(gòu)思在現(xiàn)有技術(shù)的基礎(chǔ)上通過邏輯分析、推理或者有限的實驗可以得到的技術(shù)方案,皆應(yīng)在由權(quán)利要求書所確定的保護范圍內(nèi)。
【主權(quán)項】
1.一種針對半虛擬化網(wǎng)卡的數(shù)據(jù)包高效發(fā)送方法,其特征在于,包括以下步驟: 步驟1:在初始化Vhost模塊時創(chuàng)建兩個線程,線程A負責(zé)接收隊列的處理,線程B負責(zé)發(fā)送隊列的處理; 步驟2:當(dāng)半虛擬化網(wǎng)卡接收到來自外界的數(shù)據(jù)包時,喚醒線程A; 步驟3:線程A查看接收緩沖區(qū)中是否有數(shù)據(jù); 步驟3-1:如果有數(shù)據(jù),則處理接收隊列:將數(shù)據(jù)寫入接收隊列,通知客戶機有數(shù)據(jù)到達,客戶機接收到通知后從接收隊列中獲取數(shù)據(jù);處理完畢接收隊列之后,轉(zhuǎn)至步驟3; 步驟3-2:如果沒有數(shù)據(jù),則線程A進入睡眠狀態(tài),等待下一次被喚醒; 步驟4:發(fā)送隊列被配置為根據(jù)客戶機發(fā)送數(shù)據(jù)包的頻率自動切換通知模式和輪詢模式;客戶機發(fā)送數(shù)據(jù)包,執(zhí)行1特權(quán)指令造成VM Exit,KVM通知線程B有數(shù)據(jù)包需要傳輸,線程B被喚醒; 步驟5:線程B關(guān)閉客戶機通知機制,進入輪詢狀態(tài),輪詢發(fā)送隊列中是否有數(shù)據(jù),并統(tǒng)計一次輪詢或一段時間內(nèi)處理的數(shù)據(jù)包數(shù)量; 步驟6:如果數(shù)據(jù)包數(shù)量高于閾值,說明客戶機發(fā)送數(shù)據(jù)包的頻率較高,則轉(zhuǎn)至步驟5,繼續(xù)輪詢,減少VM Exi t數(shù)量; 步驟7:如果數(shù)據(jù)包數(shù)量低于閾值,說明客戶機發(fā)送數(shù)據(jù)包的頻率較低,則退出輪詢模式,打開客戶機的通知機制,線程B睡眠,等待下一次被喚醒,減少CPU資源的浪費; 步驟8:線程A和B運行在同一個物理核上,CFS調(diào)度器根據(jù)線程的運行時間和睡眠時間進行公平調(diào)度。
【文檔編號】G06F9/50GK106095580SQ201610421258
【公開日】2016年11月9日
【申請日】2016年6月14日 公開號201610421258.8, CN 106095580 A, CN 106095580A, CN 201610421258, CN-A-106095580, CN106095580 A, CN106095580A, CN201610421258, CN201610421258.8
【發(fā)明人】管海兵, 胡小康, 張望, 馬汝輝, 李健
【申請人】上海交通大學(xué)