Golang
golang性能分析profiling,内置了两个采集工具
- runtime/pprof
- net/http/pprof 针对网络应用
直接采样 go tool pprof http://localhost:8005/debug/pprof/heap http://localhost:8005/debug/pprof/trace?seconds=30 下载trace go tool trace xxx, 然后可以在协程分析中查看各类协程执行/网络/同步阻塞/系统调用阻塞/调度/GC等的时间分配
火焰图能够直观的看出哪些地方耗时比较多,需要优化,无论是go python还是其他语言中都值得引入使用
除了使用go tool pprof还可以使用独立的pprof go get -u github.com/google/pprof,独立的功能略多一点
运行 pprof -http=:8080 profile
1go test -bench . -cpuprofile=cpu -memprofile=mem #分析分别存到cpu和mem文件中
Defer没有明说的问题
1func f1() (i int) {
2 defer func() { i++ }()
3 return 0
4}
5
6func f2() (r int) {
7 i := 5
8 defer func() { i = i+5 }()
9 return i
10}
11
12func f3() (r int) {
13 defer func(r int) { r = r+5 }(r)
14 return 1
15}
16
17type Tes struct{}
18
19func(t *Tes)Do(i int, x ...int)*Tes{
20 fmt.Println(i)
21 return t
22}
23func calc(i int)int{
24 fmt.Println(i)
25 return i
26}
27var t = Tes{}
28
29func main() {
30 defer t.Do(1).Do(2).Do(3, calc(4))
31 fmt.Println(5)
32}
33
34// f1 返回1
35// f2 返回5
36// f3 返回1
37// main输出顺序 12453
如果是链式函数调用会执行到最后一次调用,同时把调用的参数准备好入栈,也就是说如果参数也是函数的话会把函数执行完
return在汇编中(赋值指令+[调用defer]+RET指令)
Error wrap
go1.13增强了error处理,使用fmt.Errorf(“新的错误消息+原来的:%w”, err)
wrappedErr层层传递错误
errors添加了三个工具Unwrap, Is, As。
Unwrap返回被嵌套的err,
Is判断错误中是否包含某个特殊错误,不取出来用
As判断是否包含某个特殊错误,并取出来用
周期运行
for range 可以直接组合使用
1for range time.Tick(2*time.Second){
2 fmt.Println("xx-")
3}
go tool objdump
build参数-gcflags
百万GO TCP思考https://colobu.com/2019/02/23/1m-go-tcp-connection/
单机百万连接https://www.cnblogs.com/gskFuture/p/13556291.html
端口可用范围1024到65535,为了client能多建链接,单网多IP,实现超过6w文件的限制,服务端只一个端口不影响连接数
下面的代码片断关注的几个点,最后结果行与i打印的顺序,i打印的值,设置runtime.GOMAXPROCS(1)后i打印的值
1func main(){
2 //runtime.GOMAXPROCS(1)
3 var sum,total int
4 for i:=0;i<=10;i++{
5 sum += i
6 go func(){
7 total += i
8 fmt.Println(i)
9 }()
10 }
11
12 fmt.Println("sum:", sum,"total:", total)
13
14 time.Sleep(1e9)
15}
如何限制多核仍然多协程同步执行, 1.14之后抢占式调度20ms会切换
runtime.GOMAXPROCS(1)即限制了CPU数量又限制了并发数量
go代码分析工具
pprof主要是从方法的角度去看cpu调用情况内存分配情况
trace主要是从时间的角度去看各种协程自身调用