码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • GoWEB应用性能优化方法与套路


    了解存储设备的读写速度

    在了解性能优化之前,我们先来了解一下时间单位的换算

    1,000 皮秒 = 1纳秒 ns

    1,000,000 皮秒 = 1微秒 μs

    1,000,000,000 皮秒 = 1毫秒 ms

    1,000,000,000,000 皮秒 = 1秒 s 

    从上图我们可以大概知道高速缓存、主存、SSD硬盘、还有硬盘的读写速度时间参考值和量级

    L1 cache reference是 1ns

    L2 cache  reference是 4ns

    Main memory reference是100ns

    SSD random readreference是16000ns ≈ 16μs

    Disk seek reference是2000000ns ≈ 2 ms

    从上面五个数据来看,我们就能大概知道各种储设备的读写速度以及它们之间的量级之差

    优化思路

    首先,我们优化怎么先从大头开始优化,这样我们才能获得最大收益

    本篇文章的性能优化是指在应用层面逻辑代码优化、标准库、Go runtime的优化

    大多数优化集中在应用代码,极少部分优化在标准库和runtime

    我们来看一张图

    在100ms的情况下,各框架的延迟几乎是持平的,所以在WEB应用层方面,框架对应用性能的影响是微乎其微的

    The first test case is to mock 0 ms, 10 ms, 100 ms, 500 ms processing time in handlers.

     GitHub - smallnest/go-web-framework-benchmark: Go web framework benchmark

    如上图所示,我们把一个Go应用程序,做上述的拆分

    第一层的优化的收益通常是最高的,是优化我们的逻辑代码优化

    其次是内存使用优化、CPU使用优化和阻塞优化

    最后是GC优化、标准库优化、runtime优化

    发现问题

    首先,我们得知道我们的应用程序可能会在哪里出问题,因此我们要对对程序进行压测

    • API压测--对单个api接口进行压测
    • 全链路压测--从用户视角进行压测,一个页面通常会对应多个api接口

    我们压测要关注的指标

    • Request rate--每秒请求数
    • Error--请求失败数
    • Duration--请求完成时间
    • Goroutine数,线程数
    • GC频率,gctrace的内容,GC的stw时间

    进pprof寻找可能的故障原因,按照不同的情况,选择不同的方案优化

    pprof线上也要开启着

    压测工具

    通常情况下,我们使用以下其中一个工具就可以压测我们的http程序

    GitHub - giltene/wrk2: A constant throughput, correct latency recording variant of wrk

    GitHub - wg/wrk: Modern HTTP benchmarking tool

    GitHub - rakyll/hey: HTTP load generator, ApacheBench (ab) replacement

    在公司内的真实环境,我们可以考虑内部压测平台或者第三方压测平台,比如说阿里云

    进行全链路压测

    分析问题套路

    1.排除外部问题

    首先在分析问题的过程中,我们要排除掉程序的外部问题,比如依赖的上游服务延迟过高,比如DB、redis、MQ

    2.CPU占用过高

    看CPU profile,优化占用CPU较多的部分逻辑

    3.内存占用过高

    首先看内存RSS是多少,gouroutine多少,gouroutine栈占用多少

    其次,如果goroutine不多,那么重点关注heap profile中的inuse

    最后,定时任务类需要看alloc

    4.goroutine数量过多

    从profile网页进去看看goroutine都在干什么,查死锁、阻塞等问题

    常见的优化办法

    CPU使用过高优化

    1.应用逻辑导致

    ​​​​​​​

    2.GC使用CPU过高

    • 调度相关的函数使用CPU过高
      • 控制最大goroutine数量

    内存使用过高优化

     1.goroutine数量过多

    使用Goroutine pool限制goroutine的数量,比较推荐的有

    • Jeffail/tunny
    • panjf2000/ants

     2.堆内存占用内存空间过高

    • 为不同大小的对象提供不同大小level的sync.Pool

    阻塞问题

    1.上游系统阻塞

    赶紧让上游系统解决!

    2.锁阻塞

    • 减少临界区范围

     

    • 降低锁粒度
    • 同步改异步
      • 日志场景:同步日志->异步日志

    Reference

    1.Numbers Every Programmer Should Know By Year

    2.GitHub - smallnest/go-web-framework-benchmark: Go web framework benchmark

  • 相关阅读:
    glide set gif start stop
    【信息融合】基于BP神经网络和DS 证据理论实现不确定性信息融合问题附matlab代码
    C#开发的PhotoNet看图软件 - 开源研究系列文章 - 个人小作品
    Python:实现字符串split函数功能算法(附完整源码)
    【Pytorch实用教程】nn.LogSoftmax的详细用法及公式
    Dynamsoft Barcode Reader新框架将医疗视觉提升到新水平
    常见数字 | 资料分析
    CSDN 成为开放原子开源基金会黄金捐赠人,共建中国十万亿技术大生态
    openstack 业务组件安装
    API阶段测试
  • 原文地址:https://blog.csdn.net/qq_37186127/article/details/125533382
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号