Golang

cc 发布于2019年10月26日 ∣ golang ∣ 约1061字 · 需3分钟 阅读()

golang性能分析profiling,内置了两个采集工具

  1. runtime/pprof
  2. 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主要是从时间的角度去看各种协程自身调用