zoukankan      html  css  js  c++  java
  • golang性能优化

    服务开启pprof

        https://pkg.go.dev/net/http/pprof

    1. 安装 go官方包(https://golang.org/dl),用于执行 go tool pprof
    2. go-torch项目(https://github.com/uber/go-torch),用于调用pprof生成火焰图
    3. Flame(https://github.com/brendangregg/FlameGraph) ,用于绘制火焰图
    4. graphviz(apt-get install graphviz)用于绘制调用关系

    CPU火焰图

    端口为服务开启http sever 监听的端口(下同)

    go-torch -u http://127.0.0.1:1000 -t 30


    CPU调用关系

    go tool pprof http://127.0.0.1:1000/debug/pprof/profile

    查看内存用量

    go tool pprof  http://127.0.0.1:1000/debug/pprof/heap
    go tool pprof -alloc_space http://127.0.0.1:1000/debug/pprof/heap

    查看goroutine情况

    http://127.0.0.1:1000/debug/pprof/goroutine?debug=1

    常见的性能优化点

    1. 【CPU】去除不必要的序列化/反序列化 :标准的json库非常耗性能,可以考虑使用其他库,更好的是使用grpc。
    2. 【CPU】线程泄露:goroutine飞出去以后忘了stop/close,尤其是time.ticker之类的定时器。
    3. 【CPU】盲目开启过多goroutine:goroutine能控制就控制一下,开几百个非阻塞的goroutine会导致调度消耗过多CPU。
    4. 【MEM】减少GC:举例来说,字符串(string)传递都是值拷贝,如果数据量大,会产生大量gc,此时完全可以用byte数组来代替。高阶一点就是使用sync.Pool来做一个池子,自己处理内存复用和回收的工作,避免GC。Java在这一块做的很成熟,有新生代和老年代的概念,golang还没有那么完善。
    5. 【MEM】内存预分配:golang的slice很好用,但是底层是数组,如果空间能确定就先确定下来,以免append的时候空间不够导致不停的copy数据来扩大数组大小。
    6. 【DISK】减少磁盘随机读写IO:SATA盘的理论最大读写在300MB/s,磁盘寻道就要10ms,如果大量随机读写,哪怕1kb数据读写,也要10ms,时间就主要花在寻道上。
    7. 【NET】新服务的话,尽量使用grpc代替http。
     
     
     
  • 相关阅读:
    浅谈独立使用NDK编译库文件(Android)
    Ubuntu 13.04 安装使用clang
    一道TOPK问题
    exp-00091 oracle错误的解决办法
    win32多线程程序设计笔记(第四章下)
    数据库索引的实现原理 (转)
    [置顶] linux常用命令手册
    ZigBee研究之旅(二)
    java中length,length(),size()区别
    浅谈href=#与href=javascript:void(0)的区别
  • 原文地址:https://www.cnblogs.com/hellohell/p/15235304.html
Copyright © 2011-2022 走看看