赞
踩
DAOS 通过两个紧密集成的平面进行运转。数据平面处理繁重的运输操作,而控制平面负责进程编排和存储管理,简化数据平面的操作。
I/O 引擎支持一个模块接口,该接口允许按需加载服务器端代码。每个模块实际上都是一个库,由 I/O 引擎通过 dlopen 动态加载。模块和 I/O 引擎之间的接口在 dss_module
数据结构中定义。
每个模块应指定:
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
DAOS: https://github.com/daos-stack/daos
本文翻译自 https://github.com/daos-stack/daos/blob/master/src/engine/README.md
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。