 大规模高性能区块链架构设计模式与测试框架-李世敬发起请求 验证更新 l ⾃研Recovery机制,实现动态数据失效恢复 l 基于配置交易机制⽀持节点动态增删灵活扩展 l GPU硬件加速模型,⼤幅提升共识效率 ⽹络复杂度: 从O (n2) /O (n3) O (n) P R node1 node2 node3 node4 Propose Response l 流⽔线并发共识机制,共识效率显著提⾼ l ED25519聚合签名验签,效率快⼀倍 memory-table write-ahead log ... ... 异步写入 0802 0803 0804 leveldb leveldb leveldb 只读 读写 元数据 索引数据 区块数据库 索引数据库 区块链平台底层采用Filelog+IndexDB混合存储模型,以应对当前业务场景对高磁盘I/O频率和吞吐量的高要求。数据随区块 存储在区块链专用存储引擎Filelog, 应用研发 司法存证链 通用链 数字身份链 ··· 公共联盟链 溯源链 跨链服务 联盟链 Hyperchain 隐私保护 联盟治理 高效执行引擎 自适应共识 混合型存储 分片模型 大规模组网 异步审计 扩展层 • Hyperchain:首个国产自主可控的联盟链平 台,是目前行业内落地应用最多、节点分布 最广、承载业务规模最大的区块链平台。 • BitXMesh:首个支持链上链下协同的数据共0 码力 | 39 页 | 56.58 MB | 1 年前3 大规模高性能区块链架构设计模式与测试框架-李世敬发起请求 验证更新 l ⾃研Recovery机制,实现动态数据失效恢复 l 基于配置交易机制⽀持节点动态增删灵活扩展 l GPU硬件加速模型,⼤幅提升共识效率 ⽹络复杂度: 从O (n2) /O (n3) O (n) P R node1 node2 node3 node4 Propose Response l 流⽔线并发共识机制,共识效率显著提⾼ l ED25519聚合签名验签,效率快⼀倍 memory-table write-ahead log ... ... 异步写入 0802 0803 0804 leveldb leveldb leveldb 只读 读写 元数据 索引数据 区块数据库 索引数据库 区块链平台底层采用Filelog+IndexDB混合存储模型,以应对当前业务场景对高磁盘I/O频率和吞吐量的高要求。数据随区块 存储在区块链专用存储引擎Filelog, 应用研发 司法存证链 通用链 数字身份链 ··· 公共联盟链 溯源链 跨链服务 联盟链 Hyperchain 隐私保护 联盟治理 高效执行引擎 自适应共识 混合型存储 分片模型 大规模组网 异步审计 扩展层 • Hyperchain:首个国产自主可控的联盟链平 台,是目前行业内落地应用最多、节点分布 最广、承载业务规模最大的区块链平台。 • BitXMesh:首个支持链上链下协同的数据共0 码力 | 39 页 | 56.58 MB | 1 年前3
 NSQ - 陈冶Dive into NSQ 舜飞 - 陈冶 消息队列服务 • ⾯向跨进程/跨服务器通讯的组件 • 异步通信,将可并⾏化处理的同步操作解耦 使⽤案例 ⼴告点击数统计 Web Service MySQL User Click User Click User Click Stateless Stat Service Stateless 使⽤案例 ⼴告点击数统计 Web chan Select } 数据⼴播 Topic Channel Channel Producer Consumer Consumer Consumer Channel Topic 异步把消息⼴播给 Channel 数据⼴播 Topic ⾃⾝拥有 buffer 的能⼒ Memory Channel Disk Queue Topic chan *Msg Channel Handler incomingMessages maybeUpdateRDY() MaxInFlight 总结 • 将复杂度集中在服务端,客户端易⽤ • 数据⽆冗余 • 数据⼴播空间复杂度是 O(N) • 内存队列与磁盘队列混⽤,时序性⽆法预估 • Topic -> Channel 消耗太⾼ • ⼤量Fin包导致系统调⽤/⼩数据包过多 • Producer 没有官⽅分布式解决⽅案0 码力 | 37 页 | 2.49 MB | 1 年前3 NSQ - 陈冶Dive into NSQ 舜飞 - 陈冶 消息队列服务 • ⾯向跨进程/跨服务器通讯的组件 • 异步通信,将可并⾏化处理的同步操作解耦 使⽤案例 ⼴告点击数统计 Web Service MySQL User Click User Click User Click Stateless Stat Service Stateless 使⽤案例 ⼴告点击数统计 Web chan Select } 数据⼴播 Topic Channel Channel Producer Consumer Consumer Consumer Channel Topic 异步把消息⼴播给 Channel 数据⼴播 Topic ⾃⾝拥有 buffer 的能⼒ Memory Channel Disk Queue Topic chan *Msg Channel Handler incomingMessages maybeUpdateRDY() MaxInFlight 总结 • 将复杂度集中在服务端,客户端易⽤ • 数据⽆冗余 • 数据⼴播空间复杂度是 O(N) • 内存队列与磁盘队列混⽤,时序性⽆法预估 • Topic -> Channel 消耗太⾼ • ⼤量Fin包导致系统调⽤/⼩数据包过多 • Producer 没有官⽅分布式解决⽅案0 码力 | 37 页 | 2.49 MB | 1 年前3
 Go 入门指南(The way to Go)器的构建过程或得到一个特殊的目标结 果。 可用的编译器标记如下: 1. flags: 2. -I 针对包的目录搜索 3. -d 打印声明信息 4. -e 不限制错误打印的个数 5. -f 打印栈结构 6. -h 发生错误时进入恐慌(panic)状态 7. -o 指定输出文件名 // 详见第3.4节 8. -S 打印产生的汇编代码 9. -V 打印编译器版本 // 原生的 Go http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。在 Python 中被广泛使用的 tornado 异步服务器和框架在 web 环境下要比 web.py 快很多, Go 大概只比它快 1.2 至 1.5 倍(详见引用 26)。 Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python libc 中的函数 C.random() 等也可以 被调用。 当你想要使用某个类型作为 C 中函数的参数时,必须将其转换为 C 中的类型,反之亦然,例如: 1. var i int 2. C.uint(i) // 从 Go 中的 int 转换为 C 中的无符号 int 3. int(C.random()) // 从 C 中 random() 函数返回的 long 转换为0 码力 | 466 页 | 4.44 MB | 1 年前3 Go 入门指南(The way to Go)器的构建过程或得到一个特殊的目标结 果。 可用的编译器标记如下: 1. flags: 2. -I 针对包的目录搜索 3. -d 打印声明信息 4. -e 不限制错误打印的个数 5. -f 打印栈结构 6. -h 发生错误时进入恐慌(panic)状态 7. -o 指定输出文件名 // 详见第3.4节 8. -S 打印产生的汇编代码 9. -V 打印编译器版本 // 原生的 Go http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。在 Python 中被广泛使用的 tornado 异步服务器和框架在 web 环境下要比 web.py 快很多, Go 大概只比它快 1.2 至 1.5 倍(详见引用 26)。 Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python libc 中的函数 C.random() 等也可以 被调用。 当你想要使用某个类型作为 C 中函数的参数时,必须将其转换为 C 中的类型,反之亦然,例如: 1. var i int 2. C.uint(i) // 从 Go 中的 int 转换为 C 中的无符号 int 3. int(C.random()) // 从 C 中 random() 函数返回的 long 转换为0 码力 | 466 页 | 4.44 MB | 1 年前3
 03. Golang 在隐私计算平台建设中的实践 - 刘敬同步写法存在问题 算法效率低下 计算逻辑和⽹网络io是串串⾏行行的,不不相关 的计算逻辑和⽹网络io本可以并⾏行行,以 提⾼高效率 算法逻辑和⽹网络逻辑耦合 有⼤大量量的数据序列列化以及异步转同步 的⽹网络流程代码,算法本身不不应该关 注⽹网络相关逻辑 嵌套调⽤用其他算法复杂 在需要调⽤用其他算法时(OT,SS 等),都需要⼿手动编写⼀一遍类似的流 程,嵌套调⽤用逻辑冗余度⽐比较⾼高 同步写法存在问题 算法效率低下 计算逻辑和⽹网络io是串串⾏行行的,不不相关 的计算逻辑和⽹网络io本可以并⾏行行,以 提⾼高效率 算法逻辑和⽹网络逻辑耦合 有⼤大量量的数据序列列化以及异步转同步 的⽹网络流程代码,算法本身不不应该关 注⽹网络相关逻辑 嵌套调⽤用其他算法复杂 在需要调⽤用其他算法时(OT,SS 等),都需要⼿手动编写⼀一遍类似的流 程,嵌套调⽤用逻辑冗余度⽐比较⾼高 任务状态 校验多⽅方输⼊入 格式是否匹配 参与⽅方掉线 检测 算 法 管 理理 异 常 处 理理 算 法 实 例例 ADD CMP PIR PSI 优点 01.算法流程基于数据驱动异步执⾏行行 异步执⾏行行并⾏行行化,提⾼高算法性能 02.算法版本协商 实现新旧节点版本兼容,全⽹网节点可错 开时间依次升级 03.统⼀一异常处理理 参与⽅方掉线和流程异常时任务⾃自动终⽌止 040 码力 | 37 页 | 6.20 MB | 1 年前3 03. Golang 在隐私计算平台建设中的实践 - 刘敬同步写法存在问题 算法效率低下 计算逻辑和⽹网络io是串串⾏行行的,不不相关 的计算逻辑和⽹网络io本可以并⾏行行,以 提⾼高效率 算法逻辑和⽹网络逻辑耦合 有⼤大量量的数据序列列化以及异步转同步 的⽹网络流程代码,算法本身不不应该关 注⽹网络相关逻辑 嵌套调⽤用其他算法复杂 在需要调⽤用其他算法时(OT,SS 等),都需要⼿手动编写⼀一遍类似的流 程,嵌套调⽤用逻辑冗余度⽐比较⾼高 同步写法存在问题 算法效率低下 计算逻辑和⽹网络io是串串⾏行行的,不不相关 的计算逻辑和⽹网络io本可以并⾏行行,以 提⾼高效率 算法逻辑和⽹网络逻辑耦合 有⼤大量量的数据序列列化以及异步转同步 的⽹网络流程代码,算法本身不不应该关 注⽹网络相关逻辑 嵌套调⽤用其他算法复杂 在需要调⽤用其他算法时(OT,SS 等),都需要⼿手动编写⼀一遍类似的流 程,嵌套调⽤用逻辑冗余度⽐比较⾼高 任务状态 校验多⽅方输⼊入 格式是否匹配 参与⽅方掉线 检测 算 法 管 理理 异 常 处 理理 算 法 实 例例 ADD CMP PIR PSI 优点 01.算法流程基于数据驱动异步执⾏行行 异步执⾏行行并⾏行行化,提⾼高算法性能 02.算法版本协商 实现新旧节点版本兼容,全⽹网节点可错 开时间依次升级 03.统⼀一异常处理理 参与⽅方掉线和流程异常时任务⾃自动终⽌止 040 码力 | 37 页 | 6.20 MB | 1 年前3
 Golang大规模云原生应用管理实践Result{RequeueAfter: waitTime}, nil } 1 获取应用期望状态 控制器初始化 2 解析期望的WTS状态 3 调谐动作-更新与新增 4 调谐动作-删除 5 调谐动作-状态同步 6 异步轮询 func (r *components) Render(ctx context.Context, ac *v1alpha2.ApplicationConfiguration) { workloads len(ac.Spec.Components)) for i, acc := range ac.Spec.Components { unsatisfied, err := r.handleDependency(ctx, workloads[i], acc, dag, ac) … res = append(res, *workloads[i]) } return res, ds, nil } SetWorkloadInstanceName(traitDefs, w, c); err != nil { return nil, err } … for i := range acc.Traits { traitDef := traitDefs[i] trait := traits[i] workloadRefPath := traitDef.Spec.WorkloadRefPath if len(workloadRefPath)0 码力 | 23 页 | 7.70 MB | 1 年前3 Golang大规模云原生应用管理实践Result{RequeueAfter: waitTime}, nil } 1 获取应用期望状态 控制器初始化 2 解析期望的WTS状态 3 调谐动作-更新与新增 4 调谐动作-删除 5 调谐动作-状态同步 6 异步轮询 func (r *components) Render(ctx context.Context, ac *v1alpha2.ApplicationConfiguration) { workloads len(ac.Spec.Components)) for i, acc := range ac.Spec.Components { unsatisfied, err := r.handleDependency(ctx, workloads[i], acc, dag, ac) … res = append(res, *workloads[i]) } return res, ds, nil } SetWorkloadInstanceName(traitDefs, w, c); err != nil { return nil, err } … for i := range acc.Traits { traitDef := traitDefs[i] trait := traits[i] workloadRefPath := traitDef.Spec.WorkloadRefPath if len(workloadRefPath)0 码力 | 23 页 | 7.70 MB | 1 年前3
 Go性能优化概览-曹春晖缩⼩临界区:只锁必须锁的对象,临界区内尽量不放慢操作,如 syscall • 降低锁粒度:全局锁 -> 对象锁,全局锁 -> 连接锁,连接锁 -> 请求锁,⽂ 件锁 -> 多个⽂件各种锁 • 同步改异步:如同步⽇志 -> 异步⽇志,若队列满则丢弃,不阻塞业务逻辑 CPU 使⽤太⾼了-编解码使⽤ CPU 过⾼ 通过更换 json 库,就可以提⾼系统的吞吐量 本质上就是请求的 CPU 使⽤被优化了 我们可以使⽤固定 Global lock -> connection level lock • Connection level lock -> request level lock • 同步改异步 • ⽇志场景:同步⽇志 -> 异步⽇志 • Metrics 上报场景:select -> select+default • 个别场景使⽤双 buffer 完全消灭阻塞 Continuous Profiling0 码力 | 40 页 | 8.69 MB | 1 年前3 Go性能优化概览-曹春晖缩⼩临界区:只锁必须锁的对象,临界区内尽量不放慢操作,如 syscall • 降低锁粒度:全局锁 -> 对象锁,全局锁 -> 连接锁,连接锁 -> 请求锁,⽂ 件锁 -> 多个⽂件各种锁 • 同步改异步:如同步⽇志 -> 异步⽇志,若队列满则丢弃,不阻塞业务逻辑 CPU 使⽤太⾼了-编解码使⽤ CPU 过⾼ 通过更换 json 库,就可以提⾼系统的吞吐量 本质上就是请求的 CPU 使⽤被优化了 我们可以使⽤固定 Global lock -> connection level lock • Connection level lock -> request level lock • 同步改异步 • ⽇志场景:同步⽇志 -> 异步⽇志 • Metrics 上报场景:select -> select+default • 个别场景使⽤双 buffer 完全消灭阻塞 Continuous Profiling0 码力 | 40 页 | 8.69 MB | 1 年前3
 IPC性能极致优化方案-RPAL落地实践github 地址:https://github.com/cloudwego/shmipc-go 方案诞生的背景 方案诞生的背景 IPC 的性能瓶颈有哪些: 1. 系统特权级切换; 2. 异步线程唤醒/休眠(事件通知); 3. 数据拷贝(序列化/反序列化); 方案诞生的背景 能不能把库函数调用的高性能优势做到 IPC 里面,降低进程间的事件通知和数据拷贝开销? 以go-go微服务 RPAL(Run Process As Library) 方案,基于跨进程虚拟地址 共享,复用 epoll 网络模型,实现了纯用户态的事件轮询和无拷贝的指针读写接口。 从性能瓶颈的两点分析: 1. 异步线程唤醒: 关键在于如何最低限度降低线程唤醒的开销,非必要不通知事件。 2. 数据序列化/反序列化 需要做到跨进程的虚拟地址空间共享,通过传递指针来传递一切数据。 全进程地址空间共享与保护 wait 3. readv syscall 4. 仅在必要时调用 futex_wake (没有自旋线程 && 有 idle P) 高效的Go Event Poller 思考: 1. 为什么要异步唤醒 M 处理? 2. 是否有同步的 Go 函数调用方案? RPC 框架 Kitex 集成 第五部分 RPC 框架 Kitex 集成 指针读写抽象接口: 对象指针ACK RPC 框架 Kitex0 码力 | 39 页 | 2.98 MB | 1 年前3 IPC性能极致优化方案-RPAL落地实践github 地址:https://github.com/cloudwego/shmipc-go 方案诞生的背景 方案诞生的背景 IPC 的性能瓶颈有哪些: 1. 系统特权级切换; 2. 异步线程唤醒/休眠(事件通知); 3. 数据拷贝(序列化/反序列化); 方案诞生的背景 能不能把库函数调用的高性能优势做到 IPC 里面,降低进程间的事件通知和数据拷贝开销? 以go-go微服务 RPAL(Run Process As Library) 方案,基于跨进程虚拟地址 共享,复用 epoll 网络模型,实现了纯用户态的事件轮询和无拷贝的指针读写接口。 从性能瓶颈的两点分析: 1. 异步线程唤醒: 关键在于如何最低限度降低线程唤醒的开销,非必要不通知事件。 2. 数据序列化/反序列化 需要做到跨进程的虚拟地址空间共享,通过传递指针来传递一切数据。 全进程地址空间共享与保护 wait 3. readv syscall 4. 仅在必要时调用 futex_wake (没有自旋线程 && 有 idle P) 高效的Go Event Poller 思考: 1. 为什么要异步唤醒 M 处理? 2. 是否有同步的 Go 函数调用方案? RPC 框架 Kitex 集成 第五部分 RPC 框架 Kitex 集成 指针读写抽象接口: 对象指针ACK RPC 框架 Kitex0 码力 | 39 页 | 2.98 MB | 1 年前3
 2.2.6 字节跳动在 Go 网络库上的实践_ := epoll_wait(epoll_fd, events, msec) for i:=0; i 2.2.6 字节跳动在 Go 网络库上的实践_ := epoll_wait(epoll_fd, events, msec) for i:=0; i- i++{ } } }() read(i=0) go handle() add ... go handle() add read(i=n-1) go handle() add poller cost = read(0) + handle handle 优化调度效率 – 吞吐分析 gopool go handle() add ... go handle() add read(i=n-1) go handle() add poller CPU 0 CPU 1 read(i=0) 优化调度效率 – 优化系统调用 将 Syscall 改为 RawSyscall Syscall 执行逻辑相当于 1. enter_runtime _ := epoll_wait(epoll_fd, events, msec) for i:=0; i - i++{ } } }() read(i=0) go handle() add ... go handle() add read(i=n-1) go handle() add go func(epoll_wait) 正在执行 0 码力 | 42 页 | 3.19 MB | 1 年前3
 Go 入门指南(The way to Go)是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的 目标结果。 可用的编译器标记如下: flags: -I 针对包的目录搜索 -d 打印声明信息 -e 不限制错误打印的个数 -f 打印栈结构 -h 发生错误时进入恐慌(panic)状态 -o 指定输出文件名 // 详见第3.4节 -S 打印产生的汇编代码 -V 打印编译器版本 // 详见第2.3节 -u 禁止使用 unsafe 原生的 Go http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。在 Python 中被广泛使用的 tornado 异步服务器和框架在 web 环境下要比 web.py 快很 多,Go 大概只比它快 1.2 至 1.5 倍(详见引用 26)。 Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python 等等,还有 libc 中的函数 C.random() 等也可以被调用。 当你想要使用某个类型作为 C 中函数的参数时,必须将其转换为 C 中的类型,反之亦然,例如: var i int C.uint(i) // 从 Go 中的 int 转换为 C 中的无符号 int int(C.random()) // 从 C 中 random() 函数返回的 long 转换为 Go 中的0 码力 | 380 页 | 2.97 MB | 1 年前3 Go 入门指南(The way to Go)是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的 目标结果。 可用的编译器标记如下: flags: -I 针对包的目录搜索 -d 打印声明信息 -e 不限制错误打印的个数 -f 打印栈结构 -h 发生错误时进入恐慌(panic)状态 -o 指定输出文件名 // 详见第3.4节 -S 打印产生的汇编代码 -V 打印编译器版本 // 详见第2.3节 -u 禁止使用 unsafe 原生的 Go http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。在 Python 中被广泛使用的 tornado 异步服务器和框架在 web 环境下要比 web.py 快很 多,Go 大概只比它快 1.2 至 1.5 倍(详见引用 26)。 Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python 等等,还有 libc 中的函数 C.random() 等也可以被调用。 当你想要使用某个类型作为 C 中函数的参数时,必须将其转换为 C 中的类型,反之亦然,例如: var i int C.uint(i) // 从 Go 中的 int 转换为 C 中的无符号 int int(C.random()) // 从 C 中 random() 函数返回的 long 转换为 Go 中的0 码力 | 380 页 | 2.97 MB | 1 年前3
 Golang在接入层长连接服务中的实践-黄欣司机乘客撮合 • 实时计价 – 高频度的数据交互 • 坐标数据 • 计价数据 – App和服务端双向可达 • 上行(抢单) • 下行(派单) 背景—why golang? • 开发效率 • 异步模型,同步原语 – C:代码上各种回调、思维中保持冷静 – Go:代码上同步,思维自然 • 性能够用,工具齐全 – 100w?10w?~~ – Memprof、cpuprof~ • 社区活跃,发展迅猛 架构—异地双活 • 要求 – 正常情况下: • 任何一个机房可推送到所有机房app – 异常情况下: • 本机房内推送可达 • 架构图如下 (核心解决路由共享问题) 架构—总结 • 异步通信接口 • 协议包业务态隔离 • 简单无状态 • 有状态的服务(涉及到存储)做到可降级 • 核心业务有自愈逻辑 简单实用,避免过度设计 目录 • 背景 • 架构 心得—coding • 代码分层0 码力 | 31 页 | 1.67 MB | 1 年前3 Golang在接入层长连接服务中的实践-黄欣司机乘客撮合 • 实时计价 – 高频度的数据交互 • 坐标数据 • 计价数据 – App和服务端双向可达 • 上行(抢单) • 下行(派单) 背景—why golang? • 开发效率 • 异步模型,同步原语 – C:代码上各种回调、思维中保持冷静 – Go:代码上同步,思维自然 • 性能够用,工具齐全 – 100w?10w?~~ – Memprof、cpuprof~ • 社区活跃,发展迅猛 架构—异地双活 • 要求 – 正常情况下: • 任何一个机房可推送到所有机房app – 异常情况下: • 本机房内推送可达 • 架构图如下 (核心解决路由共享问题) 架构—总结 • 异步通信接口 • 协议包业务态隔离 • 简单无状态 • 有状态的服务(涉及到存储)做到可降级 • 核心业务有自愈逻辑 简单实用,避免过度设计 目录 • 背景 • 架构 心得—coding • 代码分层0 码力 | 31 页 | 1.67 MB | 1 年前3
共 96 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10














 
 