 Open Flags 调研open flags 在curvefs上的测试 open flags 实现方式 整体flags支持方案 具体flag的实现方案 O_TRUNC I/O模式类 O_DIRECT O_SYNC, O_DSYNC O_NONBLOCK(O_NDELAY ), FASYNC, O_TMPFILE 结论 参考文献 open接口原型 # man page open, openat, creat - open const char *pathname, const struct open_how *how, size_t size); open系统调用会打开pathname指定的文件(如果不存在,如果携带O_CREAT flag则会创建),返回一个文件描述符fd(该fd是进程打开文件描述符表的index),在后续系统调用(read(2)、write(2)、lseek(2)、fcntl(2) etc.)中 持 #define O_RDONLY 00000000 #define O_WRONLY 00000001 #define O_RDWR 00000002 #define O_CREAT 00000100 #define O_EXCL 00000200 #define O_NOCTTY 00000400 #define O_TRUNC 00001000 #define O_APPEND 000020000 码力 | 23 页 | 524.47 KB | 6 月前3 Open Flags 调研open flags 在curvefs上的测试 open flags 实现方式 整体flags支持方案 具体flag的实现方案 O_TRUNC I/O模式类 O_DIRECT O_SYNC, O_DSYNC O_NONBLOCK(O_NDELAY ), FASYNC, O_TMPFILE 结论 参考文献 open接口原型 # man page open, openat, creat - open const char *pathname, const struct open_how *how, size_t size); open系统调用会打开pathname指定的文件(如果不存在,如果携带O_CREAT flag则会创建),返回一个文件描述符fd(该fd是进程打开文件描述符表的index),在后续系统调用(read(2)、write(2)、lseek(2)、fcntl(2) etc.)中 持 #define O_RDONLY 00000000 #define O_WRONLY 00000001 #define O_RDWR 00000002 #define O_CREAT 00000100 #define O_EXCL 00000200 #define O_NOCTTY 00000400 #define O_TRUNC 00001000 #define O_APPEND 000020000 码力 | 23 页 | 524.47 KB | 6 月前3
 BRPC与UCX集成指南命令行参数控制context的属性 ●--brpc_ucp_error_mode缺省是none,是的本地通讯使用shared memory成为可能 ●--brpc_set_cpu_latency 非-1, 设置intel cpu节电模式,可能减少硬 件延迟。 –/dev/cpu_dma_latency ●root特权 –Busy poll下不要开启,可能导致电耗过高、cpu降速40 Ucp m检测到pipe读端fd可 读并且EOF,进而检测到UcpConnection需要关闭。61 修改Socket::StartWrite ucp_conn的写总是提交给ucp worker的,不会阻塞,所以不会用到 brpc eve62 4K 数据RPC时延比较(us) (双网卡bond) 深度 RDMA TCP 1 32 85 2 39 86 4 46 128 8 47 170 160 码力 | 66 页 | 16.29 MB | 6 月前3 BRPC与UCX集成指南命令行参数控制context的属性 ●--brpc_ucp_error_mode缺省是none,是的本地通讯使用shared memory成为可能 ●--brpc_set_cpu_latency 非-1, 设置intel cpu节电模式,可能减少硬 件延迟。 –/dev/cpu_dma_latency ●root特权 –Busy poll下不要开启,可能导致电耗过高、cpu降速40 Ucp m检测到pipe读端fd可 读并且EOF,进而检测到UcpConnection需要关闭。61 修改Socket::StartWrite ucp_conn的写总是提交给ucp worker的,不会阻塞,所以不会用到 brpc eve62 4K 数据RPC时延比较(us) (双网卡bond) 深度 RDMA TCP 1 32 85 2 39 86 4 46 128 8 47 170 160 码力 | 66 页 | 16.29 MB | 6 月前3
 Curve核心组件之Client - 网易数帆C u r v e 核 心 组 件 之 C l i e n t 吴汉卿CURVE CURVE是高性能、高可用、高可靠的分布式存储系统 • 高性能、低延迟存储底座 • 可扩展存储场景:块存储、对象存储、云原生数据库、EC等 • 当前实现了高性能块存储,对接 OpenStack 和 k8s • 网易内部线上无故障稳定运行400+天 • 已开源 • github主页: https://opencurve 这种情况下单线程只有 89055 iops 发送RPC阻塞了用户线程,导致iops下降 优化点: 增加队列,用户请求放入队列,由后台线 程负责发送 86.4K -> 130KCLIENT性能优化  发送RPC耗时较长  增加发送线程个数  在bthread协程中使用std::mutex/spinlock,在大量并发的情况下,会阻塞worker线程,也 存在瓶颈  std::mutex/spinlock0 码力 | 27 页 | 1.57 MB | 6 月前3 Curve核心组件之Client - 网易数帆C u r v e 核 心 组 件 之 C l i e n t 吴汉卿CURVE CURVE是高性能、高可用、高可靠的分布式存储系统 • 高性能、低延迟存储底座 • 可扩展存储场景:块存储、对象存储、云原生数据库、EC等 • 当前实现了高性能块存储,对接 OpenStack 和 k8s • 网易内部线上无故障稳定运行400+天 • 已开源 • github主页: https://opencurve 这种情况下单线程只有 89055 iops 发送RPC阻塞了用户线程,导致iops下降 优化点: 增加队列,用户请求放入队列,由后台线 程负责发送 86.4K -> 130KCLIENT性能优化  发送RPC耗时较长  增加发送线程个数  在bthread协程中使用std::mutex/spinlock,在大量并发的情况下,会阻塞worker线程,也 存在瓶颈  std::mutex/spinlock0 码力 | 27 页 | 1.57 MB | 6 月前3
 CurveFs 用户权限系统调研2642837 2589230 0 13:47 pts/156 00:00:00 ./bazel-bin/curvefs/src/client/fuse_client -f -o volume=/fs -o user=test -o conf=./curvefs/conf/curvefs_client.conf /tmp/fsmount 问题1:root用户无法访问挂载目录 测试发现client Page 4 of 33 查阅资料发现这是fuse的一种安全策略,默认是只有filesystem owner拥有该文件系统的访问权限,如果想要其他用户有权访问,需要在挂载参数中指定‘-o allow-root’ 或'-o allow-other'以允许相应用户有权访问该文件系统,如果挂载者不是root还需要在/etc/fuse.conf(/usr/local/etc/fuse.conf)中增加配置项 现共享。© XXX Page 7 of 33 strace ./bazel-bin/curvefs/src/client/fuse_client -f -o volume=/fs -o allow_other -o user=test -o conf=./curvefs/conf/curvefs_client.conf /tmp/fsmount ... mount("fuse_client", "/tmp/fsmount"0 码力 | 33 页 | 732.13 KB | 6 月前3 CurveFs 用户权限系统调研2642837 2589230 0 13:47 pts/156 00:00:00 ./bazel-bin/curvefs/src/client/fuse_client -f -o volume=/fs -o user=test -o conf=./curvefs/conf/curvefs_client.conf /tmp/fsmount 问题1:root用户无法访问挂载目录 测试发现client Page 4 of 33 查阅资料发现这是fuse的一种安全策略,默认是只有filesystem owner拥有该文件系统的访问权限,如果想要其他用户有权访问,需要在挂载参数中指定‘-o allow-root’ 或'-o allow-other'以允许相应用户有权访问该文件系统,如果挂载者不是root还需要在/etc/fuse.conf(/usr/local/etc/fuse.conf)中增加配置项 现共享。© XXX Page 7 of 33 strace ./bazel-bin/curvefs/src/client/fuse_client -f -o volume=/fs -o allow_other -o user=test -o conf=./curvefs/conf/curvefs_client.conf /tmp/fsmount ... mount("fuse_client", "/tmp/fsmount"0 码力 | 33 页 | 732.13 KB | 6 月前3
 CurveFS Client 概要设计posix语义中open支持的oflag主要有: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 读写打开 以上3个必须指定且只能指定一个 O_APPEND 只追加写 O_CREAT 文件不存在时创建 O_EXCL 如果同时指定了O_CREAT,而文件已存在,则会出错,用此测试文件是否存在,如果不存在则创建此文件。 O_TRUNC 如果文件存在,且为只写或只读打开,则将其文件长度截短为0 O_DSYNC sync数据和必要元数据(不影响读取刚写入的数据) O_SYNC sync数据和所有元数据 O_DIRECTORY 目录 O_DIRECT 直接IO open的主要逻辑: 根据inode id,从mds获取inode所在copyset,metaserver ip等信息,然后从metaserver获取inode结构,缓存之; 判断上述各种oflag,执行相应的操作。( ) 对于目前阶段来说,open可以什么都不做 fuse_ino_t parent, const char *name); 根据parent inode id 和 name找到当前文件的inode和denty结构 根据lookup count 值,如果非0,则需要延迟删除文件,如果为0,则真正删除文件。 ( ) 这里需要做标记删除 删除时需要从缓存或mds查询删除inode和dentry的位置,并去metaserver删除,然后清除本地缓存 rmdir0 码力 | 11 页 | 487.92 KB | 6 月前3 CurveFS Client 概要设计posix语义中open支持的oflag主要有: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 读写打开 以上3个必须指定且只能指定一个 O_APPEND 只追加写 O_CREAT 文件不存在时创建 O_EXCL 如果同时指定了O_CREAT,而文件已存在,则会出错,用此测试文件是否存在,如果不存在则创建此文件。 O_TRUNC 如果文件存在,且为只写或只读打开,则将其文件长度截短为0 O_DSYNC sync数据和必要元数据(不影响读取刚写入的数据) O_SYNC sync数据和所有元数据 O_DIRECTORY 目录 O_DIRECT 直接IO open的主要逻辑: 根据inode id,从mds获取inode所在copyset,metaserver ip等信息,然后从metaserver获取inode结构,缓存之; 判断上述各种oflag,执行相应的操作。( ) 对于目前阶段来说,open可以什么都不做 fuse_ino_t parent, const char *name); 根据parent inode id 和 name找到当前文件的inode和denty结构 根据lookup count 值,如果非0,则需要延迟删除文件,如果为0,则真正删除文件。 ( ) 这里需要做标记删除 删除时需要从缓存或mds查询删除inode和dentry的位置,并去metaserver删除,然后清除本地缓存 rmdir0 码力 | 11 页 | 487.92 KB | 6 月前3
 Curve文件系统元数据管理内部结点不保存数据,只有叶子结点保存数据。 https://github.com/begeekmyfriend/bplustree,(MIT),实现了落 盘 BST O(log(n)) O(n) c++ stl 模板© XXX Page 4 of 24 skip list O(log(n)) O(n) level db,https://github.com/google/leveldb/blob/master/db/skip com/happyfish100/libfastcommon/tr ,(LGPL) ee/master/src hash table O(1)~O(n) O(n) + table 需要占用额外空间,性能和hash表的大小有关,最理想可以达到O(1)复杂度,最差O(n)复杂度。 c++ stl unordered_map moose,使用c实现 4、curve文件系统的元数据内存组织 100,查询的"A"的inode信息。 3、client给server1发送请求:parentid 100,查询parentid 为100的dentry记录。查询到 100 + C → 300,目录非空,不能删除。 rename:rename /A/C到/B/E 1、client给server0发送请求: parentid 0 + name "A",查询"A"的inodeid为100©0 码力 | 24 页 | 204.67 KB | 6 月前3 Curve文件系统元数据管理内部结点不保存数据,只有叶子结点保存数据。 https://github.com/begeekmyfriend/bplustree,(MIT),实现了落 盘 BST O(log(n)) O(n) c++ stl 模板© XXX Page 4 of 24 skip list O(log(n)) O(n) level db,https://github.com/google/leveldb/blob/master/db/skip com/happyfish100/libfastcommon/tr ,(LGPL) ee/master/src hash table O(1)~O(n) O(n) + table 需要占用额外空间,性能和hash表的大小有关,最理想可以达到O(1)复杂度,最差O(n)复杂度。 c++ stl unordered_map moose,使用c实现 4、curve文件系统的元数据内存组织 100,查询的"A"的inode信息。 3、client给server1发送请求:parentid 100,查询parentid 为100的dentry记录。查询到 100 + C → 300,目录非空,不能删除。 rename:rename /A/C到/B/E 1、client给server0发送请求: parentid 0 + name "A",查询"A"的inodeid为100©0 码力 | 24 页 | 204.67 KB | 6 月前3
 Curve核心组件之snapshotclone高可用,快照任务中断自动拉起继续转储快照和克隆的特点 • 克隆的定义 • 克隆是指从卷复制出卷的功能,提供快速的复制卷的能力。 • 这里的克隆还包括从快照回滚的功能 • 克隆的特点 • 支持Lazy和非Lazy两种模式克隆 • 支持从快照克隆和从镜像(卷)克隆 • 支持从快照回滚 • 高可用,克隆任务中断自动拉起继续克隆快照克隆服务器架构 • 基于brpc提供restful API的对外http接口 5.8.9.更新元数据克隆卷状态变化 • 初始状态; • 正在安装元数据或拷贝数据中; • 用户不可见。 Cloning: • 元数据安装成功; • Lazy方式下可见,用户可用; • 非Lazy不可见。 MetaInstalled: • 数据拷贝完成; • 可提供所有服务。 Cloned:LAZY 克隆 Lazy克隆 较快,秒级克隆: MetaInstalled状态可用,即完成元数据安装,就 Lazy克隆不直接分配chunk,而是等到client来写 时才分配chunk 额外接口: 不进行数据复制,而是提供额外的Flatten接口, 完成数据复制。 适用场景: 适用于从镜像快速创建云主机场景 非Lazy克隆 较慢,分钟级: Cloned状态可用,即完成整个数据克隆,才从临 时目录rename,用户才可见。 无Lazy Alloc chunk: 安装元数据时即分配好chunk。 无额外接口:0 码力 | 23 页 | 1.32 MB | 6 月前3 Curve核心组件之snapshotclone高可用,快照任务中断自动拉起继续转储快照和克隆的特点 • 克隆的定义 • 克隆是指从卷复制出卷的功能,提供快速的复制卷的能力。 • 这里的克隆还包括从快照回滚的功能 • 克隆的特点 • 支持Lazy和非Lazy两种模式克隆 • 支持从快照克隆和从镜像(卷)克隆 • 支持从快照回滚 • 高可用,克隆任务中断自动拉起继续克隆快照克隆服务器架构 • 基于brpc提供restful API的对外http接口 5.8.9.更新元数据克隆卷状态变化 • 初始状态; • 正在安装元数据或拷贝数据中; • 用户不可见。 Cloning: • 元数据安装成功; • Lazy方式下可见,用户可用; • 非Lazy不可见。 MetaInstalled: • 数据拷贝完成; • 可提供所有服务。 Cloned:LAZY 克隆 Lazy克隆 较快,秒级克隆: MetaInstalled状态可用,即完成元数据安装,就 Lazy克隆不直接分配chunk,而是等到client来写 时才分配chunk 额外接口: 不进行数据复制,而是提供额外的Flatten接口, 完成数据复制。 适用场景: 适用于从镜像快速创建云主机场景 非Lazy克隆 较慢,分钟级: Cloned状态可用,即完成整个数据克隆,才从临 时目录rename,用户才可见。 无Lazy Alloc chunk: 安装元数据时即分配好chunk。 无额外接口:0 码力 | 23 页 | 1.32 MB | 6 月前3
 Curve质量监控与运维 - 网易数帆7/33设计文档规范 设计文档需要具备以下内容:  修订记录  审批记录  系统介绍  相关调研  架构  重要流程  关键算法  接口  数据库设计  非功能特性设计  参考文献 8/33代码编写规范 Curve代码编写规范遵循Google Style Guides(https://google.github.io/styleguide/) 9/33新代码提交 查询Curve状态  管理Curve文件  管理copyset 运维工具 Ansible  一键部署: ansible-playbook -i server.ini deploy_curve.yml  一键升级:ansible-playbook -i server.ini rolling_update_curve.yml 32/330 码力 | 33 页 | 2.64 MB | 6 月前3 Curve质量监控与运维 - 网易数帆7/33设计文档规范 设计文档需要具备以下内容:  修订记录  审批记录  系统介绍  相关调研  架构  重要流程  关键算法  接口  数据库设计  非功能特性设计  参考文献 8/33代码编写规范 Curve代码编写规范遵循Google Style Guides(https://google.github.io/styleguide/) 9/33新代码提交 查询Curve状态  管理Curve文件  管理copyset 运维工具 Ansible  一键部署: ansible-playbook -i server.ini deploy_curve.yml  一键升级:ansible-playbook -i server.ini rolling_update_curve.yml 32/330 码力 | 33 页 | 2.64 MB | 6 月前3
 PFS SPDK: Storage Performance Development Kit●SGL要求字节/或4字节对齐(double word), 相对宽松10/17/22 13 PFS NVME读对齐实现 ●内存分配页面对齐,实现基于PRP严格的规定,这样SGL也可以用 ●第一个页面可以从非0的页内位置开始直到页面结束位置,必须是512字节倍数。 第 二个页面必须是整页,内存位置必须在页内位置0处。 最后一个页面,开始位置也在 页面0处,但可以是不完整的一个页面。 ●如上图所示,绿色位置是数据传输部分。 ●网络部分依赖内核tcp,不是零copy10/17/22 18 进展 ●还在测试CurveBS ●布置、监控等工具需要更新10/17/22 19 性能测试 ●使用pfs daemon测试 ●估计非daemon模式的会更快一点,因为没有跨进程开销10/17/22 20 Write,DMA write,Write-zero测试10/17/22 21 fio 4k 1个并发+单深度10/17/220 码力 | 23 页 | 4.21 MB | 6 月前3 PFS SPDK: Storage Performance Development Kit●SGL要求字节/或4字节对齐(double word), 相对宽松10/17/22 13 PFS NVME读对齐实现 ●内存分配页面对齐,实现基于PRP严格的规定,这样SGL也可以用 ●第一个页面可以从非0的页内位置开始直到页面结束位置,必须是512字节倍数。 第 二个页面必须是整页,内存位置必须在页内位置0处。 最后一个页面,开始位置也在 页面0处,但可以是不完整的一个页面。 ●如上图所示,绿色位置是数据传输部分。 ●网络部分依赖内核tcp,不是零copy10/17/22 18 进展 ●还在测试CurveBS ●布置、监控等工具需要更新10/17/22 19 性能测试 ●使用pfs daemon测试 ●估计非daemon模式的会更快一点,因为没有跨进程开销10/17/22 20 Write,DMA write,Write-zero测试10/17/22 21 fio 4k 1个并发+单深度10/17/220 码力 | 23 页 | 4.21 MB | 6 月前3
 Curve设计要点Client 对元数据增删改查 对数据增删改查基本架构 • 快照克隆服务器 独立于核心服务 储到支持S3接口的 对象存储,不限制数量 异步快照、增量快照 从快照/镜像克隆 ( lazy/非lazy ) 从快照回滚数据组织形式 • 底层 可用性 / 可靠性 扩展性 / 负载均衡 向上提供无差别文件流 • Application 块/对象/EC等 感知具体格式 提供不同文件类型支撑不同上层应用数据组织形式0 码力 | 35 页 | 2.03 MB | 6 月前3 Curve设计要点Client 对元数据增删改查 对数据增删改查基本架构 • 快照克隆服务器 独立于核心服务 储到支持S3接口的 对象存储,不限制数量 异步快照、增量快照 从快照/镜像克隆 ( lazy/非lazy ) 从快照回滚数据组织形式 • 底层 可用性 / 可靠性 扩展性 / 负载均衡 向上提供无差别文件流 • Application 块/对象/EC等 感知具体格式 提供不同文件类型支撑不同上层应用数据组织形式0 码力 | 35 页 | 2.03 MB | 6 月前3
共 23 条
- 1
- 2
- 3













