Go性能优化概览-曹春晖业务性能优化概览 By Xargin 《Go 语⾔⾼级编程》合著者 Go contributor ⽬ 录 优化的前置知识 01 ⽣产环境的优化 02 Continuous profiling 03 优化的前置知识 第⼀部分 Latency numbers every programmer should know https://colin-scott.github.io/p io/personal_website/research/interactive_latency.html 优化的前置知识 • 要能读得懂基本的调⽤栈 • 了解 Go 语⾔内部原理(runtime,常⽤标准库) • 了解常⻅的⽹络协议(http、pb) https://github.com/bagder/http2-explained https://github.com/bagder/http3-explained ⽤户声明的对象,被放在栈上还是堆上, 是由编译器的 escape analysis 来决定的 ⽅法论 内存使⽤优化 CPU 使⽤优化 阻塞优化 GC 优化 标准库优化 runtime 优化 应⽤层优化 底层优化 • 越靠近应⽤层,优化带来的效果越好 • 涉及到底层优化的,⼤多数情况下还是修改应⽤代码 逻辑优化 ⽣产环境的优化 第⼆部分 ⾸先,是发现问题 API 压测 全链路压测 ⽣产环境被 ⾼峰流量打爆了0 码力 | 40 页 | 8.69 MB | 1 年前3
IPC性能极致优化方案-RPAL落地实践IPC性能极致优化方案-RPAL落地实践 谢正尧 字节跳动 研发工程师 目 录 方案诞生的背景 01 全进程地址空间共享与保护 02 用户态进程切换 03 高效的Go Event Poller 04 RPC框架Kitex集成 05 性能收益与业务展望 06 方案诞生的背景 第一部分 方案诞生的背景 几种常见的同机通信场景: 1. 微服务合并部署(亲和性部署、sidecar Call,对比同进程 Function Call 仅增加 200 ns 延迟。 业务真实数据 性能收益与业务展望 业务展望 1. 定制化场景深度优化: 同步 RPAL Call; 请求/响应 Zero Copy; 2. 业务进程与服务网格 IPC 性能优化: 结合用户态协议栈,实现网络 IO 绕过内核 CloudWeGo 是一套由字节跳动基础架构服务框架团队开源的、 可快速构建企业级云原生微服务架构0 码力 | 39 页 | 2.98 MB | 1 年前3
5.cgo 原理解析及优化实践cgo 原理解析及优化实践 朱德江 蚂蚁集团 MOSN 核心成员 Golang contributor Envoy Golang extension maintainer 公众号 • 开源爱好者 • 十余年网关研发 • OpenResty 老司机(NGINX + LuaJIT) • MOSN 核心成员 • Envoy Golang extension maintainer • • 玩过 DSL 编译器 • 对 LuaJIT、Go 有一些研究 目 录 背景介绍 01 cgo 工作机制 02 cgo 调度机制 03 CPU 优化 04 GC 优化 05 背景介绍 第一部分 网关发展历史 网关的扩展机制 什么是 MoE 举个例子 为什么需要 MoE Envoy 研发效能 良好的生态,上手门槛低 Wasm?Lua? Golang P,会携带新建的 newg,在一个新的 Go 线程上执行 Go 调 C ① “释放”P 并没有立即执行,需要等 sysmon 来 retake 属于优化;通常 C 很快返回 ② 获取不到 P,也会将 G 放入全局 G 队列 CPU 优化 第四部分 发现过程 needm:获取 extra M,确保 go 需要的信号没有被屏蔽 dropm:释放 extra M,恢复信号 80 码力 | 45 页 | 5.74 MB | 1 年前3
2.1.1 Golang主动式内存缓存的优化探索之路Golang主动式内存缓存的优化探索之路 安晏伯 学而思网校 技术专家 目 录 问题引入 01 难点攻克 02 主动式内存缓存框架 03 总结 04 问题引入 第一部分 为什么能有极致的性能? 01. 如何优化? 解决了哪些技术难题? 主动式内存缓存 如何优化? 极致的性能 除了网络IO,与Redis有什么区别? 复杂的查询怎么办? 02. 传统的Cache很难 主动式内存缓存框架 第三部分 技术全景图 01. 主动式内存缓存架构的技术全景图 数据中心、数据源 02. 分布式部署,解决海量数据的传输、加载 数据全量加载时,缓解数据库压力 链路优化 优化 协议 编码 空值剔除 数据存储、数据传输 带宽减少40% 2GB -> 1.2GB MaxwellConsumer 03. 通过golang接口的方式,实现业务与框架代码分离 DataManager0 码力 | 48 页 | 6.06 MB | 1 年前3
2.2.6 字节跳动在 Go 网络库上的实践buffer go handle() 设计实现 01 性能亮点 02 高级特性 03 展望未来 04 优化方向 优化 Buffer 设计(zerocopy) 优化调度效率(poller) 优化方向 优化 Buffer 设计(zerocopy) 优化调度效率(poller) 优化调度效率 – TP99 分析 gopool go func() { events := make([]event handle cost = ∑(read) + 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 Syscall 执行逻辑相当于 1. enter_runtime 2. raw_syscall 3. exit_runtime 改前 ⬆️ 改后 ⬇️ 优化调度效率 – 调度分析 go func() { events := make([]event, 128) for { n, _ := epoll_wait(epoll_fd, events, msec)0 码力 | 42 页 | 3.19 MB | 1 年前3
Hello 算法 1.1.0 Go版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。0 码力 | 382 页 | 17.60 MB | 1 年前3
Hello 算法 1.0.0b5 Golang版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样我们才能将各种算法进行对比,从而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。0 码力 | 379 页 | 30.70 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 10.5 重识搜索算法 . . . 时间效率:算法运行时间的长短。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧0 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.0.0b4 Golang版10.2. 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 10.3. 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 10.4. 重识搜索算法 . . 空间效率,即算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。掌握评估算法效率的方法则至关重要,因为 只有了解评价标准,我们才能进行算法之间的对比分析,从而指导算法设计与优化过程。 2.1.2. 效率评估方法 实际测试 假设我们现在有算法 A 和算法 B,它们都能解决同一问题,现在需要对比这两个算法的效率。我们最直接的 方法就是找一台计算机,运行这两个算法,并监 log10 ? ,因 此空间复杂度为 ?(log10 ?) = ?(log ?) 。 2.3.4. 权衡时间与空间 理想情况下,我们希望算法的时间复杂度和空间复杂度都能达到最优。然而在实际情况中,同时优化时间复 杂度和空间复杂度通常是非常困难的。 降低时间复杂度通常需要以提升空间复杂度为代价,反之亦然。我们将牺牲内存空间来提升算法运行速度的 思路称为“以空间换时间”;反之,则称为“以时间换空间”。0 码力 | 347 页 | 27.40 MB | 1 年前3
共 46 条
- 1
- 2
- 3
- 4
- 5













