 BRPC与UCX集成指南●提供监视一个fd是否可读写,并调用对应socket对象的成员函数1314 Socket 输入事件处理15 Socket options ●是创建socket的参数 ●主要成员: –fd 是socket文件句柄 –void (*on_edge_triggered_events)(Socket*) ●可读事件的回调函数16 Server创建Socket Listener 把系统调用创建的listen –收集机器资源(内存,网卡等),在应用的各个部分共享 ●Worker –完成ucx的功能,可以在应用程序中调用的函数(不是单独执行的线程) ●Listener –接收连接请求 ●Ep –连接对象,在ep上请求发送和接收29 UCP 消息接口类型 ●Active message –速度最快,被brpc使用作为消息传递 –消息通过回调函数接收 –消息异步发送 ●Tag –MPI使用 ●Stream –官方不推荐30 增加字段:36 BRPC的Server开启RDMA server类有如下成员函数, 如何指定开启ucx连接?37 修改 BRPC ServerOptions ●ServerOptions添加成员 ●当前取舍的:TCP总是可用的, UCX作为选项38 Ucp Context ●只有一个全局对象,使用下列函数获取 ●UCP_Context* get_or_create_ucp_ctx()0 码力 | 66 页 | 16.29 MB | 6 月前3 BRPC与UCX集成指南●提供监视一个fd是否可读写,并调用对应socket对象的成员函数1314 Socket 输入事件处理15 Socket options ●是创建socket的参数 ●主要成员: –fd 是socket文件句柄 –void (*on_edge_triggered_events)(Socket*) ●可读事件的回调函数16 Server创建Socket Listener 把系统调用创建的listen –收集机器资源(内存,网卡等),在应用的各个部分共享 ●Worker –完成ucx的功能,可以在应用程序中调用的函数(不是单独执行的线程) ●Listener –接收连接请求 ●Ep –连接对象,在ep上请求发送和接收29 UCP 消息接口类型 ●Active message –速度最快,被brpc使用作为消息传递 –消息通过回调函数接收 –消息异步发送 ●Tag –MPI使用 ●Stream –官方不推荐30 增加字段:36 BRPC的Server开启RDMA server类有如下成员函数, 如何指定开启ucx连接?37 修改 BRPC ServerOptions ●ServerOptions添加成员 ●当前取舍的:TCP总是可用的, UCX作为选项38 Ucp Context ●只有一个全局对象,使用下列函数获取 ●UCP_Context* get_or_create_ucp_ctx()0 码力 | 66 页 | 16.29 MB | 6 月前3
 Curve支持S3 数据缓存方案加锁,根据inode和fsid找到对应的fileCacheManager,如果没有则生成新的fileCacheManager,解锁,调用fileCacheManager的Write函数。 2.考虑到同一个client同一个文件同时只能一个线程进行文件写,所以在Write函数中加写锁。 3.根据请求offset,计算出对应的chunk index和chunkPos。将请求拆分成多个chunk的WriteChunk调用。 4.在 1.根据InodeId找到对应的FileCacheManager,执行Flush函数。 2.在Flush函数中,加写锁,通过swap获取FileCacheManager的chunkCacheMap_到临时变量tmp,并清空chunkCacheMap_,解写锁。遍历tmp中的DataCache列表,执行Flush函数,并更新对应的元数据。 3.Flush返回成功。 4.如果DataCache的Fl lush的过程中有新的cache加入,则需要进行合并,合并的规则是新的cache如果和老的cache有重叠则覆盖老的cache。 FsSync流程 1.循环获取FileCacheManager,执行Flush函数。© XXX Page 9 of 9 后台流程 1.在FsCacheManager中增加一个DataCacheNum_字段,如果该字段为0,表示没有cache需要flush,则线程由条件变量控制处于wait状态。0 码力 | 9 页 | 179.72 KB | 6 月前3 Curve支持S3 数据缓存方案加锁,根据inode和fsid找到对应的fileCacheManager,如果没有则生成新的fileCacheManager,解锁,调用fileCacheManager的Write函数。 2.考虑到同一个client同一个文件同时只能一个线程进行文件写,所以在Write函数中加写锁。 3.根据请求offset,计算出对应的chunk index和chunkPos。将请求拆分成多个chunk的WriteChunk调用。 4.在 1.根据InodeId找到对应的FileCacheManager,执行Flush函数。 2.在Flush函数中,加写锁,通过swap获取FileCacheManager的chunkCacheMap_到临时变量tmp,并清空chunkCacheMap_,解写锁。遍历tmp中的DataCache列表,执行Flush函数,并更新对应的元数据。 3.Flush返回成功。 4.如果DataCache的Fl lush的过程中有新的cache加入,则需要进行合并,合并的规则是新的cache如果和老的cache有重叠则覆盖老的cache。 FsSync流程 1.循环获取FileCacheManager,执行Flush函数。© XXX Page 9 of 9 后台流程 1.在FsCacheManager中增加一个DataCacheNum_字段,如果该字段为0,表示没有cache需要flush,则线程由条件变量控制处于wait状态。0 码力 | 9 页 | 179.72 KB | 6 月前3
 CurveFS ChunkID持久化ChunkIDGenerator对象的GenChunkID方法; ChunkIDGenerator 类 构造函数 初始化 init 函数:用于初始化或者更改 ChunkIdAllocatorImpl 的一些配置。但是这些配置不会立即生效,而是等到当前 chunkId池枯竭时才会生效。 析构函数 GenChunkID 申请的chunkID池是否枯竭? 是,使用 KVStorageClient 申请新的chunkid 当前chunkID bundle 内最后一个可分配的chunkID bundleSize_;// chunkId池子的大小 };© XXX Page 3 of 3 1. 2. 问题与风险 构造函数内判断 storeKey_ 不存在时,会从0开始分配,可能会出现覆盖chunkid的情况; chunkID用完情况没有考虑;0 码力 | 3 页 | 79.38 KB | 6 月前3 CurveFS ChunkID持久化ChunkIDGenerator对象的GenChunkID方法; ChunkIDGenerator 类 构造函数 初始化 init 函数:用于初始化或者更改 ChunkIdAllocatorImpl 的一些配置。但是这些配置不会立即生效,而是等到当前 chunkId池枯竭时才会生效。 析构函数 GenChunkID 申请的chunkID池是否枯竭? 是,使用 KVStorageClient 申请新的chunkid 当前chunkID bundle 内最后一个可分配的chunkID bundleSize_;// chunkId池子的大小 };© XXX Page 3 of 3 1. 2. 问题与风险 构造函数内判断 storeKey_ 不存在时,会从0开始分配,可能会出现覆盖chunkid的情况; chunkID用完情况没有考虑;0 码力 | 3 页 | 79.38 KB | 6 月前3
 CurveFS Copyset与FS对应关系y和disk usage来选的,通常选择内存和disk使用率最低的节点。 并去对应的meta node上去创建对应的meta partition。 如何选择partition的host,通过这个函数去选择。 func (c *Cluster) (excludeZone , excludeNodeSets [] , excludeHosts [] , replicaNum , crossZone uint64 string int bool string [] , peers []proto.Peer, err ) string error metanode是否能够创建copyset,由这个函数判断。有这些判断条件: 1、metaNode的存活状态 2、metaNode的内存使用情况 3、metaNode的磁盘使用情况© XXX Page 4 of 19 4、metaNode上的partition的个数 造成巨大的锁开销,这个是不能接受的。 curve块设备的元数据管理,在分配数据的时候,offset一开始就是知道的,这是和curvefs分配很大的一个不同点。 假设已经确定了一个分片规则,那么根据这个分片规则,一定可以找到两个函数 inodeid到copyset的映射:copysetid = getPartition(inodeid) copyset管理的inode的范围:inoderange = getInodeRange(copyset)©0 码力 | 19 页 | 383.29 KB | 6 月前3 CurveFS Copyset与FS对应关系y和disk usage来选的,通常选择内存和disk使用率最低的节点。 并去对应的meta node上去创建对应的meta partition。 如何选择partition的host,通过这个函数去选择。 func (c *Cluster) (excludeZone , excludeNodeSets [] , excludeHosts [] , replicaNum , crossZone uint64 string int bool string [] , peers []proto.Peer, err ) string error metanode是否能够创建copyset,由这个函数判断。有这些判断条件: 1、metaNode的存活状态 2、metaNode的内存使用情况 3、metaNode的磁盘使用情况© XXX Page 4 of 19 4、metaNode上的partition的个数 造成巨大的锁开销,这个是不能接受的。 curve块设备的元数据管理,在分配数据的时候,offset一开始就是知道的,这是和curvefs分配很大的一个不同点。 假设已经确定了一个分片规则,那么根据这个分片规则,一定可以找到两个函数 inodeid到copyset的映射:copysetid = getPartition(inodeid) copyset管理的inode的范围:inoderange = getInodeRange(copyset)©0 码力 | 19 页 | 383.29 KB | 6 月前3
 CurveFS Client 概要设计void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev); 这两个函数的功能是类似,都用来创建文件。 根据parent inode id 和name,向mds查询创建dentry和inode的位置,去meta server创建dentry和inode 预分配一些空间?可先不做 server接口获取文件系统元数据信息,调用meta server接口获取文件和目录信息等 与现有块设备client交互,调用块设备接口,对卷进行读写。 向上对接fuse接口,协调上述模块交互,实现功能。 main 主函数模块,类似deamon,接收mount消息并处理(fuse session)。 除上述功能以外,还需实现文件系统创建和fuse挂载工具,功能主要是: 创建文件系统,指定文件系统的名字、卷大小(多文件系统)、0 码力 | 11 页 | 487.92 KB | 6 月前3 CurveFS Client 概要设计void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev); 这两个函数的功能是类似,都用来创建文件。 根据parent inode id 和name,向mds查询创建dentry和inode的位置,去meta server创建dentry和inode 预分配一些空间?可先不做 server接口获取文件系统元数据信息,调用meta server接口获取文件和目录信息等 与现有块设备client交互,调用块设备接口,对卷进行读写。 向上对接fuse接口,协调上述模块交互,实现功能。 main 主函数模块,类似deamon,接收mount消息并处理(fuse session)。 除上述功能以外,还需实现文件系统创建和fuse挂载工具,功能主要是: 创建文件系统,指定文件系统的名字、卷大小(多文件系统)、0 码力 | 11 页 | 487.92 KB | 6 月前3
 Open Flags 调研生的结果都是使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。差别在于:在读操作时,如果读不到数据,O_NDELAY会使I/O 函数马上返回0,但这又衍生出一个问题,因为读取到文件末尾(EOF)时返回的也是0,这样无法区分是哪种情况。因此O_NONBLOCK就产生出来,它在读取不到数据时会回传-1,并且设置errno为EAGAIN。 e,直接将数据在用户态和文件系统之间传递。从对本地文件系统和vfs分析发现,对齐的校 验在VFS do_blockdev_direct_IO中实现,各文件系统根据自己direct_io的实现调用该函数,例如ext4就进行了调用,如果需要做对齐处理可能需要在用户态文件系统中做判断。© XXX Page 20 of 23 // root@pubbeta1-nostest2:/tmp# strace0 码力 | 23 页 | 524.47 KB | 6 月前3 Open Flags 调研生的结果都是使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。差别在于:在读操作时,如果读不到数据,O_NDELAY会使I/O 函数马上返回0,但这又衍生出一个问题,因为读取到文件末尾(EOF)时返回的也是0,这样无法区分是哪种情况。因此O_NONBLOCK就产生出来,它在读取不到数据时会回传-1,并且设置errno为EAGAIN。 e,直接将数据在用户态和文件系统之间传递。从对本地文件系统和vfs分析发现,对齐的校 验在VFS do_blockdev_direct_IO中实现,各文件系统根据自己direct_io的实现调用该函数,例如ext4就进行了调用,如果需要做对齐处理可能需要在用户态文件系统中做判断。© XXX Page 20 of 23 // root@pubbeta1-nostest2:/tmp# strace0 码力 | 23 页 | 524.47 KB | 6 月前3
 PFS SPDK: Storage Performance Development Kit●ssize_t IOPortal::pappend_from_dev_descriptor(int fd, off_t offset, size_t max_count) ●这个函数的实现是按PRP的规定来做的 ●IOPortal就是IOBuf,是BRPC存放数据的类 ●CurveBS 使用brpc::Controller 的attachment 发送数据 ●attachment是一个IOBuf0 码力 | 23 页 | 4.21 MB | 6 月前3 PFS SPDK: Storage Performance Development Kit●ssize_t IOPortal::pappend_from_dev_descriptor(int fd, off_t offset, size_t max_count) ●这个函数的实现是按PRP的规定来做的 ●IOPortal就是IOBuf,是BRPC存放数据的类 ●CurveBS 使用brpc::Controller 的attachment 发送数据 ●attachment是一个IOBuf0 码力 | 23 页 | 4.21 MB | 6 月前3
 Curve文件系统元数据持久化方案设计持久化文件中涉及到的数字均以小端序存储 利用 fork 子进程 (COW) 的方式解决在持久化的过程中,读写冲突的问题以及性能问题 实现 1、inode、entry 的编码 给 inode、dentry 增加编码函数 // 这里要尽可能减少 key/value 编码后的字节数,这样同样的内存可以存入较多的 key/value 对 序列化目前主要考虑以下 2 种,一种是参考 chubaofs 顺序编码,一种是利用0 码力 | 12 页 | 384.47 KB | 6 月前3 Curve文件系统元数据持久化方案设计持久化文件中涉及到的数字均以小端序存储 利用 fork 子进程 (COW) 的方式解决在持久化的过程中,读写冲突的问题以及性能问题 实现 1、inode、entry 的编码 给 inode、dentry 增加编码函数 // 这里要尽可能减少 key/value 编码后的字节数,这样同样的内存可以存入较多的 key/value 对 序列化目前主要考虑以下 2 种,一种是参考 chubaofs 顺序编码,一种是利用0 码力 | 12 页 | 384.47 KB | 6 月前3
 Curve质量监控与运维 - 网易数帆Then 设计方法 500+用例  异常测试 40+自动化用例  混沌测试 20轮自动化随机故障注入 12/33单元测试 单元测试是软件开发的过程中最基本的测试,它用来对一个模块、一个函数或者一个类来进行 正确性检验的测试工作。 curve通过lcov统计代码覆盖率,衡量单元测试的完备程度,如下图所示: 13/33集成测试 测试目的 测试内容 单元测试后,有必要进行集成测试,发现0 码力 | 33 页 | 2.64 MB | 6 月前3 Curve质量监控与运维 - 网易数帆Then 设计方法 500+用例  异常测试 40+自动化用例  混沌测试 20轮自动化随机故障注入 12/33单元测试 单元测试是软件开发的过程中最基本的测试,它用来对一个模块、一个函数或者一个类来进行 正确性检验的测试工作。 curve通过lcov统计代码覆盖率,衡量单元测试的完备程度,如下图所示: 13/33集成测试 测试目的 测试内容 单元测试后,有必要进行集成测试,发现0 码力 | 33 页 | 2.64 MB | 6 月前3
 curvefs client删除文件和目录功能设计这种情况下,就会存在nlink未被减1的情况,当所有硬链接都被删除后,就会出现孤儿inode。 moosefs由于只有一个mds节点看,所以不存在这个问题。 chubaofs的解决方案是: 在Delete_ll(api.go) 函数中,在delete dentry后有一段注释如下: // dentry is deleted successfully but inode is not, still returns success0 码力 | 15 页 | 325.42 KB | 6 月前3 curvefs client删除文件和目录功能设计这种情况下,就会存在nlink未被减1的情况,当所有硬链接都被删除后,就会出现孤儿inode。 moosefs由于只有一个mds节点看,所以不存在这个问题。 chubaofs的解决方案是: 在Delete_ll(api.go) 函数中,在delete dentry后有一段注释如下: // dentry is deleted successfully but inode is not, still returns success0 码力 | 15 页 | 325.42 KB | 6 月前3
共 11 条
- 1
- 2













