go性能调优之pprof

pprof

pprof是go语言自带的性能分析工具,在对go程序进行故障定位、性能调优时应用非常广泛。

pprof是一个分析工具,通过go tool pprof可以直接对采集样本进行分析。

什么情况下需要进行性能调优

一般常规内容:

  1. cpu:程序对cpu的使用情况 - 使用时长,占比等
  2. 内存:程序对cpu的使用情况 - 使用时长,占比,内存泄露等。如果在往里分,程序堆、栈使用情况
  3. I/O:IO的使用情况 - 哪个程序IO占用时间比较长

golang 程序中:

  1. goroutine:go的协程使用情况,调用链的情况
  2. goroutine leak:goroutine泄露检查
  3. go dead lock:死锁的检测分析
  4. data race detector:数据竞争分析,其实也与死锁分析有关
采样

样本的采集有三种方式:

  1. runtime/pprof 直接采样

一般用于工具型程序

package main

import (
	"os"
	"runtime/pprof"
)

func main() {
	f, err := os.Create("./profile.out")
	if err != nil {
		os.Exit(1)
		return
	}
	err = pprof.StartCPUProfile(f) //采集cpu profiling,程序退出就结束
	if err != nil {
		os.Exit(1)
		return
	}
	defer pprof.StopCPUProfile()
	
	// do something ...
	
	hf, err := os.Create("./heap.out")
	if err != nil {
		os.Exit(1)
		return
	}
	pprof.WriteHeapProfile(hf) //写入堆信息
}

采样文件会输出到./profile.out中。

  1. net/http/pprof 借助http服务采样

一般用于服务型程序

package main

import (
   "net/http"
   _ "net/http/pprof"
)

func main() {
   http.ListenAndServe("localhost:8080",nil)
   // do something
}

pprof在init时会向http.DefaultServerMux注册handler,如果使用自定义的多路复用器,只需要按照init方法,注册handler即可。

服务启动后,可以访问http://HOST:PORT/debug/pprof查看采样结果,

也可以使用curl将采样结果保存到本地文件,curl -sk -v http://HOST:PORT/debug/pprof/profile?secons=30s > profile.out

  1. Benchmark时采样
go test -cpuprofile cpu.prof -memprofile mem.prof -bench .
分析

分析采样数据有三种方式:

  1. 直接访问pprof的web网页,查看采样结果。

    1. Allocs: 查看过去所有内存分配样本
    2. Block:查看导致阻塞同步的堆栈跟踪
    3. cmdline:当前程序命令行
    4. goroutine:当前所有运行的goroutine堆栈跟踪
    5. heap:当前活动对象的内存分配情况
    6. mutex:争用互斥锁的竞争者的堆栈跟踪
    7. profile:默认进行30s的cpu profiling,生成profile文件
    8. threadcreate:导致创建新线程的堆栈跟踪
    9. trace
  2. 通过命令行交互方式查看

    可以通过go tool pprof -h 查看可选参数

    go tool pprof [source|binary]
    // go tool pprof cpuprofile.pprof
    // go tool pprof http://HOST:PORT/debug/pprof/heap
    // go tool pprof -svg http://HOST:PORT/debug/pprof/heap >heap.svg 
    

    进入交互命令后,可以使用命令进行查看分析:

    1. help可以查看帮助信息,o查看选项信息
    2. top、text对结果进行排序后展示
      1. flat表示当前函数占用的cpu时间
      2. flat%表示当前函数占cpu的占总用时间的百分比
      3. sum%表示flat%的累积值
      4. cum表示当前函数以及当前函数调用其他函数的时间,比如a调用b,那么a的cum的值就是包含b的调用时间,火焰图就是使用的cum
      5. cum%表示当前函数占总占用时间的百分比
    3. 通过top可以看出具体哪个函数比较耗时
    4. 使用list func1分析具体的函数,找到耗时的语句进行优化
    5. svg生成svg格式的输出
  3. 通过UI界面查看(推荐)

    1. 需要先安装graphviz软件,安装好将bin目录添加到环境变量,并使用dot -v验证是否装好。
    2. 执行go tool pprof -http=:8888 heap.out
    3. 执行之后会在浏览器打开一个UI界面

    UI界面包含三个栏目:

    1. VIEW 可以选择展示的形式,有top、graph、flamegraph等
    2. SAMPLE 选择展示的内容
    3. REFINE 配合Search regex对展示结果进行筛选

    关于图形的一点说明:

    1. 每个框代表一个函数,理论上框越大表示占用的 cpu 资源越多
    2. 每个框之间的线条代表函数之间的调用关系,线条上的数字表示函数调用的次数
    3. 每个框中第一行数字表示当前函数占用 cpu 的百分比,第二行数字表示当前函数累计占用 cpu 的百分比

    火焰图说明:

    1. 火焰图 svg 文件,你可以点击上面的每个方块来查看分析它上面的内容。

    2. 火焰图的调用顺序从下到上,每个方块代表一个函数,它上面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用时长长短。

参考

golang 性能优化分析工具 pprof (上) -来自九卷技术录,一个非常优质的博客
还有公众号网管叨bi叨的pprof系列

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法高效。 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd_injection) 目录枚举 (key: dirscan) 路径穿越检测 (key: path_traversal) XML 实体注入检测 (key: xxe) 文件上传检测 (key: upload) 弱口令检测 (key: brute_force) jsonp 检测 (key: jsonp) ssrf 检测 (key: ssrf) 基线检查 (key: baseline) 任意跳转检测 (key: redirect) CRLF 注入 (key: crlf_injection) Struts2 系列漏洞检测 (高级版,key: struts) Thinkphp系列漏洞检测 (高级版,key: thinkphp) POC 框架 (key: phantasm) 其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。 设计理念 发最少的包做效果最好的探测。 如果一个请求可以确信漏洞存在,那就发一个请求。如果两种漏洞环境可以用同一个 payload 探测出来,那就 不要拆成两个。 允许一定程度上的误报来换取扫描速度的提升 漏洞检测工具无法面面俱到,在漏报和误报的选择上必然要选择误报。如果在使用中发现误报比较严重,可以进行反馈。 尽量不用时间盲注等机制检测漏洞。 时间检测受影响因素太多且不可控,而且可能会影响其他插件的运行。因此除非必要(如 sql)请尽量使用与时间无关的 payload。 尽量不使用盲打平台 如果一个漏洞能用回显检测就用回显检测,因为盲打平台增加了漏洞检测过程的不确定性和复杂性。 耗时操作谨慎处理 全局使用 Context 做管理,不会因为某个请求而导致全局卡死。 简易架构 了解 xray 的整体架构可以更好的理解 cli 和配置文件的设置,方便大家更好的使用。 整体来看,扫描器这类工具大致都是由三部分组成: 来源处理 漏洞检测 结果输出 来源处理 这一部分的功能是整个漏洞检测的入口,在 xray 中我们定义了四个入口,分别是 HTTP 被动代理 简易爬虫 单个 URL URL列表的文件 单个原始 HTTP 请求文件 漏洞检测 这一部分是引擎的核心功能,用于处理前面 来源处理 部分产生的标准化的请求。用户可以针对性的启用插件,配置扫描插件的参数,配置 HTTP 相关参数等。 结果输出 漏洞扫描和运行时的状态统称为结果输出,xray 定义了如下几种输出方式: Stdout (屏幕输出, 默认开启) JSON 文件输出 HTML 报告输出 Webhook 输出 使用教程见:xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法高效。 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd_injection) 目录枚举 (key: dirscan) 路径穿越检测 (key: path_traversal) XML 实体注入检测 (key: xxe) 文件上传检测 (key: upload) 弱口令检测 (key: brute_force) jsonp 检测 (key: jsonp) ssrf 检测 (key: ssrf) 基线检查 (key: baseline) 任意跳转检测 (key: redirect) CRLF 注入 (key: crlf_injection) Struts2 系列漏洞检测 (高级版,key: struts) Thinkphp系列漏洞检测 (高级版,key: thinkphp) POC 框架 (key: phantasm) 其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。 设计理念 发最少的包做效果最好的探测。 如果一个请求可以确信漏洞存在,那就发一个请求。如果两种漏洞环境可以用同一个 payload 探测出来,那就 不要拆成两个。 允许一定程度上的误报来换取扫描速度的提升 漏洞检测工具无法面面俱到,在漏报和误报的选择上必然要选择误报。如果在使用中发现误报比较严重,可以进行反馈。 尽量不用时间盲注等机制检测漏洞。 时间检测受影响因素太多且不可控,而且可能会影响其他插件的运行。因此除非必要(如 sql)请尽量使用与时间无关的 payload。 尽量不使用盲打平台 如果一个漏洞能用回显检测就用回显检测,因为盲打平台增加了漏洞检测过程的不确定性和复杂性。 耗时操作谨慎处理 全局使用 Context 做管理,不会因为某个请求而导致全局卡死。 简易架构 了解 xray 的整体架构可以更好的理解 cli 和配置文件的设置,方便大家更好的使用。 整体来看,扫描器这类工具大致都是由三部分组成: 来源处理 漏洞检测 结果输出 来源处理 这一部分的功能是整个漏洞检测的入口,在 xray 中我们定义了四个入口,分别是 HTTP 被动代理 简易爬虫 单个 URL URL列表的文件 单个原始 HTTP 请求文件 漏洞检测 这一部分是引擎的核心功能,用于处理前面 来源处理 部分产生的标准化的请求。用户可以针对性的启用插件,配置扫描插件的参数,配置 HTTP 相关参数等。 结果输出 漏洞扫描和运行时的状态统称为结果输出,xray 定义了如下几种输出方式: Stdout (屏幕输出, 默认开启) JSON 文件输出 HTML 报告输出 Webhook 输出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值