本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域,具體涉及一種共享rdma連接的方法。
背景技術(shù):
隨著互聯(lián)網(wǎng)技術(shù)的蓬勃發(fā)展,產(chǎn)生了大量分布式應(yīng)用系統(tǒng),如股票交易系統(tǒng)、分布式事務(wù)處理等。這些分布式應(yīng)用系統(tǒng)對網(wǎng)絡(luò)低時延和高帶寬提出了越來越高的要求,而傳統(tǒng)的基于tcp/ip協(xié)議的網(wǎng)絡(luò)由于其復(fù)雜的協(xié)議棧和冗長的數(shù)據(jù)路徑,應(yīng)對這種場景力不從心,限制著這些系統(tǒng)的可用性。針對此問題,遠程直接數(shù)據(jù)存取(remotedirectmemoryaccess,rdma)技術(shù)以其卸載tcp/ip協(xié)議棧和在用戶態(tài)下處理網(wǎng)絡(luò)數(shù)據(jù)的方式,通過網(wǎng)絡(luò)把數(shù)據(jù)從發(fā)送方直接傳入接收方的一塊存儲區(qū)域,繞過接收方的操作系統(tǒng),提供了一個微秒級別的低延遲、高帶寬、cpu輕負(fù)荷的高速網(wǎng)絡(luò)環(huán)境,取得了優(yōu)異的性能。rdma的具體工作流程如下:發(fā)送方的應(yīng)用程序?qū)⒁l(fā)送的數(shù)據(jù)的內(nèi)存地址發(fā)送給rdma網(wǎng)卡,rdma網(wǎng)卡通過dma方式讀取應(yīng)用程序待發(fā)的數(shù)據(jù),然后加上rdma報頭,發(fā)送到接收方的rdma網(wǎng)卡,接收方的rdma網(wǎng)卡仍然通過dma方式,將數(shù)據(jù)傳輸?shù)浇邮辗降膽?yīng)用程序內(nèi)存之中。這樣,就省去了tcp/ip協(xié)議中的一次上下文切換和一次內(nèi)存復(fù)制,極大地精簡了數(shù)據(jù)傳輸?shù)倪^程。
綜上所述,可以利用rdma技術(shù)來解決服務(wù)器集群中遇到的網(wǎng)絡(luò)瓶頸問題。然而,rdma的連接實體存在嚴(yán)重的可擴展性問題。因為rdma連接的特性是一對一通信,隨著rdma連接的增加,以及網(wǎng)卡的片上緩存容量有限,當(dāng)節(jié)點上的連接數(shù)量上升到數(shù)百個以上時,網(wǎng)卡就難以存儲全部的連接信息,對于網(wǎng)卡未能存儲的連接信息,仍然需要從內(nèi)存中獲取,導(dǎo)致網(wǎng)卡生成大量的緩存未命中(cachemiss)而使性能急劇下降。對于這一問題,目前的方法是利用互斥鎖來保護共享的rdma連接,即在一段時間內(nèi)鎖定一條rmda連接只能用于某項操作,操作完成后再釋放鎖,從而為多個邏輯連接服務(wù)。但是鎖競爭會造成性能時好時壞不穩(wěn)定的情況,帶來了負(fù)面影響,這不利于系統(tǒng)的應(yīng)用。
技術(shù)實現(xiàn)要素:
發(fā)明目的:基于以上不足,本發(fā)明提出一種以無鎖方式共享rdma連接的方法,以連接雙方的地址和接收方的序列號作為輸入,利用一致性哈希的方法為每個邏輯連接賦予唯一標(biāo)識,從而使得多個邏輯連接能夠以無鎖的方式共享rdma連接實體,徹底解決了rdma的可擴展性問題。
技術(shù)方案:本發(fā)明所述的以無鎖方式共享rdma連接的方法,包括以下步驟:
1)連接發(fā)起方基于連接雙方的ip地址和接收方的序列號生成邏輯連接的唯一標(biāo)識;
2)連接發(fā)起方利用該唯一標(biāo)識創(chuàng)建邏輯連接,并為每個邏輯連接創(chuàng)建一個通知標(biāo)識,用于該邏輯連接的事件通知;
3)連接發(fā)起方發(fā)送數(shù)據(jù)時,將邏輯連接的唯一標(biāo)識填充到rdma報文的立即數(shù)字段,再進行發(fā)送;
4)連接接收方收到數(shù)據(jù)后,從rdma報文中得到邏輯連接的唯一標(biāo)識,從而將數(shù)據(jù)交付給正確的邏輯連接。
其中,步驟1)中發(fā)送方為每個邏輯連接賦予唯一標(biāo)識具體包括以下步驟:
11)將通信雙方的ipv4地址轉(zhuǎn)化為32位無符號整數(shù);
12)將ipv4地址中數(shù)值較小的低8位填充至唯一標(biāo)識的高8位,把數(shù)值較大的低8位填充至唯一標(biāo)識的次高8位;
13)將與接收方對應(yīng)的序列號加一后,取該序列號的低16位填充到唯一標(biāo)識的低16位。
步驟2)中建立邏輯連接的具體過程為:連接發(fā)起方將邏輯連接的唯一標(biāo)識發(fā)送給邏輯連接接收方,等待反饋;如果該邏輯連接標(biāo)識在連接接收方處已經(jīng)被占用,則返回出錯信息,重復(fù)上一步驟,如果標(biāo)識沒被占用,則返回邏輯連接成功建立信息。
為邏輯連接創(chuàng)建通知標(biāo)識的的具體過程為:創(chuàng)建邏輯連接時,同時為其創(chuàng)建一個eventfd,用于事件的通知;并利用一個工作線程監(jiān)聽各個邏輯連接上的eventfd,當(dāng)某個eventfd可讀時,表明該邏輯連接有發(fā)送任務(wù),該工作線程就執(zhí)行邏輯連接提交的發(fā)送任務(wù)。這樣,就避免了互斥鎖的出現(xiàn)。
有益效果:本發(fā)明利用邏輯連接的雙方所在的節(jié)點地址和接收方的序列號作為輸入,為每個邏輯連接賦予唯一標(biāo)識,利用rdma報文的立即數(shù)字段填充邏輯連接的唯一標(biāo)識,并且將rdma連接共享轉(zhuǎn)換為生產(chǎn)者-消費者問題,根據(jù)邏輯連接的通知來請求發(fā)送數(shù)據(jù),完成數(shù)據(jù)的正確分發(fā),避免了互斥鎖的出現(xiàn),從而解決了rdma中隨著連接的增加網(wǎng)絡(luò)性能急劇下降的可擴展性問題。
附圖說明
圖1為邏輯連接共享rdma連接的示意圖;
圖2為邏輯連接的不良標(biāo)識產(chǎn)生歧義的示意圖;
圖3為本發(fā)明的一致性哈希算法生成邏輯連接唯一標(biāo)識的示意圖。
具體實施方式
本發(fā)明涉及連接發(fā)起方和連接接收方兩個主體,在發(fā)起方和接收方之間共享rdma連接的過程主要包括以下幾個階段:a)發(fā)起方生成邏輯連接的唯一標(biāo)識并創(chuàng)建邏輯連接;b)發(fā)起方以無鎖方式共享rdma連接;以及c)接收方接收數(shù)據(jù)后的處理。下面結(jié)合附圖對本發(fā)明的技術(shù)方案作進一步說明。
a)發(fā)起方生成邏輯連接的唯一標(biāo)識并創(chuàng)建邏輯連接
首先,因為多個邏輯連接共享一條rdma連接,所以需要為每一條邏輯連接賦予一個唯一的標(biāo)識,來唯一地確定特定的邏輯連接。如圖1所示,節(jié)點m和節(jié)點n之間有一條rdma連接,同時,有三條邏輯連接在共享該rdma連接。每個邏輯連接都有自身的唯一標(biāo)識,即1、2、3。節(jié)點n根據(jù)邏輯連接的唯一標(biāo)識,將報文數(shù)據(jù)分發(fā)給恰當(dāng)?shù)倪壿嬤B接。這個標(biāo)識在邏輯連接的建立階段通過連接雙方協(xié)調(diào)來取值,協(xié)商的過程如下:
a)邏輯連接發(fā)起方選定一個32位的無符號整數(shù)作為標(biāo)識,攜帶其他必要的信息請求建立連接;
b)邏輯連接接收方檢查該標(biāo)識在本節(jié)點上是否被占用,如果不被占用,則返回給邏輯連接發(fā)起方成功的消息;
c)如果該標(biāo)識已經(jīng)被其他邏輯連接占用,則向邏輯連接發(fā)起方返回失敗消息,重復(fù)步驟a),直到兩方對邏輯連接的標(biāo)識達成一致。
因為邏輯連接的標(biāo)識是通信雙方特定邏輯連接的憑據(jù),因此必須被通信雙方所認(rèn)可,否則就會出現(xiàn)混淆。圖2示出了標(biāo)識不唯一的情況,服務(wù)器a已經(jīng)與服務(wù)器b建立了以6689為標(biāo)識的邏輯連接。如果服務(wù)器c又和服務(wù)器a建立一條以6689為標(biāo)識的邏輯連接,那么在接收數(shù)據(jù)時,服務(wù)器a就不能得知數(shù)據(jù)是來自于服務(wù)器b還是c。因此,邏輯連接發(fā)起方生成一個邏輯連接的唯一標(biāo)識后,還需要連接接收方的認(rèn)可,否則就需要重新生成標(biāo)識。良好的邏輯連接標(biāo)識產(chǎn)生方法,往往一次就能成功,節(jié)省了許多時間和資源。如果邏輯連接發(fā)起方所生成的唯一標(biāo)識在接收方已經(jīng)被占用,我們稱之為產(chǎn)生了碰撞。本發(fā)明為減少碰撞,利用一致性哈希的方式來生成該標(biāo)識。圖3示出了一個生成標(biāo)識的實例,具體包括以下步驟:
a1)將通信雙方的ipv4地址轉(zhuǎn)化為32位無符號整數(shù)。因為共享同一條rdma連接的邏輯連接的通信雙方是一致的,并且rdma網(wǎng)卡是基于tcp/ip協(xié)議,因此可以得到雙方的ipv4地址。
a2)比較兩個32位無符號整數(shù)的大小,按照從小到大的順序,分別將兩個32位無符號整數(shù)的低8位填充到32位邏輯連接標(biāo)識的高16位,即,將ipv4地址中數(shù)值較小的低8位填充至唯一標(biāo)識的高8位,而把數(shù)值較大的低8位填充至唯一標(biāo)識的次高8位。
a3)將接收方的序列號加一后,取該序列號的低16位填充到唯一標(biāo)識的低16位。在本發(fā)明中,連接發(fā)起方為每個連接接收方設(shè)置一個對應(yīng)的序列號,序列號從零開始按順序加一,即每當(dāng)連接發(fā)起方創(chuàng)建一個與該接收方的邏輯連接時,就給該接收方對應(yīng)的序列號加一。本發(fā)明利用tcp/ip來建立rdma連接,即每個節(jié)點上都會有傳統(tǒng)socket在監(jiān)聽是否有其他節(jié)點的連接請求到來。如果有的話,則互相交換必要的信息,以成功創(chuàng)建rdma連接。
由于排序后的通信雙方ipv4地址占據(jù)邏輯連接標(biāo)識的高16位,因為各個節(jié)點的地址不同所以,這種方式生成的標(biāo)識很少會發(fā)生碰撞;此外,還有不斷自增的序列號填充至標(biāo)識的低16位,也不會造成兩個節(jié)點間的邏輯連接選取產(chǎn)生碰撞。經(jīng)過如上三步,就得到了碰撞極小的標(biāo)識符號,可用于表示通信雙方的一條邏輯連接。
b)發(fā)起方以無鎖方式共享rdma連接
雖然共享的rdma連接實質(zhì)上屬于臨界資源,需要利用互斥鎖實現(xiàn)訪問保護。但本發(fā)明將其轉(zhuǎn)化為生產(chǎn)者-消費者問題,完全避免了鎖競爭的出現(xiàn)。
本發(fā)明在邏輯連接創(chuàng)建完畢后,為其設(shè)置一個通知標(biāo)識,用于邏輯連接的事件通知。在本實施例中采用linux中的eventfd來實現(xiàn),eventfd是文件描述符,連接發(fā)起方在邏輯連接創(chuàng)建完畢后,為其分配相應(yīng)的eventfd。并利用一個工作線程監(jiān)聽各個邏輯連接上的eventfd,當(dāng)某個eventfd可讀時,表明該邏輯連接有發(fā)送任務(wù),該工作線程就執(zhí)行邏輯連接提交的發(fā)送任務(wù)。這樣,就避免了互斥鎖的出現(xiàn)。
具體地,本發(fā)明以reactor模式來處理邏輯連接的各個讀寫等事件,即一個或者多個工作線程監(jiān)聽一個文件描述符集合,當(dāng)該文件描述符集合中的某個文件描述符有讀寫事件發(fā)生時,就執(zhí)行對應(yīng)的回調(diào)函數(shù)。本發(fā)明中總共有以下三類事件:
邏輯連接的創(chuàng)建事件:當(dāng)邏輯連接創(chuàng)建時,會跟連接接收方協(xié)商邏輯連接唯一標(biāo)識等必要信息,協(xié)調(diào)完畢后,就會將其邏輯連接的eventfd注冊到工作線程監(jiān)聽的文件描述符集合中。
邏輯連接的寫事件:如果一個邏輯連接需要發(fā)送數(shù)據(jù),就在做好準(zhǔn)備工作后,喚醒屬于自身的eventfd。工作線程根據(jù)eventfd來執(zhí)行對應(yīng)的邏輯連接的發(fā)送任務(wù)。在rdma報文中,有一個32位的字段,叫做立即數(shù)(immediatedata)。當(dāng)上述的工作線程執(zhí)行邏輯連接的發(fā)送任務(wù)時,會把該邏輯連接的唯一標(biāo)識填充到rdma報文的立即數(shù)字段,然后連接發(fā)起方的rdma網(wǎng)卡將該邏輯連接的數(shù)據(jù)發(fā)送到連接接收方。
邏輯連接的讀事件:當(dāng)連接接收方的網(wǎng)卡獲取到傳入的數(shù)據(jù)時,會從rdma報文里取出立即數(shù)字段存儲的邏輯連接唯一標(biāo)識,然后將數(shù)據(jù)寫入到內(nèi)存中,并利用該邏輯連接的eventfd來通知其有數(shù)據(jù)可讀。
c)接收方接收數(shù)據(jù)后的處理
連接接收方收到數(shù)據(jù)后,根據(jù)rdma報文中的立即數(shù),得到傳入數(shù)據(jù)所在的邏輯連接,并將數(shù)據(jù)交付給該邏輯連接。
如上所述,本發(fā)明以無鎖的方式,在多個邏輯連接間共享一個rdma連接,通過對rdma連接的復(fù)用和解復(fù)用來減少單個節(jié)點上創(chuàng)建的rdma連接實體的個數(shù),從而降低了rdma網(wǎng)卡的片上內(nèi)存產(chǎn)生緩存未命中的次數(shù)。這在實際場景中,十分有益于rdma網(wǎng)絡(luò)性能的提升。