CeresDB Rust 生产实践 任春韶2018.10 2019.02 ~ 2020.11 2021.9 自研存储引擎 1.0.0 版本发布 查询性能优化 Prometheus 协议支持 基于 InfluxDB 单机引擎研发 分布式方案 OpenTSDB 协议 内存时序数据库 存储计算分离架构 分级存储 永久代 CeresDB 开源 2022.6 2023.3 开源版本 CeresDB 开始研 发 2023.6 1.2.2 版本发布 优化了写入性能 优化了分布式方案 CeresDB – 目标 解决时间线高基数问题 • 能高效处理好 APM 型时序数据 • 同时能高效处理好高基数时间线场景 提供原生分布式方案 • 大规模部署 • 提供高可用、高可靠的服务 • 支持水平扩容 • 支持高效的分布式查询 - Tokio Preemption cpu_runtime.spawn(task2) cpu_runtime.spawn(task3) 生产实践 – Preemption 总结: Mixed workload: 碰到混合负载的时候,把 CPU 密集型任务隔离出去 会得到比较好的效果。 相关 Blog : 1. https://tokio.rs/blog/2020-04-preemption 2. https://www.influxdata0 码力 | 22 页 | 6.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 DogObject 继承自 IObject ,他 们实现了 eatFood 这个虚函数,实现了多态。 • 注意这里解构函数( ~IObject )也需要是虚函数 ,否则以 IObject * 存储的指针在 delete 时只 会释放 IObject 里的成员,而不会释放 CatObject 里的成员 string m_catFood 。所以 这里的解构函数也是多态的,他根据类型的不同 html 类型擦除利用的是 C++ 模板的惰性实例化, Java 的泛型是做不到滴 • 由于 C++ 模板惰性编译的特性,这个擦除掉的表达式会在你实例化 AnimalWrapper的时候 自动对 T 进行编译。这意味着如果你给他一个不具有一个名为 speak 成员函数的类(比如这里 的 Phone 类只有 play 函数)就会在实例化的那行出错。 • 注意:这里的 m_inner m_inner.speak() 只是一个例子,其实不一定是成员函数,完全可以是 std::sort(m_inner.begin(), m_inner.end()) 之类的任意表达式,只要语义上通过,就可以实例化。 • (把 sort 封装成虚函数,留作回家作业) Zeno 中对 OpenVDB 的类型擦除 • 结合类型擦除技术,自动虚克隆技术。 • VDBGrid 作为所有网格类的基类提供各个 操作做为虚函数, 0 码力 | 54 页 | 3.94 MB | 1 年前3
基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺X R u s t 使 用 TDengine Rust • OOXML - Excel 解析库 • xlsx2csv - Excel 转 CSV 工具 • Unqlite - 单文件非关系型数据库 • Wisecondor - 生物信息 CNV 分析 • mdsn - A Multi-address DSN(Data Source Name) parser. TDengine 应用开发组 运维监控等场景设计并优化,具有极强的弹性伸缩能力。同时它还带有内建的缓存、流式计算、数据订阅等 系统功能,能大幅减少系统设计的复杂度,降低研发和运营成本,是一个极简的时序数据处理平台。 采用关系型数据库模型 需要建库、建表, 为提升写入和查询效率,要求一个数据采集点一张表 为实现多表聚合,引入超级表概念 子表通过超级表创建,带有标签,通过标签实现多表 高效聚合 高效写入 GitHub 为截止 2023 年 5 月数据 TDengine 的 核 心 代 码 全 部 开 源 www.github.com/taosdata/TDengine 全球 50 多个国家安装实例超 270k | GitHub 全球趋势排行榜多次排名第一 TDengine - 数据模型 1. 设备 ID 及关联属性( Tags ) 2. 时间戳 3. 结构化采集量 STable 超级表0 码力 | 29 页 | 2.26 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台个月功能改造 90% 功能实现开源 技术社区雏形搭建 2022 年 3 月 生态伙伴工具 + Zadig Zadig 企业交付案例场景深化 开 发 者 场 景 挖 掘 3-5 个领域敏感型场景 建立产品发展委员会 贡献者流程优化 2022 年 9 月 场 景 深 化 能 力 增 强 Helm/K8s YAML/ 托管场景接入流程优化 UX/UI 升级,工程师一线体验优化 推出效能看板,实时客观度量工程数据指标 靠系统和技术,能力长在平台上 • 高人效 / 高质量 / 高效率 / 低成本 • 人在系统之上 / 高效交互 • 复杂性下沉到单一平台 整体人效提升 1-5 倍 解除组织 / 流程 / 系统 孤岛,打造成长型组织 企业收益分析 现存方案 典型代表 方案特点分析 Zadig 方案优势 传统 Jenkins 方案 GitLab + Jenkins + 脚本化 运行效率低,管理维护成本高 方案局限性大,安全性风险高 随着中国车企全球增长,海外业务拓展带来全球研发、交付、推广和运营挑战,在这出海挑战中,早期路特斯的软件交付流程 是基于 Jenkins 流水线设计的, Jenkins 的部署与数据中心一一对应。由于路特斯使用的是混合云,且数据中心遍布海外,导 致 Jenkins 数量庞大,随着业务扩张,早期架构难以适应快速变化,大量重复的事务性工作使得运维的人力捉襟见肘。 Zadig 的引入助力解决了这些挑战,推动了研发交付的数字化转型。0 码力 | 59 页 | 81.43 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人授、中国计算机学会前理事长,中国计算机系统结构 的学科带头人,我国高性能计算和存储系统等方面的 泰斗和先行者。 2021 年 3 月 25 日,海致科技与清华大学计算机科学与技术系共同建设高性能图计算院士专家工作站 。 高性能图计算是高性能计算、图计算两项技术融合产生的新的技术方向,满足人们对更大规模、更复 杂数据的实时处理和存储需求,是计算机领域竞争新战略制高点。 产学结合、协同创新,打造全球领先的国产自研图数据库 通过图嵌入将客户关系表示为低维向量,可以结合其 他客户行为特征进行机器学习训练 图卷积神经网络 • 对图结构数据进行卷积计算 • 通过已有的企业数据,通过 GCN 进行半监督学习和分 类,预测企业的违约概率 传统的关系型数据库的存储方式丢失了事物之间的关系信息 Relational Table Real World Multi-Context is Preserved with Graph Analytics Source: ,可扩展的分析引擎支持更复 杂的数据挖掘和机器学习场景 MPP Massively Parallel Processing 架构,大规模集群 分布式存储及并行计 算, Shared Nothing 模式支 持存储计算分离 高性能 基于 Rust 开发的分布式存储引 擎及图计算引擎,精细的内存 管理设计,内置索引系统,支 持毫秒级的并发查询响应速度 易用 AQL(Atlas Graph Query0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector的功能是长度可变的数组,他里面的数据 存储在堆上。 • vector 是一个模板类,第一个模板参数是数组里 元素的类型。 • 例如,声明一个元素是 int 类型的动态数组 a : • vectora; vector 容器:构造函数和 size • vector 可以在构造时指定初始长度。 • explicit vector(size_t n); • 例如,要创建一个长度为 4 的 int 型数组 : vector(initializer_list list); • explicit vector(size_t n); vector 容器 • 添加一个运算符重载用于打印 vector 类 型。 vector 容器:构造函数 • vector 的这个显式构造函数,默认会把所有元 素都初始化为 0 (不必手动去 memset )。 • 如果是其他自定义类,则会调用元素的默认构造 函数(例如:数字类型会初始化为 const noexcept; vector 容器: data() 获取首地址指针 • data() 会返回指向数组中首个元素的指针, 也就是等价于 &a[0] 。由于 vector 是连续 存储的数组,因此只要得到了首地址,下一 个元素的地址只需指针 +1 即可。 • 因为指针的 p[i] 相当于 *(p + i) ,因此可以 把 data() 返回的首地址指针当一个数组来 访问。 0 码力 | 90 页 | 4.93 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针如果你没看出来(哪怕是其中一个),那就要好好上小彭老师的课哦! 字节( byte ) 和位( bit )有什么区别 • 众所周知,计算机是二进制的,存储的实际上是一个个 0 和 1 。 • 每个存储 0 或 1 的空间称为一个位( bit ),一位可以存储 0 或 1 两个可能的值。 • 现在的计算机都会把 8 个位打包成一个字节( byte ),也就是说: 1 字节 = 8 位。 • 一字节可以表示 = 1024 KB • 1 GB = 1024 MB • 1 TB = 1024 GB • 也有人说 1 KiB 才是 1024 B 的,但是很少有人采用这种写法…… • 在买硬盘和 u 盘等存储设备的时候,往往会出现容量减少的情况,这是因为生产厂家按照 的是 1000 倍的换算的,而我们的系统中一般都是按照 1024 倍去计算的。 字还被用于表示内存地址 • 字的长度除了决定一次处理 大小(也就是字的大 小)决定了他能读写的内存大小,例如: • 由于 16 位计算机的寄存器只能存储 16 位,他只能访问 65536 字节( 64 KB )的内存 。 • 由于 32 位计算机的寄存器只能存储 32 位,他只能访问 4 GB 的内存。 • 由于 64 位计算机的寄存器能存储 64 位,他理论上能访问 16777216 TB 的内存! • 因此,如果你的电脑内存超过了 40 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串计算机如何表达字符 • 众所周知,计算机只能处理二进制 整数,字符要怎么办呢? • 于是就有了 ASCII 码表,他规定, 每个英文字符(包括大小写字母、 数字、特殊符号)都对应着一个整 数。在计算机里只要存储这个的整 数,就能代表这个字符了。 • 例如 32 代表空格, 48 代表 ‘ 0’ , 65 代表 ‘ A’ , 97 代表 ‘ a’…… • 32~126 这些整数就用于是表示这些 可显示字符 )还是整数( %d )还是 字符( %c ),必须和右边的参数一致,初学者容易搞错 。 • 而且即使搞错了也能正常编译通过(一些高级的编译器会 给出警告),但是运行结果不对,或者还有可能崩溃。 泛型的 iostream 应运而生 • 得益于 C++ 的重载技术, cout 不用你手动指定类型,他 会自动识别参数的类型,帮你调用相应的格式化函数。 c_str 和 data 的区别 • s.c_str() 正确(推荐) 字符串的连接( + 运算符) • 错误: • 正确: C++14 新特性:自定义字面量后缀 • 不少同学就觉得这样好麻烦,其他语言都是直接 “ hello” 就是字符串类 型, C++ 还得套一层壳 string(“hello”) 才能变成安全封装的类型,才能用他 的成员函数。 • 因此, C++14 引入了一项缓解“键盘压力”的新特性: • 写 “ hello”_s0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程• 而且需要开启 --extended-lambda 开关。 • 为了只对 .cu 文件开启这个开关,可以用 CMake 的生成器表达式,限制 flag 只对 CUDA 源码生效,这样可以混合其他 .cpp 文件也不会发生 gcc 报错的情况了。。 如何捕获外部变量? • 如果试图用 [&] 捕获变量是会出错的,毕 竟这时候捕获到的是堆栈( CPU 内存)上 的变量 arr 本身,而不是 刚刚的线程升级为板块,刚刚的 for 升级为线程,然后把 刚刚 local_sum 这个线程局部数组升级为板块局部数组。 那么如何才能实现板块局部数组呢? • 同一个板块中的每个线程,都共享着一块存储空间,他就 是共享内存。在 CUDA 的语法中,共享内存可以通过定 义一个修饰了 __shared__ 的变量来创建。因此我们可以 把刚刚的 local_sum 声明为 __shared__ 就可以让他从 章:共享内存进阶 GPU 的内存模型 GPU 的内存模型 全局内存:在 main() 中通过 cudaMalloc 分配的内存 共享内存:每个板块都有一个,通过 __shared__ 声明 寄存器:存储着每个线程的局部变量 板块中线程数量过多:寄存器打翻( register spill ) • GPU 线程的寄存器,实际上也是一块比较小而块的内存,称之为寄存器仓库( register file0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅TBB 7.被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU 专题: wrap 调度,共享内存, barrier 9.并行算法实战: reduce , scan ,矩阵乘法等 10.存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 提示:老师的电脑是 6 个物理核心, 12 个逻辑核心。 • 似乎这里 reduce 的加速比是逻辑核心数量,而 for 的加速比是物理核心的数量? • 剧透:因为本例中 reduce 是内存密集型, for 是计算密集型。 • 超线程对 reduce 这种只用了简单的加法,瓶颈在内存的算法起了作用。 • 而本例中 for 部分用了 std::sin ,需要做大量数学运算,因此瓶颈在 ALU 。 • 直接读写,避免了从主内存读写的超高延迟。 • 下次课会进一步深入探讨访存优化,详细剖析 这个案例,那么下周六 14 点敬请期待。 第 6 章:并发容器 std::vector 扩容时会移动元素 • std::vector 内部存储了一个指针,指向一段容量 capacity 大于等于其 size 的内存。 • 众所周知, push_back 会导致 size 加 1 ,但 当他看到容量 capacity 等于当前 size0 码力 | 116 页 | 15.85 MB | 1 年前3
共 30 条
- 1
- 2
- 3













