go小白入门 | 青训营笔记

85 阅读3分钟

青训营课程笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天,今日主要学习了性能优化方面的知识,着重学习了性能调优的实战案例。

pprof

关于性能分析主要用到的是pprof工具,当使用到几千台以上的机器时一个百分点的性能优化可以带来很大的收益。下载地址如下github.com/wolfogre/go… 需要大家提前准备好1cpu和1gb内存并且文中对pprof进行详细描述,它会极大占用内存并且没什么用~

下载完成需要注意的是检查电脑是否配置好gopath,如果已经配置好那么你可以运行下列代码:

go get -d github.com/wolfogre/go-pprof-practice
cd $GOPATH/src/github.com/wolfogre/go-pprof-practice

请直接复制避免输入的时候出现将 -d 输入错误导致下载后直接安装。

接下来需要编译一下下面这个程序并且打开任务管理器看内存是否满了(我在运行过程中由于笔记本电脑过于老旧导致出现死机情况。。。后面更换台式机才能解决问题)

package main

import (
	// 略
	_ "net/http/pprof" // 会自动注册 handler 到 http server,方便通过 http 接口获取程序运行采样报告
	// 略
)

func main() {
	// 略

	runtime.GOMAXPROCS(1) // 限制 CPU 使用数,避免过载
	runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪
	runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪

	go func() {
		// 启动一个 http server,注意 pprof 相关的 handler 已经自动注册过了
		if err := http.ListenAndServe(":6060", nil); err != nil {
			log.Fatal(err)
		}
		os.Exit(0)
	}()

	// 略
}

接下来你需要输入

go tool pprof http://localhost:6060/debug/pprof/profile

进入交互式终端再输入 list Eat 接着需要输入

func (t *Tiger) Eat() {
	log.Println(t.Name(), "eat")
	//loop := 10000000000
	//for i := 0; i < loop; i++ {
	//	// do nothing
	//}
}

来修复内存占用过大的问题。到此暂时解决的占用过大的问题,后续出现的频繁的内存回收、协程泄露、锁的争用、阻塞操作、大家可以跟着文档学习,这里就不过多赘述了。

性能调优-业务服务优化

回到课程业务服务优化需要1.建立评估手段2.分析性能数据找到问题3.优化并验证 在建立评估手段时候,要进行压测实验,压测平台可以返给一个压测结果,该结果会以图表方式呈现出来,结果中有最大承载和平均耗时等数据。性能调优需要解决的就是把后面出现抖动的部分进行优化。

其中,占用多的可以进行点击查看代码位置并尝试进行注释来解决,优化结束我们需要进行验证,考虑到优化可能会将正确的输出修改,所以需要特别注意对比优化前后的结果是否相差不大,如果相差不大则优化成功。

优化并且检测结束可以重新查看压测报告,确定优化后上传程序并且后续可以继续收集实验数据进行反馈。