 1.5 Go 语言构建高并发分布式系统实践具有go特⾊色的运维 问题与瓶颈 问题与瓶颈 单机内存占⽤用 ⾼高达69G GC 3~6s 瓶颈 散列在协程⾥里⾯面的io buffer和 对象不复⽤用 问题与瓶颈 问题与瓶颈 瓶颈 散列在协程⾥里⾯面的io 问题与瓶颈 奔放的协程使⽤用 ⺴⽹网络环境不好 ⺴⽹网络环境不好 引起激增 问题与瓶颈 2~3s的GC 瓶颈 散列在协程⾥里⾯面的io 问题与瓶颈 奔放的协程使⽤用 接⼝口响应速度 降低,重试 增多,压⼒力倍增 问题与瓶颈 2~3s的GC 瓶颈 散列在协程⾥里⾯面的io 问题与瓶颈 奔放的协程使⽤用 内存暴涨 内存暴涨 问题与瓶颈 io阻塞, 协程激增 瓶颈 问题与瓶颈 问题与瓶颈 如何应对的? go语⾔言在基础服务开发领域的优势? 我遭遇了哪些挑战? ⺫⽬目录 具有go特⾊色的运维 go语⾔言程序开发需要找到⼀一种平衡,既利⽤用协程带来的便利性⼜又做适当 集中化处理 套路:任务池集中数据合并请求、连接池+pipeline0 码力 | 39 页 | 5.23 MB | 1 年前3 1.5 Go 语言构建高并发分布式系统实践具有go特⾊色的运维 问题与瓶颈 问题与瓶颈 单机内存占⽤用 ⾼高达69G GC 3~6s 瓶颈 散列在协程⾥里⾯面的io buffer和 对象不复⽤用 问题与瓶颈 问题与瓶颈 瓶颈 散列在协程⾥里⾯面的io 问题与瓶颈 奔放的协程使⽤用 ⺴⽹网络环境不好 ⺴⽹网络环境不好 引起激增 问题与瓶颈 2~3s的GC 瓶颈 散列在协程⾥里⾯面的io 问题与瓶颈 奔放的协程使⽤用 接⼝口响应速度 降低,重试 增多,压⼒力倍增 问题与瓶颈 2~3s的GC 瓶颈 散列在协程⾥里⾯面的io 问题与瓶颈 奔放的协程使⽤用 内存暴涨 内存暴涨 问题与瓶颈 io阻塞, 协程激增 瓶颈 问题与瓶颈 问题与瓶颈 如何应对的? go语⾔言在基础服务开发领域的优势? 我遭遇了哪些挑战? ⺫⽬目录 具有go特⾊色的运维 go语⾔言程序开发需要找到⼀一种平衡,既利⽤用协程带来的便利性⼜又做适当 集中化处理 套路:任务池集中数据合并请求、连接池+pipeline0 码力 | 39 页 | 5.23 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 07 深入浅出访存优化因此,对 fill 这种没有任何计算量,纯粹只有访存的循环体,并 行没有加速效果。称为内存瓶颈( memory-bound )。 • 而 sine 这种内部需要泰勒展开来计算,每次迭代计算量很大的 循环体,并行才有较好的加速效果。称为计算瓶颈( cpu- bound )。 • 并行能减轻计算瓶颈,但不减轻内存瓶颈,故后者是优化的重点 。 浮点加法的计算量 • 冷知识:并行地给浮点数组每个元素做一次加法反而更慢。 可以最小化对缓存的污染,但是必须很快被用上。 重新理解 mem-bound :延迟隐藏 • 之前提到, 1 次浮点读写必须伴随着 32 次浮点加法的运算量,否则和只有 0 次加法的耗时没有任何区别,即内 存带宽成唯一瓶颈的 mem-bound 。可是按我们理解,“ 1 次读写 +0 次加法”应该会比“ 1 次读写 +8 次加法”快一 点点吧,因为 8 次加法尽管比 1 次读写快很多,但是毕竟还是有时间的啊,为什么会几乎没有任何区别? a[1] a[2] 重新理解 mem-bound :延迟隐藏 • 之前提到, 1 次浮点读写必须伴随着 32 次浮点加法的运算量,否则和只有 0 次加法的耗时没有任何区别,即内 存带宽成唯一瓶颈的 mem-bound 。可是按我们理解,“ 1 次读写 +0 次加法”应该会比“ 1 次读写 +8 次加法”快一 点点吧,因为 8 次加法尽管比 1 次读写快很多,但是毕竟还是有时间的啊,为什么会几乎没有任何区别?0 码力 | 147 页 | 18.88 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 07 深入浅出访存优化因此,对 fill 这种没有任何计算量,纯粹只有访存的循环体,并 行没有加速效果。称为内存瓶颈( memory-bound )。 • 而 sine 这种内部需要泰勒展开来计算,每次迭代计算量很大的 循环体,并行才有较好的加速效果。称为计算瓶颈( cpu- bound )。 • 并行能减轻计算瓶颈,但不减轻内存瓶颈,故后者是优化的重点 。 浮点加法的计算量 • 冷知识:并行地给浮点数组每个元素做一次加法反而更慢。 可以最小化对缓存的污染,但是必须很快被用上。 重新理解 mem-bound :延迟隐藏 • 之前提到, 1 次浮点读写必须伴随着 32 次浮点加法的运算量,否则和只有 0 次加法的耗时没有任何区别,即内 存带宽成唯一瓶颈的 mem-bound 。可是按我们理解,“ 1 次读写 +0 次加法”应该会比“ 1 次读写 +8 次加法”快一 点点吧,因为 8 次加法尽管比 1 次读写快很多,但是毕竟还是有时间的啊,为什么会几乎没有任何区别? a[1] a[2] 重新理解 mem-bound :延迟隐藏 • 之前提到, 1 次浮点读写必须伴随着 32 次浮点加法的运算量,否则和只有 0 次加法的耗时没有任何区别,即内 存带宽成唯一瓶颈的 mem-bound 。可是按我们理解,“ 1 次读写 +0 次加法”应该会比“ 1 次读写 +8 次加法”快一 点点吧,因为 8 次加法尽管比 1 次读写快很多,但是毕竟还是有时间的啊,为什么会几乎没有任何区别?0 码力 | 147 页 | 18.88 MB | 1 年前3
 Rust并行编译的挑战与突破挑战:缓存系统访问热点效率瓶颈 thread1 thread2 thread3 threadN ... 多线程调用查询 type_of typeck borrow_ck impl_trait adt_def impl_defaul tness param_env fn_sig ... 查询互相调用 查询缓存系统 查询依赖信息 查询结果缓存 查询执行状态 查询保存文件 性能瓶颈点 频繁访问查询系统,成为效率瓶颈点 频繁访问查询系统,成为效率瓶颈点 挑战:缓存系统访问热点效率瓶颈 Sharded —— 接口统一,存储分离 cache1 cache2 cache3 cacheM ... thread1 thread2 thread3 threadN ... 根据Key哈希值决定索引 Sharded数据结构设计 Rust并行编译的未来 · 抹平共享数据结构造成的性能差距 · 多线程环境下的编译器度量方案 多线程环境下的编译器度量方案 · 针对并行环境的编译器测试 · 深化编译器并行化 从并行编译到并行程序设计 用巧妙的数据结构设计化解效率瓶颈 • thread_local • specialization • WorkerLocal • 线程级缓存 用优秀的设计消减数据同步代价 读写分离 限制作用范围 COPY-WRITE机制 优化并行粒度 任务粒度与并行效率的关系 rayon库中的粒度控制函数0 码力 | 25 页 | 4.60 MB | 1 年前3 Rust并行编译的挑战与突破挑战:缓存系统访问热点效率瓶颈 thread1 thread2 thread3 threadN ... 多线程调用查询 type_of typeck borrow_ck impl_trait adt_def impl_defaul tness param_env fn_sig ... 查询互相调用 查询缓存系统 查询依赖信息 查询结果缓存 查询执行状态 查询保存文件 性能瓶颈点 频繁访问查询系统,成为效率瓶颈点 频繁访问查询系统,成为效率瓶颈点 挑战:缓存系统访问热点效率瓶颈 Sharded —— 接口统一,存储分离 cache1 cache2 cache3 cacheM ... thread1 thread2 thread3 threadN ... 根据Key哈希值决定索引 Sharded数据结构设计 Rust并行编译的未来 · 抹平共享数据结构造成的性能差距 · 多线程环境下的编译器度量方案 多线程环境下的编译器度量方案 · 针对并行环境的编译器测试 · 深化编译器并行化 从并行编译到并行程序设计 用巧妙的数据结构设计化解效率瓶颈 • thread_local • specialization • WorkerLocal • 线程级缓存 用优秀的设计消减数据同步代价 读写分离 限制作用范围 COPY-WRITE机制 优化并行粒度 任务粒度与并行效率的关系 rayon库中的粒度控制函数0 码力 | 25 页 | 4.60 MB | 1 年前3
 4 Python机器学习性能优化Python机器学习性能优化 以BERT服务为例例,从1到1000 刘欣 ⽬目录 CONTENTS 1. 优化的哲学 2. 了解你的资源 3. 定位性能瓶颈 4. 动⼿优化 1. 优化的哲学 "There ain't no such thing as a free lunch" Ahmdal’s Law • 系统整体的优化,取决于热点部分的占⽐比和该部分的加速程度 No Free Flask Production Server • gunicorn 多进程解决多核利利⽤用率问题 • gevent 协程替代多线程⽹网络模型 • 更更⾼高效的序列列化lib 3 定位性能瓶颈 Profile before Optimizing Python Profilers • time.time() • cProfile • line profiler • pyflame 放个截图 cProfile • 倒序打印 & graph pyflame • 插桩 or 采样 • 放个flamegraph • 开源地址 wrk • 制造压⼒力力 • 挖掘整体性能瓶颈 • 实现⾮非常精妙的压⼒力力⼯工具,强烈烈安利利(要不不要写个py binding) 4 动⼿优化 多线程服务器的问题 • 每个请求单独进GPU,利利⽤用率不不⾼高 • ⼤大量量请求并⾏行行,CUDA会爆0 码力 | 38 页 | 2.25 MB | 1 年前3 4 Python机器学习性能优化Python机器学习性能优化 以BERT服务为例例,从1到1000 刘欣 ⽬目录 CONTENTS 1. 优化的哲学 2. 了解你的资源 3. 定位性能瓶颈 4. 动⼿优化 1. 优化的哲学 "There ain't no such thing as a free lunch" Ahmdal’s Law • 系统整体的优化,取决于热点部分的占⽐比和该部分的加速程度 No Free Flask Production Server • gunicorn 多进程解决多核利利⽤用率问题 • gevent 协程替代多线程⽹网络模型 • 更更⾼高效的序列列化lib 3 定位性能瓶颈 Profile before Optimizing Python Profilers • time.time() • cProfile • line profiler • pyflame 放个截图 cProfile • 倒序打印 & graph pyflame • 插桩 or 采样 • 放个flamegraph • 开源地址 wrk • 制造压⼒力力 • 挖掘整体性能瓶颈 • 实现⾮非常精妙的压⼒力力⼯工具,强烈烈安利利(要不不要写个py binding) 4 动⼿优化 多线程服务器的问题 • 每个请求单独进GPU,利利⽤用率不不⾼高 • ⼤大量量请求并⾏行行,CUDA会爆0 码力 | 38 页 | 2.25 MB | 1 年前3
 202205 MeterSphere:一站式开源持续测试平台
持续测试是执⾏⾃动化测试的过程,作为软件 交付流⽔线的重要⼀环,持续测试帮助企业尽 快获得软件发布后业务⻛险的反馈。 保 证 交 付 ⾜ 够 快 保 证 业 务 ⾜ 够 稳 催⽣ 促进 为什么测试环节会成为持续交付中的瓶颈? 测试速度问题 • 超过 80% 的测试仍是⼿动执⾏的; • ⼤约 67% 的测试⽤例的编写、维护和执⾏是冗余的; • 测试⼈员平均要花 17% 的时间来处理误报和 14% 的时间来处理额外任务; ⾃定义 JAR 包 TXT 参数化数据 测试计划报告 功能测试报告 接⼝测试报告 UI 测试报告 性能测试报告 依据三个关键能⼒打造⼀站式持续测试平台 - 让测试不再成为持续交付的瓶颈 - MeterSphere ⼀站式开源持续测试平台 敏捷流程 持续监控 持续开发 团队协作、融⼊ DevOps 持续集成 持续部署 测试跟踪 测试计划、⽤例管理、测试报告 接⼝测试 互联⽹+的发展,性能测试逐渐成为了企业持续⾼效的测试类型之⼀ - 服务 性能测试服务 产品 MeterSphere 关于性能测试企业需要什么? 性能测试核⼼⽬标 • 找出系统性能瓶颈并进⾏优化 • 预估系统性能瓶颈 性能测试 性能测试实施三要素 1. 结合业务实际需要明确压⼒测试的关键指标; 2. 以⾃动化的⽅式开展局部到全链路的压测; 3. 根据实际业务情况,适当引⼊外部专家服务。0 码力 | 40 页 | 11.03 MB | 1 年前3 202205 MeterSphere:一站式开源持续测试平台
持续测试是执⾏⾃动化测试的过程,作为软件 交付流⽔线的重要⼀环,持续测试帮助企业尽 快获得软件发布后业务⻛险的反馈。 保 证 交 付 ⾜ 够 快 保 证 业 务 ⾜ 够 稳 催⽣ 促进 为什么测试环节会成为持续交付中的瓶颈? 测试速度问题 • 超过 80% 的测试仍是⼿动执⾏的; • ⼤约 67% 的测试⽤例的编写、维护和执⾏是冗余的; • 测试⼈员平均要花 17% 的时间来处理误报和 14% 的时间来处理额外任务; ⾃定义 JAR 包 TXT 参数化数据 测试计划报告 功能测试报告 接⼝测试报告 UI 测试报告 性能测试报告 依据三个关键能⼒打造⼀站式持续测试平台 - 让测试不再成为持续交付的瓶颈 - MeterSphere ⼀站式开源持续测试平台 敏捷流程 持续监控 持续开发 团队协作、融⼊ DevOps 持续集成 持续部署 测试跟踪 测试计划、⽤例管理、测试报告 接⼝测试 互联⽹+的发展,性能测试逐渐成为了企业持续⾼效的测试类型之⼀ - 服务 性能测试服务 产品 MeterSphere 关于性能测试企业需要什么? 性能测试核⼼⽬标 • 找出系统性能瓶颈并进⾏优化 • 预估系统性能瓶颈 性能测试 性能测试实施三要素 1. 结合业务实际需要明确压⼒测试的关键指标; 2. 以⾃动化的⽅式开展局部到全链路的压测; 3. 根据实际业务情况,适当引⼊外部专家服务。0 码力 | 40 页 | 11.03 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型结果反而还变慢了……所以有时候教科书(如 Concurrency in Action )不一定就是完美解决方案,要根据实际情况判断。 真正的解决: tbb::spin_mutex 其实主要的瓶颈在于 std::mutex 会切换到操作系统内核中去调度 ,非常低效。而 tbb::spin_mutex 则是基于硬件原子指令的,完全 用户态的实现。区别: std::mutex 的陷入等待会让操作系统挂起 捕获的访问者模式。 实现访问者模式 • 额,总之就是每一层都有一个缓存。 第 5 章:量化整型 使用 int :每个占据 4 字节 • 记得我第七课说过,一个简单的循环体往 往会导致内存成为瓶颈( memory- bound )。 • 右边就是一个很好的例子。 使用 int64_t :每个占据 8 字节 • 如果用更大的数据类型,用时会直接提升两倍! • 这是因为 i % 2 的计算时间,完全隐藏在内存 特别是并行以后,计算量可以被并行加速,而访 存却不行。 使用 int8_t :每个占据 1 字节 • 因此我们可以把数据类型变小,这样所需的内存 量就变小,从而内存带宽也可以减小! • 对于右边这种内存瓶颈的循环体,从 4 字节的 int 改成 int8_t ,理论上可以增加 4 倍速度! • 这就是量化数据类型的思想,把占空间大的数据 类型转换成较小的(损失一定精度,换来性能) 。 • 因0 码力 | 102 页 | 9.50 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型结果反而还变慢了……所以有时候教科书(如 Concurrency in Action )不一定就是完美解决方案,要根据实际情况判断。 真正的解决: tbb::spin_mutex 其实主要的瓶颈在于 std::mutex 会切换到操作系统内核中去调度 ,非常低效。而 tbb::spin_mutex 则是基于硬件原子指令的,完全 用户态的实现。区别: std::mutex 的陷入等待会让操作系统挂起 捕获的访问者模式。 实现访问者模式 • 额,总之就是每一层都有一个缓存。 第 5 章:量化整型 使用 int :每个占据 4 字节 • 记得我第七课说过,一个简单的循环体往 往会导致内存成为瓶颈( memory- bound )。 • 右边就是一个很好的例子。 使用 int64_t :每个占据 8 字节 • 如果用更大的数据类型,用时会直接提升两倍! • 这是因为 i % 2 的计算时间,完全隐藏在内存 特别是并行以后,计算量可以被并行加速,而访 存却不行。 使用 int8_t :每个占据 1 字节 • 因此我们可以把数据类型变小,这样所需的内存 量就变小,从而内存带宽也可以减小! • 对于右边这种内存瓶颈的循环体,从 4 字节的 int 改成 int8_t ,理论上可以增加 4 倍速度! • 这就是量化数据类型的思想,把占空间大的数据 类型转换成较小的(损失一定精度,换来性能) 。 • 因0 码力 | 102 页 | 9.50 MB | 1 年前3
 2022年美团技术年货 合辑引入的“Quant”,“DeQuant”节点打破了 原有 TensorRT 的融合策略,导致了很多算子无法融合,从而影响了最终量化引擎 的性能。在这一节中,我们以 YOLOv6s_repopt 为例,展示一种定位具体瓶颈的图 优化方法。在量化实践中,图优化是一个很实用的手段,我们可以依法炮制,提升模 型的 QPS。 算法 < 27 表 5 PTQ 和 QAT 模型的 QPS 对比 3.1.1 性能分析 首先,我们利用 1500%,几乎满负荷运转。我们推测整个 线上服务的“瓶颈”可能在 CPU,而图片预处理会使用大量 CPU 资源。 表 9 服务器资源配置 算法 < 33 3.2.1 DALI 预处理 为了解决 CPU 预处理带来的“瓶颈”,我们采用了 NVIDIA 的 DALI 库,将预处理 直接放到 GPU 中运算。该库可以在 GPU 上对二进制图片进行解码和预处理,极大 的缓解 CPU 瓶颈,下图 12 为 DALI 的经典流程。 1100% 左右,部分 CPU 资源得到了“解放”。另外,我们也测试 FP16 + DALI 的吞吐,反而有略微的下降。我们推测是 DALI 抢占了部分 GPU 计 算资源,而 FP16 服务的瓶颈在 GPU,所以对整体性能产生了负面影响。 34 > 2022年美团技术年货 图 13 使用 DALI 后吞吐测试提升对比 4. 总结 综上所述,本文基于 YOLOv6 V1.0 版本,以 YOLOv6s0 码力 | 1356 页 | 45.90 MB | 1 年前3 2022年美团技术年货 合辑引入的“Quant”,“DeQuant”节点打破了 原有 TensorRT 的融合策略,导致了很多算子无法融合,从而影响了最终量化引擎 的性能。在这一节中,我们以 YOLOv6s_repopt 为例,展示一种定位具体瓶颈的图 优化方法。在量化实践中,图优化是一个很实用的手段,我们可以依法炮制,提升模 型的 QPS。 算法 < 27 表 5 PTQ 和 QAT 模型的 QPS 对比 3.1.1 性能分析 首先,我们利用 1500%,几乎满负荷运转。我们推测整个 线上服务的“瓶颈”可能在 CPU,而图片预处理会使用大量 CPU 资源。 表 9 服务器资源配置 算法 < 33 3.2.1 DALI 预处理 为了解决 CPU 预处理带来的“瓶颈”,我们采用了 NVIDIA 的 DALI 库,将预处理 直接放到 GPU 中运算。该库可以在 GPU 上对二进制图片进行解码和预处理,极大 的缓解 CPU 瓶颈,下图 12 为 DALI 的经典流程。 1100% 左右,部分 CPU 资源得到了“解放”。另外,我们也测试 FP16 + DALI 的吞吐,反而有略微的下降。我们推测是 DALI 抢占了部分 GPU 计 算资源,而 FP16 服务的瓶颈在 GPU,所以对整体性能产生了负面影响。 34 > 2022年美团技术年货 图 13 使用 DALI 后吞吐测试提升对比 4. 总结 综上所述,本文基于 YOLOv6 V1.0 版本,以 YOLOv6s0 码力 | 1356 页 | 45.90 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 06  TBB 开启的并行编程之旅的加速比是物理核心的数量? • 剧透:因为本例中 reduce 是内存密集型, for 是计算密集型。 • 超线程对 reduce 这种只用了简单的加法,瓶颈在内存的算法起了作用。 • 而本例中 for 部分用了 std::sin ,需要做大量数学运算,因此瓶颈在 ALU 。 • 这里卖个关子,欲知后事如何,请待下集揭晓! 更专业的性能测试框架: Google benchmark • 手动计算时间差有点太硬核了,而且只运 简单粗暴并行 for 加速比: 3.16 倍 很不理想,为什么? 很简单,循环体太大,每跑一遍指令缓存和数据缓存都 会重新失效一遍。且每个核心都在读写不同地方的数据 ,不能很好的利用三级缓存,导致内存成为瓶颈。 拆分为三个 for 加速比: 3.47 倍 解决了指令缓存失效问题,但是三次独立的 for 循环每次 结束都需要同步,一定程度上妨碍了 CPU 发挥性能;而 且每个 step 后依然写回了数组,数据缓存没法充分利用 从串行到并行,从来就没有什么万能膏药。 • CPU 上的并行尚且如此,何况 GPU 。 • 熟悉原理、反复实验,才能优化出好程序。 • 本课仅入门,深入可以看 Pro TBB 这本书。 • 优化重点在于程序的瓶颈部分,不用在小细节上 浪费精力。如果有个 O(n²) 的循环体,则只看他 ,并无视一旁的 O(n) 循环体。 小彭老师锐评时间 比如刚刚例子:并行筛选 GPU 必须 parallel_scan0 码力 | 116 页 | 15.85 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 06  TBB 开启的并行编程之旅的加速比是物理核心的数量? • 剧透:因为本例中 reduce 是内存密集型, for 是计算密集型。 • 超线程对 reduce 这种只用了简单的加法,瓶颈在内存的算法起了作用。 • 而本例中 for 部分用了 std::sin ,需要做大量数学运算,因此瓶颈在 ALU 。 • 这里卖个关子,欲知后事如何,请待下集揭晓! 更专业的性能测试框架: Google benchmark • 手动计算时间差有点太硬核了,而且只运 简单粗暴并行 for 加速比: 3.16 倍 很不理想,为什么? 很简单,循环体太大,每跑一遍指令缓存和数据缓存都 会重新失效一遍。且每个核心都在读写不同地方的数据 ,不能很好的利用三级缓存,导致内存成为瓶颈。 拆分为三个 for 加速比: 3.47 倍 解决了指令缓存失效问题,但是三次独立的 for 循环每次 结束都需要同步,一定程度上妨碍了 CPU 发挥性能;而 且每个 step 后依然写回了数组,数据缓存没法充分利用 从串行到并行,从来就没有什么万能膏药。 • CPU 上的并行尚且如此,何况 GPU 。 • 熟悉原理、反复实验,才能优化出好程序。 • 本课仅入门,深入可以看 Pro TBB 这本书。 • 优化重点在于程序的瓶颈部分,不用在小细节上 浪费精力。如果有个 O(n²) 的循环体,则只看他 ,并无视一旁的 O(n) 循环体。 小彭老师锐评时间 比如刚刚例子:并行筛选 GPU 必须 parallel_scan0 码力 | 116 页 | 15.85 MB | 1 年前3
 IPC性能极致优化方案-RPAL落地实践IP、UDS、共享内存IPC 方案诞生的背景 以性能较优的 IPC 方案 share memory ipc 为例分析性能瓶颈: 注:方案 github 地址:https://github.com/cloudwego/shmipc-go 方案诞生的背景 方案诞生的背景 IPC 的性能瓶颈有哪些: 1. 系统特权级切换; 2. 异步线程唤醒/休眠(事件通知); 3. 数据拷贝(序列化/反序列化); 基于以上问题,我们最终引入了 RPAL(Run Process As Library) 方案,基于跨进程虚拟地址 共享,复用 epoll 网络模型,实现了纯用户态的事件轮询和无拷贝的指针读写接口。 从性能瓶颈的两点分析: 1. 异步线程唤醒: 关键在于如何最低限度降低线程唤醒的开销,非必要不通知事件。 2. 数据序列化/反序列化 需要做到跨进程的虚拟地址空间共享,通过传递指针来传递一切数据。 全进程地址空间共享与保护0 码力 | 39 页 | 2.98 MB | 1 年前3 IPC性能极致优化方案-RPAL落地实践IP、UDS、共享内存IPC 方案诞生的背景 以性能较优的 IPC 方案 share memory ipc 为例分析性能瓶颈: 注:方案 github 地址:https://github.com/cloudwego/shmipc-go 方案诞生的背景 方案诞生的背景 IPC 的性能瓶颈有哪些: 1. 系统特权级切换; 2. 异步线程唤醒/休眠(事件通知); 3. 数据拷贝(序列化/反序列化); 基于以上问题,我们最终引入了 RPAL(Run Process As Library) 方案,基于跨进程虚拟地址 共享,复用 epoll 网络模型,实现了纯用户态的事件轮询和无拷贝的指针读写接口。 从性能瓶颈的两点分析: 1. 异步线程唤醒: 关键在于如何最低限度降低线程唤醒的开销,非必要不通知事件。 2. 数据序列化/反序列化 需要做到跨进程的虚拟地址空间共享,通过传递指针来传递一切数据。 全进程地址空间共享与保护0 码力 | 39 页 | 2.98 MB | 1 年前3
 Go性能优化概览-曹春晖-> 个别不在意延迟的选择第三⽅库优 化 压测⼿段 公司内部压测平台 全链路压测 阻塞导致⾼延迟 在后端系统开发中,锁瓶颈是较常⻅的问题,⽐如⽂件锁 阻塞导致⾼延迟 还有⼀些公司的 metrics 系统设计,本机上会有 udp 通信 阻塞导致⾼延迟 锁瓶颈的⼀般优化⼿段: • 缩⼩临界区:只锁必须锁的对象,临界区内尽量不放慢操作,如 syscall • 降低锁粒度:全局锁 -> make ⼀个全局的超⼤ slice(如 1GB) 这种⽅式只适合那些内存不紧张,且希望提⾼整体吞吐量的服务 内存占⽤过⾼-堆分配导致内存过⾼ 实例分析,TLS 的 write buffer 瓶颈优化过程 https://github.com/golang/go/blob/master/src/crypto/tls/conn.go#L930 内存占⽤过⾼-堆分配导致内存过⾼ https://github0 码力 | 40 页 | 8.69 MB | 1 年前3 Go性能优化概览-曹春晖-> 个别不在意延迟的选择第三⽅库优 化 压测⼿段 公司内部压测平台 全链路压测 阻塞导致⾼延迟 在后端系统开发中,锁瓶颈是较常⻅的问题,⽐如⽂件锁 阻塞导致⾼延迟 还有⼀些公司的 metrics 系统设计,本机上会有 udp 通信 阻塞导致⾼延迟 锁瓶颈的⼀般优化⼿段: • 缩⼩临界区:只锁必须锁的对象,临界区内尽量不放慢操作,如 syscall • 降低锁粒度:全局锁 -> make ⼀个全局的超⼤ slice(如 1GB) 这种⽅式只适合那些内存不紧张,且希望提⾼整体吞吐量的服务 内存占⽤过⾼-堆分配导致内存过⾼ 实例分析,TLS 的 write buffer 瓶颈优化过程 https://github.com/golang/go/blob/master/src/crypto/tls/conn.go#L930 内存占⽤过⾼-堆分配导致内存过⾼ https://github0 码力 | 40 页 | 8.69 MB | 1 年前3
共 108 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11














