一文掌握Go性能分析、采样分析、链路追踪分析、生成火焰图、打点对比分析、压力测试分析、生成网页报告web查看

一文掌握Go性能分析、采样分析、链路追踪分析、生成火焰图、打点对比分析、压力测试分析、生成网页报告web查看。

在这里插入图片描述

Go性能分析

1. 准备工作

1.1 下载go-wrk

这个是用来进行http接口压测的,
官网地址:https://github.com/tsliwowicz/go-wrk

七牛云下载

使用

go-wrk -d 500 http://localhost:8080/hello

1.2 安装生成火焰图工具

1.2.1 下载go-torch

go get github.com/uber/go-torch

1.2.2 安装perl

官网下载地址:https://www.activestate.com/products/perl/downloads/

七牛云下载

注意:安装时记得把添加到环境变量PATH选项勾上

1.2.3 下载FlameGraph

git clone https://github.com/brendangregg/FlameGraph.git

注意:将此文件夹加入到PATH环境变量中

1.3 下载graphviz

生成SVG 图,能够更好地看到函数调用 CPU 占用情况

1.3.1 Windows安装

官网下载地址:https://graphviz.gitlab.io/_pages/Download/Download_windows.html

七牛云下载

安装好之后,添加其 bin文件到PATH环境变量中

1.3.2 Linux安装

# MacOS
brew install graphviz

# Ubuntu
sudo apt-get install graphviz

# Centos
yum install graphviz

1.3.3 测试

检查是否安装成功

dot -version

2. 性能分析

2.1 开启性能分析

开启性能分析只需要导入下面这个包即可

import _ "net/http/pprof"

2.2 开始压测

完整代码见文章末尾附录

  1. 启动 main.go
  2. 开始压测
go-wrk -d 500 http://localhost:8080/hello

2.3 web查看

浏览器打开:http://localhost:8080/debug/pprof/

  • allocs: 内存分配情况
  • block: 导致阻塞同步的堆栈跟踪
  • cmdline: 当前程序激活的命令行
  • goroutine: 当前运行的goroutine
  • heap: 存活对象的内存分配情况
  • mutex: 互斥锁的竞争持有者的堆栈跟踪
  • profile: 默认进行 30s 的 CPU Profiling
  • threadcreate: 操作系统线程跟踪
  • trace: 当前程序执行情况
  • full goroutine stack dump: 所有goroutine栈输出

粗略查看,以goroutine为例,参数有debug=1 与 debug = 2

  • http://localhost:8080/debug/pprof/goroutine?dubug=1
    在这里插入图片描述

  • http://localhost:8080/debug/pprof/goroutine?dubug=2
    在这里插入图片描述

2.4 采样分析

下面命令会打开一个交互页面

go tool pprof --seconds 5 http://localhost:8080/debug/pprof/profile

常用命令

  • top n n不写默认显示10个占用CPU时间最多的函数
  • top -cum 将数据累计查看各个函数CPU占用
  • tree 树形结构查看goroutine情况。
  • list 方法名 查看方法名里面具体调用耗时时长。
  • web 生成SVG函数调用图(需安装graphviz
  • exit 退出分析

打开pprof可视化页面,与上面 可交互页面中web命令效果一样

go tool pprof -http=:8080 http://localhost:8080/debug/pprof/profile?seconds=60

在这里插入图片描述

其他参数

  • -inuse_space: 分析程序常驻内存的占用情况
  • -alloc_objects:分析内存的临时分配情况
go tool pprof -inuse_space http://localhost:8080/debug/pprof/heap

go tool pprof -alloc_space http://localhost:8080/debug/pprof/heap

2.5 生成火焰图

进行 5 秒钟的 CPU 性能采样并生成火焰图

go-torch --seconds 5 http://localhost:8080/debug/pprof/profile

命令执行完会在该目录下生成一个torch.svg文件,可用浏览器打开查看火焰图

2.6 链路追踪分析

curl http://localhost:8080/debug/pprof/trace?seconds=30 > trace.out

go tool trace trace.out

上面会打开一个Web页面,我们点击View trace可以看到整个链路追踪页面。
W可以将时间线放大,S 将时间线缩小

  • Goroutine analysis 查看每个方法的Goroutine数量
  • Network blocking profile 查看IO阻塞情况
  • Synchronization blocking profile 查看系统同步阻塞情况
  • Syscall blocking profile 查看系统调用阻塞情况
  • Scheduler latency profile 查看系统调度阻塞情况

如果只想针对某个方法进行分析可以在方法内第一行加上下面代码

f, err := os.Create("trace.out")
if err != nil {
    panic(err)
}
defer f.Close()

err = trace.Start(f)
if err != nil {
    panic(err)
}
defer trace.Stop()

常用解释

名称含义
Execution Time执行时间
Network Wait Time网络等待时间
Sync Block Time同步阻塞时间
Blocking Syscall Time调用阻塞时间
Scheduler Wait Time调度等待时间
GC SweepingGC 清扫
GC PauseGC 暂停

2.7 打点对比分析

下文以 goroutine为列,想比较 内存的话,可把url后缀改成 heap

打第一个时间点

go tool pprof http://localhost:8080/debug/pprof/goroutine

等待一会,再打第二个时间点

go tool pprof http://localhost:8080/debug/pprof/goroutine

会生成两个采样文件 pprof.goroutine.001.pb.gz pprof.goroutine.002.pb.gz

对比分析

go tool pprof -base pprof.goroutine.001.pb.gz pprof.goroutine.002.pb.gz

会和之前一样出现一个命令行交互界面,不同的是这个里面的信息是两者的差异比较。我们通过 top
查看两者差异goroutine最大之处是在哪里,然后通过 traces 查看栈调用信息,
也可以通过 list 方法名 查看某个方法具体哪一行出了问题

3. Go压力测试分析

1.生成 pprof.cpu文件

go test -bench . -benchmem -cpuprofile pprof.cpu

2.分析pprof.cpu文件

go tool pprof pprof.cpu

3.使用ab压测

ab -n 200 -c 20 -p data.txt http://localhost:8082/hello 
  • -n 一共请求多少次
  • -c 每次请求多少个

完整代码:

pprof/gc/main.go

package main

import (
	"fmt"
	"log"
	"runtime"
	"time"
)

// 查看当前程序内存分配情况
func readMemStats() {
	var ms runtime.MemStats
	runtime.ReadMemStats(&ms)
	fmt.Printf("Alloc:%d(bytes) HeapIdle:%d(bytes) HeapReleased:%d(bytes) \n", ms.Alloc, ms.HeapIdle, ms.HeapReleased)
}

func main() {
	readMemStats()

	arrays := make([]int, 8)
	for i := 0; i < 32*1000*1000; i++ {
		arrays = append(arrays, i)
		if i == 16*1000*1000 {
			readMemStats()
		}
	}
	readMemStats()

	log.Println(" ===> [start gc]")
	runtime.GC() //强制调用gc回收

	log.Println(" ===> [gc Done].")
	readMemStats()

	time.Sleep(3 * time.Second)
}

pprof/main.go

package main

import (
	"fmt"
	"github.com/charmbracelet/lipgloss"
	_ "net/http/pprof"
)

var style = lipgloss.NewStyle().Bold(false).Foreground(lipgloss.Color("#FAFAFA")).Background(lipgloss.Color("#7D56F4")).PaddingTop(2).PaddingLeft(4).Width(22)

func main() {
	fmt.Println(style.Render("Hello, kitty."))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot vue 开源 会员收银系统 (5) 分类及商品模块开发

前言 完整版演示 前面我们对会员系统 门店模块开发的开发 完成了门店的基础管理 并与会员相关联 下面我们将开发门店的分类及商品管理 我们分析以下几个重点 分类可以随时禁用不用单独下架某个商品便于管理商品添加应该有图片上传商品设置会员价和散客价便于营销商品应该参与…

【工具分享】Annabelle勒索病毒解密工具

前言 Annabelle勒索病毒灵感来自恐怖电影系列 Annabelle。除了文件加密功能外&#xff0c;Annabelle 勒索软件还会试图禁用防火墙&#xff0c;强制停止一系列正在运行程序&#xff0c;通过连接的 USB 驱动器进行传播。 特征 勒索内容&#xff1a; Annabelle 使用 AES256 CBC 加…

喜讯!宝兰德斩获2024数字中国创新大赛·信创赛道全国总决赛三等奖

5月24日&#xff0c;由国家发展和改革委员会、国家数据局、国家互联网信息办公室、科学技术部、国务院国有资产监督管理委员会和福建省人民政府共同主办的2024数字中国创新大赛信创赛道全国总决赛颁奖典礼暨闭幕式大会在福州海峡国际会展中心圆满落幕。依托专业技术研发能力及丰…

IP地址在广告行业中的重要地位

新时代&#xff0c;广告已经成为了企业推广产品的必要手段&#xff0c;而企业想要广告效果好&#xff0c;就要做到精准投放营销广告&#xff0c;将“花钱”的广告精准送到产品的受众用户面前&#xff0c;让收益大于花销&#xff0c;而归根究底就是广告转化率与回报率是否达到预…

SwiftUI中TabView的基本用法及外观样式设置

TabView提供了一个交互式界面&#xff0c;允许用户在其内部的子界面间自由的切换&#xff0c;TabView有两种显示模式&#xff0c;一个是DefaultTabViewStyle&#xff0c;另一个是PageTabViewStyle&#xff0c;本文将对DefaultTabViewStyle这种类型的基本使用和外观样式设置进行…

Android消息机制回顾(Handler、Looper、MessageQueue源码解析)

回顾&#xff1a; Android消息机制 Android消息机制主要指的是Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作机制。 介绍 通过Handler 消息机制来解决线程之间通信问题&#xff0c;或者用来切换线程。特别是在更新UI界面时&#xff0c;确保了线程间的数…

Swift使用JSONDecoder处理json数据,实现json序列化和反序列化

Json数据处理是开发中不可获取的一项技能&#xff0c;如果你不会处理json数据&#xff0c;那你离失业就不远了&#xff0c;所以学完了swift基础教程&#xff0c;还是先老老实实学习一下json处理吧&#xff0c;有了这项技能&#xff0c;你才可以继续下一个网络请求阶段的开发&am…

C++第二十弹---深入理解STL中vector的使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、vector的介绍 2、vector的使用 2.1、构造函数和赋值重载 2.1.1、构造函数的介绍 2.1.2、代码演示 2.2、容量操作 2.3、遍历 2.4、增删…

类和对象(上)【有关类的全面学习】【this指针的学习】

类和对象&#xff08;上&#xff09; 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C语言注重过程&#xff1a; C是基于面向对象的&#xff0c;关注的是对象&#xff0…

如何获取某个城市或区域的人口分布数据?

人口分布数据在多个领域都扮演着至关重要的角色。这些数据不仅反映了一个国家或地区的人口分布状况&#xff0c;而且为政策制定者、企业决策者和研究者提供了宝贵的信息。那么&#xff0c;我们如何获取这些重要的人口分布数据呢&#xff1f; 政府统计部门是最主要的来源。各国政…

绝缘鞋计量校准周期多长时间合适?校验检测方法是什么?

绝缘鞋的计量校准&#xff0c;通常是应用在电学相关领域&#xff0c;因此也是属于计量校准机构中的电学室管辖的范围&#xff0c;而绝缘鞋为了安全防护&#xff0c;也是采用了绝缘材料&#xff0c;其标准要求耐电压至少在15KV以下&#xff0c;可应用于工频&#xff08;50到60F&…

git 检查用户是否是gitlab用户

背景: 公司代码要从老的git库迁到新的git库&#xff0c;老git库上部分提交用户在新git库上没有&#xff0c;解决方法: 让gitlab不再检查提交用户是否是gitlab用户。具体操作: 去掉下面的勾选&#xff0c;保存配置即可。

天气的雪碧图标(晴天,雨天,雪天,阴天,雾天,多云等)(2024-05-27)

天气的预览图标&#xff0c;可以自行下载&#xff0c;或者在资源中下载高清的

Matlab进阶绘图第57期—带填充纹理的横向柱状图

带填充纹理的横向柱状图是通过在原始横向柱状图的基础上添加不同的纹理得到的&#xff0c;可以很好地解决由于颜色区分不足而导致的对象识别困难问题。 由于Matlab中未提供纹理填充选项&#xff0c;因此需要大家自行设法解决。 本文使用Kesh Ikuma制作的hatchfill2工具&#…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

屎山代码SSM转换Springboot

SSM项目转Springboot项目 最近很多人可能是在网上买的那种屎山代码&#xff0c;数据库都是拼音的那种 比如项目如下所示&#xff1a; 这种屎山代码我改过太多了&#xff0c;很多人可能无从下手&#xff0c;因为代码结构太混乱了&#xff0c;但是我改过太多这种代码&#xff0…

【SpeedAI科研小助手】2分钟解决知网维普AIGC检测

2分钟搞定AIGC率&#xff1f;还能降到0%&#xff1f; 使用方法&#xff1a; 打开SpeedAI科研小助手&#xff0c;将功能模式换成降AIGC率&#xff0c;后面可以一段一段自己改&#xff0c;也可以直接上传论文文件&#xff0c;SpeedAI直接帮你全文修改&#xff08;主打一个用户友…