DAOS 經過兩個緊密集成的平面進行運轉。數據平面處理繁重的運輸操做,而控制平面負責進程編排和存儲管理,簡化數據平面的操做。git
I/O 引擎支持一個模塊接口,該接口容許按需加載服務器端代碼。每一個模塊實際上都是一個庫,由 I/O 引擎經過 dlopen 動態加載。模塊和 I/O 引擎之間的接口在 dss_module
數據結構中定義。github
每一個模塊應指定:數組
daos_module_id
中的模塊標識符此外,模塊還能夠選擇配置:緩存
I/O 引擎是一個多線程進程,使用 Argobot 進行非阻塞處理。服務器
默認狀況下,每一個 Target 都會建立一個 main xstream 和 no offload xstreams。offload xstream 的實際數量能夠經過 daos_engine 命令行參數進行配置。此外,還建立了一個額外的 xstream 來處理傳入的元數據請求。每一個 xstream 都綁定到一個特定的 CPU 核心。main xstream 接收來自客戶端和其餘服務器的 Target 傳入請求。一個特定的 ULT (User Level Thread) 會在網絡和 NVMe I/O 操做方面提供幫助。網絡
每一個 xstream 分配的私有存儲能夠經過 dss_tls_get()
函數進行訪問。數據結構
註冊時,每一個模塊能夠指定一個模塊密鑰,該密鑰的數據結構大小將由 TLS 中的每一個 xstream 進行分配。多線程
dss_module_key_get()
函數的做用是:返回特定註冊模塊密鑰的數據結構。函數
DAOS 使用 IV (incast variable) 在單個 IV 命名空間(組織結構爲樹)下的服務器之間共享值和狀態。樹的根節點稱爲 IV leader,服務器能夠是葉子節點也能夠是非葉子節點。命令行
每一個服務器都維護本身的 IV 緩存。在獲取過程當中,若是本地緩存不能完成請求,它會將請求轉發給其父緩存,直到到達根緩存 (IV leader)。對於更新操做,服務器首先更新它的本地緩存,而後轉發到它的父緩存,直到到達根緩存,而後將更改傳播到其餘的服務器。
IV 命名空間是屬於每一個 Pool 的,在 Pool 鏈接期間建立,在 Pool 斷開鏈接期間銷燬。
要使用 IV,每一個用戶須要在 IV 命名空間下注冊本身以得到標識符,而後用戶將使用這個 ID 來獲取或更新本身在 IV 命名空間下的 IV 值。
I/O 引擎包括一個 dRPC 服務器,它監聽給定 Unix Domain Socket 上的活動。
有關 dRPC 的基礎知識以及 Go 和 C 中的底層 API 的更多詳細信息,請參閱 dRPC Documentation。
dRPC 服務器按期輪詢傳入的客戶端鏈接和請求。它能夠經過 struct drpc_progress_context
對象同時處理多個客戶端鏈接,該對象管理監聽 Socket 的 struct drpc
對象以及任何活動的客戶端鏈接。
服務器在 xstream 0 本身的 ULT (User Level Thread) 中循環運行。dRPC Socket 已設置爲非阻塞的,而且使用無超時輪詢。這容許服務器在 ULT 中運行,而不是在本身的 xstream 中運行,預計該通道的流量相對較低。
drpc_progress
表示 dRPC 服務器循環的一次迭代。其工做流程以下:
drpc_recv
處理輸入的數據。struct drpc
對象並將其從 drpc_progress_context
中刪除。drpc_accept
並將新的 struct drpc
對象添加到 drpc_progress_context
中的客戶端鏈接列表中。-DER_MISC
返回給調用者。I/O 引擎中會記錄該錯誤,但不會中斷 dRPC 服務器循環。在監聽器上獲取到錯誤是意外狀況。-DER_TIMEDOUT
返回給調用者。這純粹是爲了調試目的,實際上,I/O 引擎會忽略此錯誤代碼,由於缺乏活動實際上並非一種錯誤。單個 DAOS 模塊能夠經過註冊一個或多個 dRPC 模塊 ID 的處理函數來實現對 dRPC 消息的處理。
註冊處理程序很簡單。在 dss_server_module
的字段 sm_drpc_handlers
中,靜態分配一個 struct dss_drpc_handler數組,該數組的最後一項爲零,以指示列表的結尾。將字段設置爲 NULL 表示沒有要註冊的處理程序。當 I/O 引擎加載 DAOS 模塊時,它將自動註冊全部 dRPC 處理程序。
注意:
dRPC 服務器使用函數 drpc_hdlr_process_msg
來處理傳入的消息。此函數檢查傳入消息的模塊 ID,搜索處理程序。
Drpc_Response
。Drpc_Response
,指示模塊 ID 未註冊。GitHub: https://github.com/storagezhang
Emai: debugzhang@163.com
華爲雲社區: https://bbs.huaweicloud.com/blogs/255571
DAOS: https://github.com/daos-stack/daos
本文翻譯自 https://github.com/daos-stack/daos/blob/master/src/control/README.md