Zadig 面向开发者的云原生 DevOps 平台
研发不透明,规划凭感觉: • 发版时间靠运气 • 团队熬夜冲进度 研发透明化:不同项目清晰可见的效率、质量、进度 进度管理:根据团队客观数据,预测和确定项目规划 迭代进度一目了然 项目从无到有可核算 管理有数据科学依据 解放管理,更多时间花在 业务创新 平台运维 业务压力大,能力建设缓慢: • 大量工作花在工具链维护 • 项目间依赖复杂,环境管理难 • 交付版本依赖工单,发布风险高 实施负担较重难以推广 面向多云厂商友好,实施迁移成本极低,可扩展性 强,全球多地跨云跨域安全可靠自动化部署 企业基于 CI/CD 工具自建 DevOps 流程平台 围绕 Jenkins 、 Tekton 、 Argo 等 搭建流程串接胶水平台 建设成本高 500-2000 万之间 使用和学习门槛高;随业务发展扩展性差 局限性大,内部推广难度极高,做完后维 护成本高价值难被证明 护成本高价值难被证明 低采购成本、低实施成本, 内置模板库和最佳实践;高扩展性、技术先进性强 ,可灵活广泛接入现有工具链和业务场景 基于代码管理的 DevOps 方 案 Gitee 平台 GitLab 平台 局限性大、全流程安全性低 维护成本高 支持多个服务并行构建部署、产品级发布,可灵活 安全接入多个代码仓及周边工具链 Zadig 与现存 DevOps 方案对比 来自客户的评价:0 码力 | 59 页 | 81.43 MB | 1 年前3Zadig 产品使用手册
Jenkins 或 CI/CD 工具 搭建流程串接胶水平台 局限性大扩展性差 内部推广难度极高 做完后价值难被证明 通用性、可扩展性、技术先进性强,可以灵活 广泛接入各种技术和业务场景 基于代码管理的 DevOps 方案 Gitee 平台 GitLab 平台 局限性大、全流程安全性低 维护成本高 支持多个服务并行构建部署、产品级发布,可 灵活安全接入多个代码仓及周边工具链 开发 Zadig 软件研发核心工程实践:交付工程 CI/CD 开发者实践 软件研发核心工程实践:全流程质量工程实践 - 持续测试 CT/ 持续安全 CS 协 同 特 点 : • 流 程 可 定 义 • 工 具 可 扩 展 • 能 力 可 编 排 • 价 值 可 感 知 面 向 角 色 : • P O / T O • 开 发 • 测 试 • 运 维 服 务 编 排 : • 测 试 服 务 • I T 服0 码力 | 52 页 | 22.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
例如 32 代表空格, 48 代表 ‘ 0’ , 65 代表 ‘ A’ , 97 代表 ‘ a’…… • 32~126 这些整数就用于是表示这些 可显示字符 (printable character) 的。 计算机如何表达字符 • 除了可显示字符 (printable character) 外, ASCII 还规定了一 类特殊的控制字符 (control character) : std::string 其实是同等 地位的。 • 虽然也可以给 std::string 定义很多个不同的 + 重载,每个针对不同的数字类 型( int 、 float 、 double )排列组合,但是这样没有可扩展性,而且影响编 译速度。 • 所以 cpp 说,你必须手动把 42 先转换为字符串,然后再和已有的字符串相 加: • “you have ” + std::to_string(42) + “ yuan”0 码力 | 162 页 | 40.20 MB | 1 年前3Rust分布式账务系统 - 胡宇
正确性:无双花或少付 审计监管:交易日志不可篡改,交易历史可回溯 条件事务:根据一定的条件决定事务执行与否 高可用:在部分节点失效的情况下,依旧可以提供正确的 服务 超低延迟:实时交易,超低响应延迟 水平扩展性:利用分布式事务实现钱包集群的的水平扩 展,应对高达 100 万 TPS 的流量 可演化性:业务逻辑与底层 API 解耦,当业务发生改变 时,底层 API 不用改变 分布式账务系统 设计理念 -0 码力 | 27 页 | 12.60 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程
sleep : std::this_thread::sleep_for • 可以用 std::this_thread::sleep_for 替代 Unix 类操作系统专有的的 usleep 。他可 以让当前线程休眠一段时间,然后继续。 • 而且单位也可以自己指定,比如这里是 milliseconds 表示毫秒,也可以换成 microseconds 表示微秒, seconds 表示 过程。简单来说,进程是程序(应用程序,可执行文件)的一次执行。比如双击打开一个 桌面应用软件就是开启了一个进程。 • 线程是进程中的一个实体,是被系统独立分配和调度的基本单位。也有说,线程是 CPU 可 执行调度的最小单位。也就是说,进程本身并不能获取 CPU 时间,只有它的线程才可以。 • 从属关系:进程 > 线程。一个进程可以拥有多个线程。 • 每个线程共享同样的内存空间,开销比较小。 • std::promise 。 • 然后在线程返回的时候,用 set_value() 设置返回值。在主线程里,用 get_future() 获取其 std::future 对象,进一步 get() 可 以等待并获取线程返回值。 std::future 小贴士 • future 为了三五法则,删除了拷贝构造 / 赋 值函数。如果需要浅拷贝,实现共享同一个 future 对象,可以用 std::shared_future0 码力 | 79 页 | 14.11 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
有更长的周转时间来隐藏他内部计算的延迟。所以本案例中 AOS 比 SOA 好。 AOS 、 SOA 、 AOSOA 哪家强:结论 • 如果几个属性几乎总是同时一起用的,比如位置矢量 pos 的 xyz 分量,可 能都是同时读取同时修改的,这时用 AOS ,减轻预取压力。 • 如果几个属性有时只用到其中几个,不一定同时写入,比如 pos 和 vel , 通常的情况都是 pos+=vel ,也就是 pos 他附近的 64 字节都被读取到缓存了,但实际只用到了其中 4 字节,之 后又没用到剩下的 60 字节,导致浪费了 94% 的带宽。 • 虽说连续、顺序访问是最理想的,然而在使用哈希表等数据结构中,不 可避免的会通过哈希函数得到随机的地址来访问,且 Value 类型可能小 于 64 字节,浪费部分带宽。怎么办? 解决:按 64 字节分块地随机访问 • 解决方法就是,把数据按 64 字节大小分块。随 字节分块的效果拔群,但还是比顺 序访问慢一些,为什么?明明没有浪费带宽了? 缓存行预取技术:吃着一碗饭的同时,先喊妈妈烧下一碗饭 • 其实,当程序顺序访问 a[0], a[1] 时, CPU 会智能地预测到你接下来可 能会读取 a[2] ,于是会提前给缓存发送一个读取指令,让他读取 a[2] 、 a[3] 。缓存在后台默默读取数据的同时, CPU 自己在继续处理 a[0] 的数据。这样等 a[0], a[1]0 码力 | 147 页 | 18.88 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器
com/reference/iterator/istream_iterator 包含关系:前向迭代器>双向迭代器>随机访问迭代器 这意味着如果一个 STL 模板函数(比如 std::find )要求迭代器是前向迭代器即可,那么也可 以给他随机访问迭代器,因为前向迭代器是随机访问迭代器的子集。 例如, vector 和 list 都可以调用 std::find ( set 则直接提供了 find 作为成员函数,稍后 讨论) set 可以调用三次 ++ 运算,实 现和 + 3 同样的效果。 • vector 迭代器的 + n 复杂度 是 O(1) 。而 set 迭代器模 拟出来的 + n 复杂度为 O(n) 。虽然低效,但至少可 以用了。 std::next 等价于 + • 但是这样手写三个 ++ 太麻烦了 ,而且是就地操作,会改变迭代 器本身。 • 因此标准库提供了 std::next 函 数,他的内部实现相当于这样: set 的遍历 • 为了减少重复打代码的痛 苦, C++17 引入了个语 法糖:基于范围的 for 循 环 (range-based for loop) 。 • for ( 类型 变量名 : 可迭代对象 ) • 这种写法,无非就是刚才 那一大堆代码的简写: set 的遍历 • 基于范围的 for 循环只是 一个简写,他会遍历整个 区间 [begin, end) 。 • 有时写完整版会有更大的0 码力 | 83 页 | 10.23 MB | 1 年前3新一代分布式高性能图数据库的构建 - 沈游人
效利用硬件资源,高可用,高 可靠,故障自愈,低成本运维 HTAP Hybrid Transactional/Analytical Processing ,高性能图计算引 擎,预置 20 余种图计算算法 ,可扩展的分析引擎支持更复 杂的数据挖掘和机器学习场景 MPP Massively Parallel Processing 架构,大规模集群 分布式存储及并行计 算, Shared Nothing 模式支 图平台 Atlas Studio Atlas Client 基础 设施 Docker/K8S/VM X86/ARM - 基于 RUST 语言保证性能优势 - 分布式架构性能可线性扩展 - 针对大规模图优化的存算引擎 - 配合 Atlas 图平台,实现无代码图分析 - Query 性能分析模块,启发式提示优化 - 内置多种分析函数,面向分析师友好 -MVOCC 保证事务一致性 语言特性助力构建高性能图数据库 01 利用 Rust Stream 进行数据流式 处理 02 03 协程和严格的内存安全性,编译 时捕获数据竞争和并发问题 异步物理算子实现,异步 IO 数 据获取 01 可静态分发的 Trait 在不带来性 能损失的同时也提高代码组织性 02 03 强大的跨平台能力,在不同架构 下可以准确的控制代码行为 编译期间对生命周期检查确保内 存安全,无 GC 和运行时损耗0 码力 | 38 页 | 24.68 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
的值,并填入到数组 arr 中。 • 这里为什么用 sinf 而不是 sin ? • 因为 sin 是 double 类型的正弦函数,而我 们需要的 sinf 是 float 类型的正弦函数。可 不要偷懒少打一个 f 哦,否则影响性能。 • 完成同步之后,和 CPU 算出来的比较差值, 看看 GPU 算的是否准确无误,从右边的输出 可以看到基本是一致的。 测试一下时间 • 使用第六节课中的 这样一来最后 sum[0] 的值是 arr[1] 。而不是我们期望的 arr[0] + arr[1] ,即算出来的总和变少了! 解决:使用原子操作 • 所以,熟悉 CPU 上并行编程的同学们可 能就明白了,要用 atomic 对吧! • 原子操作的功能就是保证读取 / 加法 / 写回 三个操作,不会有另一个线程来打扰。 • CUDA 也提供了这种函数,即 atomicAdd 。效果和 那样做时间片轮换——板块一旦被调度到了一个 SM 上,就会一直执行,直到他执行完退出,这样的好处是不存在保存和切换上下文(寄 存器,共享内存等)的开销,毕竟 GPU 的数据量比较大,禁不起这样切换来切换去…… • 一个 SM 可同时运行多个板块,这时多个板块共用同一块共享内存(每块分到的就少了) 。 • 而板块内部的每个线程,则是被进一步调度到 SM 上的每个 SP 。 无原子的解决方案: sum 变成数组 • 刚刚0 码力 | 142 页 | 13.52 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅
个线程,但是只有 4 个处理器核心。 那么就会先执行 1,2,3,4 号线程,一段时间后自动切换 到 5,6,7,8 线程。当一个线程退出时候,系统就不会再 调度到他上去了,从而保证每个核心始终有事可做。 1 6 11 16 2 7 12 8 3 4 9 14 10 15 13 5 解决 2 :线程数量不变,但是用一个队列分发和认领任务 • 但是线程数量太多会造成调度的 grow_by(n) 则可以一次扩充 n 个元素。 他同样是返回一个迭代器( iterator ),之 后可以通过迭代器的 ++ 运算符依次访问 连续的 n 个元素, * 运算符访问当前指 向的元素。 可安全地被多线程并发访问 • 除了内存不连续、指针和迭代器不失效的 特点, tbb::concurrent_vector 还是一个多 线程安全的容器,能够被多个线程同时并 发地 grow_by 或 concurrent_vector 和 thread-local vector 。或是你需要保证筛选前后顺序不变。这时要把筛选分为三步 : 一、算出每个元素需要往 vector 推送数据的数量(本例中只有 0 和 1 两种可 能) 二、对刚刚算出的数据进行并行扫描( scan ),得出每个 i 要写入的索引。 三、再次对每个元素并行 for 循环,根据刚刚生成写入的索引,依次写入数据。 加速比: 4.50 倍(考虑到这里0 码力 | 116 页 | 15.85 MB | 1 年前3
共 24 条
- 1
- 2
- 3