03. Golang 在隐私计算平台建设中的实践 - 刘敬隐私计算算法框架-controller 通过反射扫描出元函数的⼊入参类型 框架在初始化时, 遍历所有算法manager的 所有实例例并记录实例例详情 趣链科技版权所有©2016 – 2021 23 隐私计算算法框架-基于数据驱动的异步执⾏行行流程 趣链科技版权所有©2016 – 2021 24 隐私计算算法框架-元函数异步执⾏行行实现 执⾏行行元函数后,框架缓存所有返回值 缓存中间数据后触发扫描可以执⾏行行的元函数 中间数据的缓存map,使⽤用 中间数据的reflect.Type作为key 趣链科技版权所有©2016 – 2021 25 隐私计算算法框架-元函数异步执⾏行行实现 扫描依据:缓存中存在元函数的所有⼊入参 删除扫描出的元函数⼊入参对应的缓存 元函数⼊入参类型重复,框架⽆无法区分注⼊入参数 元函数⼊入参类型重复,通过new type模式区分 趣链科技版权所有©2016 – 2021 26 框架⾃自动注⼊入⼦子协议发起⽅方的接⼝口 框架在初始化扫描到时,会将该元函数进⾏行行标记 框架⾃自动注⼊入⼦子协议参与⽅方的接⼝口 框架在初始化扫描到时,会将该元函数进⾏行行标记 04 ⼀一些优化技巧 趣链科技版权所有©2016 – 2021 34 多⽣生产者单消费者协程池抽象 多⽣生产者协程并⾏行行处理理数据 单消费者协程接受处理理后的数据 趣链科技版权所有©2016 – 2021 350 码力 | 37 页 | 6.20 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a来越多的困惑的积攒,我觉得我对Go的领悟非常有限。 我感觉我仍然是一个 Go新手程序员。 我放弃了写那本书。 放弃?《Go语言101》现在不是已经完成了吗? 那本曾经计划要写的书不是《Go语言101》。 放弃那本书的写作计划后,我通 过阅读很多官方Go文档和网络中的各种Go文章、关注Go官方项目的问题跟踪 列表和一些Go论坛、查看一些代码等途径, 逐渐地,我几乎消除了我所有关于 Go编程细节中的困惑。 Go官方工具链的使用将在下一篇文章 中介绍。 Go官方工具链1.0发布于2012年三月。 Go语言规范的最新版本和Go官 方工具链的最新版本总是保持一致。 每年Go官方工具链发行两个主版本。 自从Go语言正式发布后,Go的语法变化很小。 但是标准编译器gc却在不断地 改进。 使用早期的gc编译的程序在运行的时候在每次垃圾回收的结尾常常会有 明显的停顿。 但是自从Go 1.8,使用gc编译的程序在运行时刻已经基本消除了 com/myproject的模块 (即当前项目)的根目录。 此go.mod文件将被用来记录当前项目需要的依 赖模块和版本信息。 我们可以手动编辑或者使用go子命令来修改此文件。 go mod tidy命令用来通过扫描当前项目中的所有代码来添加未被记录的依 赖至go.mod文件或从go.mod文件中删除不再被使用的依赖。 go get命令用拉添加、升级、降级或者删除单个依赖。此命令不如go mod tidy命令常用。0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a越来越多的困惑的积攒,我觉得我对Go的领悟非常有限。 我感觉我仍然是一 个Go新手程序员。 我放弃了写那本书。 放弃?《Go语言101》现在不是已经完成了 吗? 那本曾经计划要写的书不是《Go语言101》。 放弃那本书的写作计划后,我通 过阅读很多官方Go文档和网络中的各种Go文章、关注Go官方项目的问题跟踪 列表和一些Go论坛、查看一些代码等途径, 逐渐地,我几乎消除了我所有关 于Go编程细节中的困惑。 Go官方工具链的使用将在下一篇文章 中介绍。 Go官方工具链1.0发布于2012年三月。 Go语言规范的最新版本和Go 官方工具链的最新版本总是保持一致。 每年Go官方工具链发行两个主版本。 自从Go语言正式发布后,Go的语法变化很小。 但是标准编译器gc却在不断地 改进。 使用早期的gc编译的程序在运行的时候在每次垃圾回收的结尾常常会 有明显的停顿。 但是自从Go 1.8,使用gc编译的程序在运行时刻已经基本消除 com/myproject的模块 (即当前项目)的根目录。 此go.mod文件将被用来记录当前项目需要的 依赖模块和版本信息。 我们可以手动编辑或者使用go子命令来修改此文 件。 go mod tidy命令用来通过扫描当前项目中的所有代码来添加未被记录的 依赖至go.mod文件或从go.mod文件中删除不再被使用的依赖。 go get命令用拉添加、升级、降级或者删除单个依赖。此命令不如go mod tidy命令常用。0 码力 | 821 页 | 956.82 KB | 1 年前3
2.1.1 Golang主动式内存缓存的优化探索之路Q1:已开始的公益直播,且公开显示 直播1 Q2:2021-06-27 10:00:00之后 Q1 无数据 数据模型管理 04. 基于golang的struct tag实现正排、倒排结构的自动化管理 全数据扫描? 索引 主键 倒排 业务快速增长 存储如何无限扩展? 存储扩展 05. 业务数据已经超过1000万,海量数据下,如何实现冷热数据的交换 冷 热 新 系 统 历 史 数 据 冷热数据交换,通过栈式缓存结构,实现多级缓存策略 语言的局限性 07. 基于golang语言,内存对象超过百万量级后出现的GC耗时问题 • go原生map存储200万数据对象 • 数据对象中包含多个string,slice字段 • string,slice的内部结构包含指针 • GC并发标记、扫描的平均耗时10s • GC的辅助标记会抢占业务协程 每次QPS掉底都与GC相关 GC较高的耗时对QPS的影响巨大 GC较高的耗时对QPS的影响巨大 服务性能上不去,QPS剧烈抖动 代码实施 语言局限性,如何突破? 解决GC扫描耗时的问题 08. 基于cgo,定制化的内存管理,减少运行时对golang结构的gc扫描 Copy Copy 内存数据与golang结构间的桥梁 09. 自研MemoryTile(定制化的golang序列化反序列化),解决百万数据量级序列化反序列化耗时问题 MemoryTile的通用性0 码力 | 48 页 | 6.06 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a随着越来越多的 困惑的积攒,我觉得我对Go的领悟非常有限。 我感觉我仍然是一个Go新手程序员。 我放弃了写那本书。 放弃?《Go语言101》现在不是已经完成了吗? 那本曾经计划要写的书不是《Go语言101》。 放弃那本书的写作计划后,我通过阅 读很多官方Go文档和网络中的各种Go文章、关注Go官方项目的问题跟踪列表和一些 Go论坛、查看一些代码等途径, 逐渐地,我几乎消除了我所有关于Go编程细节中的 Go官方工具链的使用将在下一篇文章中介 绍。 Go官方工具链1.0发布于2012年三月。 Go语言规范的最新版本和Go官方工具链 的最新版本总是保持一致。 每年Go官方工具链发行两个主版本。 自从Go语言正式发布后,Go的语法变化很小。 但是标准编译器gc却在不断地改 进。 使用早期的gc编译的程序在运行的时候在每次垃圾回收的结尾常常会有明显 的停顿。 但是自从Go 1.8,使用gc编译的程序在运行时刻已经基本消除了停顿现 com/myproject的模 块(即当前项目)的根目录。 此go.mod文件将被用来记录当前项目需要的依 赖模块和版本信息。 我们可以手动编辑或者使用go子命令来修改此文件。 go mod tidy命令用来通过扫描当前项目中的所有代码来添加未被记录的依 赖至go.mod文件或从go.mod文件中删除不再被使用的依赖。 go get命令用拉添加、升级、降级或者删除单个依赖。此命令不如go mod tidy命令常用。0 码力 | 591 页 | 21.40 MB | 1 年前3
2.2.3 Go语言的抢占式调度rizin 启动过程 通过 entry point 找到 Go 进程的执⾏⼊⼝ runtime.rt0_go argc argv 处 理 全 局 m0 g0 初 始 化 m0: Go 程序启动后创建的第⼀个线程; 获 取 CPU 核 ⼼ 数 初 始 化 内 置 数 据 结 构 开 始 执 ⾏ ⽤ 户 main 函 数 从这⾥开始 进⼊调度循环 GMP 的本质 第⼆部分 G、M、P 何时需要抢占 什么时候 我们需要抢占⼀个 正在执⾏(running)的 G 呢? 抢占的触发时机-GC STW gcStart STW preemptall preemptone 抢占的触发时机-栈扫描 markroot scan stack set preempt flag suspendG ⽼版本 新版本 wait for scan complete scanstack resumeG 028840554878115654&scaling=contain markroot -> allgs[i] -> g -> suspendG(g) -> scan g stack -> resumeG 信号式抢占-栈扫描抢占 信号式抢占-后台监控抢占 && gc stw 抢占 sysmon 抢占流程(运⾏超过 10ms): sysmon -> retake -> preemptone -> asyncPreempt0 码力 | 44 页 | 7.43 MB | 1 年前3
Go性能优化概览-曹春晖发现不了这些对象 • 也就不会扫描了 Off heap 也可以减少 Go 进程的内存占⽤和内存使 ⽤波动,但要⽤到 cgo https://dgraph.io/blog/post/manual-memory-management-golang-jemalloc/ CPU 使⽤太⾼了-GC 使⽤ CPU 过⾼ 当 map 中含有⼤量的指针 key 时,会给 GC 扫描造成压⼒ https://golearn 当服务上线时有机器的上下线通知 订阅该服务的其它服务 会收到服务列表的变更通知 ⼀些⼤服务有⼏千个实例 突然下发⼤量服务发现数据 需要对服务发现下发的数据进⾏ unmarshal CPU 使⽤飚升,⼏分钟后恢复 ⾃动 dumper 能够发现的偶发线上问题⼀览 Java FGC,⽹络对端的 fd 写 buffer 满, 导致⼤量 channel 对端的 writer goroutine 阻塞 语⾔之外的优化⼿段0 码力 | 40 页 | 8.69 MB | 1 年前3
5.cgo 原理解析及优化实践如果不是,转发为原来的 sighandler 信号触发 sighandler 时 sighandler 是进程级别的 10x 优化 MoE 整体提升 8% 快了 10 倍 优化前 ~1600ns,优化后 ~140ns (每次 c=>go) https://github.com/golang/go/issues/51676 https://go-review.googlesource.com/c/go/+/392854 栈内存 编译期大小已经的小内存对象 随着函数调度栈伸缩,自动创建/销毁,开销低 扩栈会产生栈移动,地址会变 ② 堆内存 大小不确定的对象 大内存对象 需要 GC 扫描,开销高 目前没有实现 moving GC,但是不保证以后不会 栈上地址强制逃逸 问题:Go 传给 C 的 object 总是 会被 escape to heap 原因:C 又回调 Go C ② 但是,这个 Go 对象中不能包含 Go 指针 未来可能实现 moving garbage collector 八仙过海 ① 内存拷贝 调用 C 的 malloc 申请内存,拷贝后再传给 C 用完之后,需要显式释放 性能较差 ② Pin 指针 用完之后需要 Unpin Go 1.22 之后使用才安全 性能中等 ③ 分开传参 性能最好 GODEBUG=cgocheck=00 码力 | 45 页 | 5.74 MB | 1 年前3
2.2.2 深入理解BFE为什么需要BFE? • 没有统一七层接入的问题 • 功能重复开发 • 运维成本高 • 流量统一控制能力低 • 引入BFE后 • 功能统一开发 • 运维统一管理 • 流量控制能力增强 • BFE平台的主要功能 • 接入和转发,流量调度,安全防攻击,数据分析 BFE部署前 BFE部署后 L4LB 业务A 集群 业务B 集群 业务C 集群 BFE 业务A 集群 业务B 集群 业务C 集群 • 主动健康检查 • 负载均衡系统持续向RS发送探测请求 • 问题:在响应速度和发送压力间存在权衡 • 在分布式场景下问题更加明显 • 被动健康检查 • 利用正常业务请求来发现失败 • 失败后启动主动健康检查 • 问题:业务请求频度低时无法及时发现失败 • 主动和被动的结合 • 汇总两种检查的结果 • 可降低主动检查的频度(如30-60s) 信息透传 • 客户端IP地址透传 • handler err = cbs.AddFilter(bfe_module.HandleFoundProduct, m.productBlockHandler) ... } 未来计划 • BFE管理控制台对外开源 • BFE ingress controller对外开源 BFE开源项目公众号 欢迎广大Gopher使用或参与共建! 谢谢0 码力 | 26 页 | 1.78 MB | 1 年前3
Go 入门指南(The way to Go)语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器 和运行实现上。Ian Lance Taylor 也加入到了开发团队中,并于 2008 年 5 月创建了一个 gcc 前端。 Russ Cox 加入开发团队后着手语言和类库方面的开发,也就是 Go 语言的标准包。在 2009 年 10 月 30 日,Rob Pike 以 Google Techtalk 的形式第一次向人们宣告了 Go 语言的存在。 直到 Gerrand 在 2010 年加入到开发团队中成为共同开发者与支持者。 在 Go 语言在 2010 年 1 月 8 日被 Tiobe(闻名于它的编程语言流行程度排名)宣布为 “2009 年年度语 言” 后,引起各界很大的反响。目前 Go 语言在这项排名中的最高记录是在 2010 年 2 月创下的第13 名,流行程度 1778%。 时间轴: 2007 年 9 月 21 日:雏形设计 2009 年 12 - 本文档使用 看云 构建 作系统或 64 位操作系统)进行区别对待。 这款编译器使用非分代、无压缩和并行的方式进行编译,它的编译速度要比 gccgo 更快,产生更好的 本地代码,但编译后的程序不能够使用 gcc 进行链接。 编译器目前支持以下基于 Intel 或 AMD 处理器架构的程序构建。 图2.1 gc 编译器支持的处理器架构 当你第一次看到这套命名系统的时候你会觉得很奇葩,不过这些命名都是来自于0 码力 | 380 页 | 2.97 MB | 1 年前3
共 55 条
- 1
- 2
- 3
- 4
- 5
- 6













