GO开发性能优化 | 青训营标记

40 阅读2分钟

这是我参与第五届青训营伴学笔记创作活动的第4天。该文章是对go的性能测试工具prof的总结。

使用pprof

  1. 在main函数中导入 “net/http/pprof”,将服务监听端口设置和pprof端口一样(通常为6060)。
  2. 可以访问链接http://localhost:6060/debug/pprof/ 看到程序的采样数据。分别是:
    1. allocs:内存分配情况采样
    2. blocks:阻塞情况采样
    3. cmdline:程序启动命令参数
    4. groutain:当前所有协程的堆栈信息
    5. heap:堆内存使用情况
    6. mutex:锁竞争情况
    7. profile:cpu使用情况
    8. threadcreate:系统线程创建情况
    9. trace:程序运行跟踪信息

排查cpu占用过高

启动服务,然后命令行输入命令 go tool pprof "http://localhost:6060/debug/pprof/profile"。 之后进入交互式终端。

  1. top命令用来查看占用cpu较高的函数。
    1. flat:本函数的物理耗时(不包括函数调用)。
    2. flat%:flat/总运行时间。
    3. cum:函数内所有操作的物理耗时。cum一般是次关注的,结合flat来看。flat可以知道哪个函数耗时多,cum让我们知道哪些函数调用了这些费时的函数。
    4. cum%:cum/总运行时间
    5. sum:这一行上面所有flat相加
    6. sum%:这一行上面所有flat%相加
    火焰图:火焰图横向代表cum,相比下面多出的部分代表flat。火焰图调用顺序从上到下,每个方块代表一个函数,它上面一层表示这个函数会调用哪些函数,方块大小代表了占用资源的多少。
  2. 找到占用cpu高度函数F,输入命令list F定位到函数具体位置。

排查内存占用过高

启动服务,然后命令行输入命令 go tool pprof "http://localhost:6060/debug/pprof/heap"。 之后进入交互式终端。同cpu排查一样,top查看内存占用高的函数,list定位到代码具体位置。

排查频繁内存回收

启动服务,然后命令行输入命令 go tool pprof "http://localhost:6060/debug/pprof/allocs"。 之后进入交互式终端。 top查看内存分配频繁的函数,list定位到代码具体位置。

排查频繁协程泄露、锁竞争、阻塞操作

命令分别是:go tool pprof "http://localhost:6060/debug/pprof/groutain"go tool pprof "http://localhost:6060/debug/pprof/mutex"go tool pprof "http://localhost:6060/debug/pprof/block",之后是top,list,web大法。