Open Flags 调研flag,且值使用原O_SYNC的值,但为了兼容老版本的O_SYNC,现在O_SYNC=O_DSYNC|04000000)。 FASYNC: 异步的,启用signal-driven I/O。 : 直接I/O,执行磁盘I/O时绕过缓冲区高速缓存,从用户空间直接将数据传递到文件或磁盘设备。 O_DIRECT : 使得32位操作系统对大文件支持(_FILE_OFFSET_BITS=64)。 O_LARGEFILE : 以目录形 --_ref; } }; FastCFS处理方式是自定义FileInfo保存文件打开的状态信息,在create()、open()、opendir()操作时填充进 fuse_file_info结构中,在后续操作中直接使用: struct fuse_file_info { /** Open flags. Available in open() and release() */ int flags; /** 系统调用打开文件时,如果不指定 O_DIRECT 标志,那么就是使用缓存I/O来对文件进行读写操作。系统缓存位于VFS和真实文件系统之间,当虚拟文件系统读文件时,首先从缓存中查找要读取的文件内容是否存在缓存中,如果存在就直接从缓存中读取。对文 件进行写操作时也一样,首先写入到缓存中,然后由操作系统同步到块设备(如磁盘)中。对于通用块设备层来说要求io请求是块设备blocksize对齐的,对应buffered io在pa0 码力 | 23 页 | 524.47 KB | 6 月前3
 CurveFS S3本地缓存盘方案当前,s3客户端在写底层存储的时候是直接写入远端对象存储,由于写远端时延相对会较高,所以为了提升性能,引入了写本地缓存盘方案。也即要写底层存储时,先把数据写到本地缓存硬盘,然后再把本地缓存 硬盘中的数据异步上传到远端对象存储。 方案设计© XXX Page 3 of 9 S3模块接收到写入后先写入写内存缓存页,如果满足持久化的条件后,那么则准备持久化。 如果未配置本地硬盘作为写缓存,那么直接持久化到远端的对 象存储;如果配置了本地硬盘作为写缓存,那么则尝试先写入本地硬盘写缓存目录。 写本地硬盘缓存目录之前先判断缓存目录容量是否已达到阈值,如果已经达到阈值,那么则直接写入到远端对象存储;否则,则写入到本地硬盘写缓存目录中。文件写入本地硬盘写缓存目录后,从本地硬盘读目录© XXX Page 4 of 9 做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录 本地缓存盘存放的文件即是存储到对象存储中的对象。 写缓存如何作为读缓存利用 除了写缓存目录,另外引入读缓存目录;当写缓存目录中有新文件加入时,则对该文件做硬链接到读缓存目录。 这样,写缓存目录中的文件上传完之后就可以直接删除了,那么该文件的读缓存还是存在的。 缓存盘空间管理 当缓存文件内容达到阈值时,停止向本地缓存盘写入。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。0 码力 | 9 页 | 150.46 KB | 6 月前3
 PFS SPDK: Storage Performance Development Kit●CurveBS对文件系统元数据的操作非常少,对文件系统的要求不高, 所以不需要元数据高性能,这方面PFS也合适10/17/22 6 对PFS的修改 ●基于阿里开源的PFS ●不再基于daemon模式,而是直接使用pfs core api ●依然向外提供管理工具, 例如 pfs ls、cp、rm等 ●增加spdk驱动10/17/22 7 新增PFS接口 ●增加pfs_pwritev和pfs_preadv接口 off_t offset); ●直接DMA读写,要求的内存必须是DPDK的hugetlb内存 ●必须符合NVME 内存读写地址对齐要求 ●offset 512对齐 ●为零copy提供接口10/17/22 10 BRPC IOBuf DMA ●修改BRPC,允许使用dpdk内存作为IOBuf的内存分配器 ●BRPC接收到的数据在IOBuf中,IOBuf直接使用于NVME DMA传输 ● ●在初始化curvebs时,需要创建chunk pool, 每一个chunk都要填零 ●chunk不再被卷使用时,需要回归chunk pool,为了安全也需要填0。 ●使用nvme的时候,可以直接使用nvme write zero命令,不需要传递 大块数据(全是0),减少了nvme传输带宽,而且nvme在垃圾回收上 可以优化,例如只是标记某块为0, 而不用实际写,gc时不需要搬运。10/17/220 码力 | 23 页 | 4.21 MB | 6 月前3
 Raft在Curve存储中的工程实践点初始状态一致的时候,保证节点之间状态一致。 raft日志复制RAFT协议简介 raft配置变更 • 配置:加入一致性算法的服务器集合。 • 集群的配置不可避免会发生变更,比如替换宕机的机器。 直接配置变更可能出现双主问题 • 共同一致(joint consensus) • 集群先切换到一个过渡的配置(old + new),一旦共同一 致已经被提交,系统切换到新的配置(new)。RAFT协议简介 chunkserver服务重启,只需要加载快照,然后对 chunk重放快照之后日志即可。 raft snapshot • 用户数据的写入最终转化为对chunk的写入。 • raft的apply,直接在对应的chunk上写入数据。Curve文件存储RAFT应用 Curve文件存储 • 分布式文件系统 • 支持多挂载,提供close-to-open一致性 • 提供缓存加速,可使用内存、本地盘、云盘加速 数据集群:采用外部存储,S3或者Curve块存储,保 存写入文件的数据。Curve文件存储RAFT应用 基于rocksdb的存储引擎 • 要求存储的元数据的大小不超过内存的大小 • raft apply的请求,数据都在内存,直接修改 内存中的数据 • raft snapshot,为避免快照对正常操作的影 响,利用操作系统的内存写时复制技术, fork一个进程创建完整的状态机的内存快照, 后台遍历内存,把内存的数据持久化到本地0 码力 | 29 页 | 2.20 MB | 6 月前3
 Curve核心组件之snapshotclone高可用,克隆任务中断自动拉起继续克隆快照克隆服务器架构 • 基于brpc提供restful API的对外http接口 HttpService: • Serivce层面区分上层请求为同步接口调用,还是异步接口调用, 同步接口调用直接调用Core层接口实现功能,异步接口创建Task, 并交由TaskManager调度。 SnapshotService & CloneService: • 任务管理层负责调度SnapshotT 拷贝的单位是一个Page,即4KB  使用snapfile中的bitmap标记复制过的PageCHUNKSERVER端快照实现-转储内部快照 a) 打快照后未写过,未触发cow, 无snap file产生,直接读取chunk file b) 打快照后写过,触发了cow, 有snap file, 合并读取 c) 卷从未写过, 两者都没有,返回NOTEXIST 转储内部快照,即读内部快照的三种情况:克隆总体流程 Lazy克隆 较快,秒级克隆: MetaInstalled状态可用,即完成元数据安装,就 从临时目录rename,用户可见。 Lazy Alloc Chunk,利于超售: Lazy克隆不直接分配chunk,而是等到client来写 时才分配chunk 额外接口: 不进行数据复制,而是提供额外的Flatten接口, 完成数据复制。 适用场景: 适用于从镜像快速创建云主机场景0 码力 | 23 页 | 1.32 MB | 6 月前3
 Curve文件系统空间分配方案在sync/flush之前,尽可能多的积累更多的文件数据块才进行空间分配,一方面可以提高局部性,另一方面可以降低磁盘碎片。 Inline file/data 几百字节的小文件不单独分配磁盘空间,直接把数据存放到文件的元数据中。 针对上述的本地文件系统特性,Curve文件系统分配需要着重考虑 。 局部性 虽然Curve是一个分布式文件系统,但是单个文件系统的容量可能会比较大,如果在空间 后续,file1再次追加写入2MiB数据,此时申请空间时,需要附带上file1最后一个字节数据在底层存储的位置,再加1(期望申请的地址空间起始offset)。以图中为例,则附带的值为30MiB。 这次的空间申请,直接从level2中以30MiB作为key进行查找,找到后,进行空间分配。分配之后,相关信息如下图所示: 之前剩余的 30MiB ~ 2MiB 的extent完全分配出去,所以从level2中的list中删除。 3. 1. 2. 1. 2. 。尽可能合并多个块分配给同一个文件。 空间回收 空间回收主要是一个extent合并的过程,有以下几种情况: 文件释放了一个完整的块,则直接将level1中对应的bit置为0。 文件释放了一小段空间,则尝试与level2中的extent进行合并。 如果合并之后是一个完整的块,则重新将level1中对应的bit置为0,同时删除该extent。0 码力 | 11 页 | 159.17 KB | 6 月前3
 curvefs client删除文件和目录功能设计对应的metasever接收到请求后,如果是文件,使得nlink计数减1,如果减到0,则将inodeid放到freelist中。 inode在freelist中存放7天,以应对有文件被打开的情况。 如果nlink减到0的是目录,则直接移除,不需要放到freelist中,目录由于是nlink从2开始,当目录的nlink=2时,连续减两次到0。 freelist会被定期清理,清理时筛选出超过7天的inodeid,将其从inode tree和free est, metaserver在收到该请求后,则设置inode的DeleteMarkFlag,并将其放入freelist。 freelist在定期清理时,当发现设置了DeleteMarkFlag,则直接从inode tree和free list中移除该inode,不再等待7天。 chubaofs实现了强制从freelist中移除inode的机制,同样是使用设置DeleteMarkFlag的方式。 此时,nlink是没有-1的,删除接口直接忽略了第二步的错误。 根据其论文描述:© XXX Page 14 of 15 chubaofs使用的是类似fsck的工具去修复这个问题,也就是运维手段。 工作量评估 需要修改的模块,如下: Client端: 实现symlink、link接口; 修改unlink、rmdir接口,删除dentry,调用metaserver unlink,而不直接删除inode0 码力 | 15 页 | 325.42 KB | 6 月前3
 NJSD eBPF 技术文档 - 0924版本对⽐测试 • ⽂件访问测试直接访问ext4 • 通过FUSE访问passthrough_ll底层ext4 • 内核调⽤延迟测试 • 与FUSE Daemon通讯120us左右,FUSE Daemon⼤概10us以内 • 瓶颈在/dev/fuse通讯开销基于FUSE可能的优化点 • 降低内核与libfuse通讯延迟 • 基于⽂件属性的操作内核直接返回? • 基于⽂件数据的操作先内核读写 Curve⽂件系统采⽤cache来提升性能,对象存储来降低成本 • ⽬前⾯临Curve⽂件系统客户端延迟较⼤的问题 • 解决延迟有ld_preload以及ebpf的⽅式,各有优缺点 • 使⽤ebpf可以在内核中直接读取cache数据,并返回,降低了延迟。 • 介绍了ebpf基于FUSE的cache设计THANKS0 码力 | 20 页 | 7.40 MB | 6 月前3
 Curve核心组件之Client - 网易数帆热升级NEBD总体介绍 新版本Client/NEBD性能优化NEBD 整体介绍 热升级之前,QEMU是直接链接curve-client, 所以client版本需要升级时,需要对QEMU进 程进行重启。NEBD 整体介绍 在QEMU和Curve Client中间加入热升级模块,避 免直接依赖 热升级模块是CS结构:  NEBD Client(part1):只包含轻量的业务逻辑, 以链接库的形式提供给QEMU使用 Server收到RPC处标记请求成功,并返回 Curve Client发送RPC处标记请求成功,并返回 Chunkserver收到RPC处标记请求成功,并返回NEBD性能优化 NEBD Client接收到IO请求后,直接发送 异步RPC(在用户线程) 发送异步4K RPC的平均延迟在11.26us, 这种情况下单线程只有 89055 iops 发送RPC阻塞了用户线程,导致iops下降 优化点: 增加队列,用户请求放入队列,由后台线0 码力 | 27 页 | 1.57 MB | 6 月前3
 Curve支持S3 数据缓存方案对外接口 流程上对于读写缓存有影响的接口包括:write,read,releaseCache,flush,fssync。后面会详细介绍这些接口流程。这里不需要提供truncate接口,可以由client直接修改inode的len,由metaserver的碎片整 理(马杰负责)模块进行truncate的无效数据清理 后台刷数据线程© XXX Page 4 of 9 启动后台线程,将写Cache定时刷 个可读的DataCache,由于DataCache都是最小粒度为blockSIze的缓存,所以存在3种情况:要读的 chunkPos~len的区间全部被缓存,部分被缓存,以及无缓存。将缓存部分buf直接copy到接口的buf指针对应的偏移位置,无缓存部分生成requestVer。 3.遍历requestVer,根据每个request的offset找到inode中对应index的S3ChunkInf Flush返回成功。 4.如果DataCache的Flush失败,则整个Flush失败。但是缓存需要重新回退到chunkCacheMap_中,这里要注意一点:回退的过程,如果chunkCacheMap_为空,则直接swap回退。如果chunkCacheMap_不为空,则表示F lush的过程中有新的cache加入,则需要进行合并,合并的规则是新的cache如果和老的cache有重叠则覆盖老的cache。 FsSync流程0 码力 | 9 页 | 179.72 KB | 6 月前3
共 20 条
- 1
 - 2
 













