GO·NOTE

一份 Go 开发工程师的学习笔记

0%

排查-goroutine-阻塞问题

阻塞时现象:cpu 利用率降低,内存使用率上升

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
"fmt"
"log"
"net/http"
_ "net/http/pprof"
"time"
)

// goroutine 阻塞时的排查方法
// 项目中首先要引进 pprof
// 通过访问 host/debug/pprof/goroutine?debug=1 即可查看出哪里的 goroutine 阻塞了
// 通过访问 host/debug/pprof/goroutine?debug=2 可以更详细的查看每个 goroutine 的信息

var c = make(chan int)

func main() {

// 模拟 goroutine 阻塞
go func() {
for range time.Tick(time.Microsecond*100){
c <- time.Now().Second()
}
}()

for i := 0; i < 100; i++ {
go func() {
for {
fmt.Println(<-c)
}
}()
}

// 多次访问 /ping 模拟阻塞的 goroutine
http.HandleFunc("/ping", func(writer http.ResponseWriter, request *http.Request) {
select {}
})

log.Fatal(http.ListenAndServe(":8080",nil))
}