LNet代碼分析

源碼版本:lustre-release 2.15.55緩存

介紹

LNet是Lustre的網絡模塊,代碼目錄分爲了lnet和lnd服務器

  • lnet提供了統一的接口
  • lnd封裝了底層驅動,有socklnd(TCP/IP),iblnd(RDMA)

分析代碼的主要目的是爲了研究其如何實現RDMA大規模組網(5萬+客戶端)。RDMA大規模組網的瓶頸在於服務器的內存,如BeeGFS須要爲每一個鏈接分配1M的發送緩存(物理內存)和1M的接收緩存,並映射到dma,這樣一算支持1萬客戶端就須要佔用超過20G的內存。網絡

先寫結論
LNet經過兩階段收發數據的方式避免了爲每一個鏈接預申請內存,以發送數據爲例函數

  • 第一階段:發送端將待發送的數據映射到dma,並經過預映射的內存經過RDMA告知接收端待發送的數據信息(長度、類型等),接收端申請內存並映射到dma,並告知發送端映射後的信息(address、key)
  • 第二階段:發送端將數據經過RDMA發送給接收端

雖然兩階段發送增長了通信成本,但使得內存不會成爲大規模組網的瓶頸。code

初始化

iblnd初始化函數kiblnd_startup(),主要的是建立pool set。pool set分爲fmr pool set和tx pool set。至少會建立cpt個pool set,每一個pool set初始包含一個pool,一個pool最多包含256個fmr/tx,每一個mr可映射256個page,每一個tx可保存256個page地址,每一個tx會預映射一個page到dma,爲rdma通信所用。接口

cpt含義是cpu partition,值與cpu核數以及numa的節點個數有關。隊列

傳輸數據時,須要事件

  • 從tx pool set獲取一個tx,填寫消息信息(長度、類型等),以預映射的page與接收端通信
  • 從fmr pool set從獲取一個mr,將待發送數據的內存映射到這塊mr中

當沒有tx或mr可用時,會建立新的pool。每一個pool都有一個deadline,當歸還tx時,若是該pool空閒且已經到deadline,則會回收該pool。內存

建立鏈接

建立鏈接在發送數據的流程中觸發,其過程與常規rdma建立流程無異,須要注意的是iblnd中建立流程經過rdma的事件回調觸發下一階段,可能有些費解。建立鏈接時會預先申請18個page,並映射到dma,做爲RQE(receive queue entry)。18是根據鏈接的隊列深度和協議版本肯定的。每一個鏈接固定佔用的內存資源不多。資源

收發數據

由於tx預映射了一個page,因此當發送的數據小於4K時,則能夠當即發送。當發送的數據大於4K時,則須要走兩階段發送。當接收端收到第一階段的消息後,會申請內存準備接收數據。這些內存是上層服務在註冊時申請的,能夠複用於多個鏈接。第二階段時,一旦接收端收到所有數據後,就會經過事件回調的方式通知上層。發送端也是如此,一旦所有發送成功後,會經過事件回調的方式通知上層。

家裏居然下不了源碼,只能簡單寫寫了。

相關文章
相關標籤/搜索