96SEO 2026-02-23 12:21 1
pprof命令项目调优分析修改main.go安装go-wrk命令行交互界面图形化火焰图

性能优化的前提是满足正确可靠、简洁清晰等质量因素性能优化是综合评估有时候时间效率和空间效率可能对立针对Go语言特性介绍Go相关的性能优化建议
性能表现需要实际数据衡量Go语言提供了支持基准性能测试的benchmark工具。
*testing.B。
和普通的单元测试用例很像单元测试函数名以
型号和时钟频率。
PASS这行表示所有的测试包括基准测试都已成功通过。
ok
1.454s这行显示所有测试包括基准测试的整体执行时间。
在这种情况下整个测试套件执行时间大约为
是测试函数名-16表示GOMAXPROCS的值为16GOMAXPROCS
3.164s可以看到预分配内存后性能更好。
因此应尽可能在使用make()初始化切片时提供容量信息。
当我们在已有切片基础上创建新的切片时新切片并不会创建一个新的底层数组。
相反它会共享同一个底层数组。
这种情况下如果我们从一个大切片中截取出一个小切片并且在代码中保留对大切片的引用那么原底层数组将会一直存在于内存中得不到释放即使大切片的内容对我们来说已经不再需要了。
假设有一个名为bigSlice的大切片其底层数组非常大。
然后我们基于bigSlice创建一个新的小切片smallSlice并且在代码中保留对bigSlice的引用。
这样一来即使我们只使用smallSlice底层数组也不会被释放导致占用大量的内存。
为了避免上述陷阱我们可以使用copy操作来创建一个新的切片而不是在已有切片基础上使用re-slice。
copy操作会将源切片的内容复制到一个新的底层数组中这样就不会和原始切片共享底层数组避免了底层数组无法释放的问题。
使用re-slicesmallSlice和bigSlice共享同一个底层数组
bigSlice[:100])通过使用copy操作我们可以避免因为底层数组无法释放而导致的内存浪费问题。
不断向map中添加元素的操作会触发map的扩容提前分配好空间可以减少内存拷贝和Rehash的消耗。
建议根据实际需求提前预估好需要的空间
{builder.WriteString(str)}return
{builder.WriteString(str)}return
6.457s使用拼接性能最差strings.Builderbytes.Buffer相近strings.Builder更快字符串在Go语言中是不可变类型占用内存大小是固定的使用每次都会重新分配内存strings.Builder
bytes.Buffer底层都是[]byte数组。
内存扩容策略不需要每次拼接重新分配内存预分配内存后strings.Builder
空结构体struct{}实例不占据任何的内存空间可作为各种场景下的占位符使用节省资源空结构体本身具备很强的语义即这里不需要任何值仅作为占位符
锁的实现是通过操作系统来实现属于系统调用atomic操作是通过硬件实现效率比锁高sync.Mutex应该用来保护一段逻辑不仅仅用于保护一个变量对于非数值操作可以使用atomic.Value能承载一个interface{}
避免常见的性能陷阱可以保证大部分程序的性能普通应用代码不要一味地追求程序的性能越高级的性能优化手段越容易出现问题在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能
不在运行状态的情况可以用来分析和查找死锁等性能瓶颈Goroutine
runtime/pprof采集工具型应用运行数据进行分析net/http/pprof采集服务型应用运行时数据进行分析
pprof开启后每隔一段时间10ms就会收集下当前的堆栈信息获取各个函数占用的CPU以及内存资源最后通过对这些采样数据进行分析形成一个性能分析报告。
如果使用了默认的http.DefaultServeMux通常是代码直接使用
http.ListenAndServe(“0.0.0.0:8000”,
server端代码中按如下方式导入net/http/pprof
r.HandleFunc(/debug/pprof/cmdline,
r.HandleFunc(/debug/pprof/profile,
r.HandleFunc(/debug/pprof/symbol,
r.HandleFunc(/debug/pprof/trace,
pprof.Trace)如果你使用的是gin框架那么推荐使用github.com/gin-contrib/pprof在代码中通过以下命令注册pprof相关路由。
服务都会多出http://host:port/debug/pprof
/debug/pprof/profile访问这个链接会自动进行
不管是工具型应用还是服务型应用我们使用相应的pprof库获取数据之后下一步的都要对这些数据进行分析我们可以使用go
数据是动态的要想获得有效的数据请保证应用处于较大的负载比如正在生成中运行的服务或者通过其他工具模拟访问压力。
否则如果应用处于空闲状态得到的结果可能没有任何意义。
本案例使用了blob项目——类似博客的管理系统用beego实现源码我已经放到了github仓库里https://github.com/uestc-wxy/blob里面也有详细的使用说明。
为了能对这个项目进行调优分析需要在main.go文件里添加几行代码
{http.ListenAndServe(localhost:8080,
nil)}()下面是修改后的main.go只需要修改这一个文件
blob/routersblob/utilsfmtgithub.com/beego/beego/v2/client/ormgithub.com/beego/beego/v2/server/web_
github.com/go-sql-driver/mysqlnet/http_
web.AppConfig.String(username)password,
web.AppConfig.String(password)host,
web.AppConfig.String(host)port,
web.AppConfig.String(port)database,
web.AppConfig.String(database)datasource
fmt.Sprintf(%s:%stcp(%s:%s)/%s?charsetutf8mb4locLocal,
{web.InsertFilter(/cms/index/*,
utils.CmsLoginFilter)orm.RunCommand()go
{http.ListenAndServe(localhost:8080,
https://github.com/adjust/go-wrk由于我是Windows系统于是选择了后者因为前者对Windows并不是很友好虽然它的star数还要多些。
在GOPATH/src路径终端依次运行下列命令注意是GOPATH/src
https://github.com/adjust/go-wrk.git
build这时你会发现go-wrk项目里会多出go-wrk.exe文件为了方便使用我选择把它放在也就是复制粘贴过去GOPATH/bin目录下当然你得把GOPATH/bin放在环境变量里面至于为什么将go-wrk.exe放在$GOPATH/bin
http://localhost:8080/执行上面的代码会进入交互界面如下
F:\GolandProjects\beegoProject\blob
http://127.0.0.1:8080/debug/pprof/profile执行上面的代码会进入交互界面如下
F:\GolandProjects\beegoProject\blob
http://127.0.0.1:8080/debug/pprof/profile
http://127.0.0.1:8080/debug/pprof/profile
C:\Users\19393\pprof\pprof.blob.exe.samples.cpu.004.pb.gz
F:\GolandProjects\beegoProject\blob\blob.exe2023-08-01
(pprof)我们可以在交互界面输入top5来查看程序中占用CPU前5位的函数
flat当前函数占用CPU的耗时flat:当前函数占用CPU的耗时百分比sun%函数占用CPU的耗时累计百分比cum当前函数加上调用当前函数的函数占用CPU的总耗时cum%当前函数加上调用当前函数的函数占用CPU的总耗时百分比最后一列函数名称
我们发现上面并没有我们自己写的函数所以本项目的性能还是不错的。
在大多数的情况下我们可以通过分析这五列得出一个应用程序的运行情况并对程序进行优化。
F:\Users\19393\sdk\go1.20.4\src\runtime\cgocall.go21.96s
racereleasemerge(unsafe.Pointer(racecgosync))
raceacquire(unsafe.Pointer(racecgosync))通过分析发现大部分CPU资源被157行占用耗时21.94s。
或者可以直接输入web通过svg图的方式查看程序中详细的CPU占用情况。
想要查看图形化的界面首先需要安装graphviz图形化工具。
由于我是Windows系统进入官网下载graphvizhttps://graphviz.gitlab.io/download/
这里勾选第二个自动帮你配置环境变量。
后面快捷方式我选择不创建。
svg输入web前确认graphviz安装目录下的bin文件夹有无被添加到Path环境变量我添加的系统变量中。
先保证自己的beego项目运行在本地上再开一个终端跑压测go-wrk
http://localhost:8080/另外再来一个和终端跑pprof执行命令go
http://127.0.0.1:8080/debug/pprof/profile。
F:\GolandProjects\beegoProject\blob
http://127.0.0.1:8080/debug/pprof/profile
http://127.0.0.1:8080/debug/pprof/profile
C:\Users\19393\pprof\pprof.blob.exe.samples.cpu.008.pb.gz
F:\GolandProjects\beegoProject\blob\blob.exe2023-08-01
(pprof)由于输入了web命令浏览器会自动弹出查看svg的页面
方框中的第一行数字表示当前函数占用CPU的百分比第二行数字表示当前函数累计占用CPU的百分比。
除了分析CPU性能数据pprof也支持分析内存性能数据。
比如使用下面的命令分析http服务的heap性能数据查看当前程序的内存占用以及热点内存对象使用的情况。
http://127.0.0.1:8080/debug/pprof/heap
http://127.0.0.1:8080/debug/pprof/heap
http://127.0.0.1:8080/debug/pprof/heap
http://127.0.0.1:8080/debug/pprof/heap以下是查看内存占用数据的示例
http://localhost:8080/项目根目录新开一个终端运行go
http://127.0.0.1:8080/debug/pprof/profile30s后浏览器会自动跳出新界面http://localhost:5200/ui/如下
跟之前的图形化界面差不多接下来点击下图中图示任一个便能看到火焰图。
火焰图的调用顺序从上到下每个方块代表一个函数它下面一层表示这个函数会调用哪些函数方块的大小代表了占用
使用的长短。
火焰图的配色并没有特殊的意义默认的红、黄配色是为了更像火焰而已。
火焰图的y轴表示cpu调用方法的先后x轴表示在每个采样调用时间内方法所占的时间百分比越宽代表占据cpu时间越多。
通过火焰图我们就可以更清楚的找出耗时长的函数调用然后不断的修正代码重新采样不断优化。
http://127.0.0.1:8080/debug/pprof/heap
http://127.0.0.1:8080/debug/pprof/heap
http://127.0.0.1:8080/debug/pprof/heap
http://127.0.0.1:8080/debug/pprof/heap内存性能火焰图示例
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback