1 场景:无缓冲channel写阻塞
package main
import (
"log"
"net/http"
_ "net/http/pprof"
"time"
"github.com/gin-gonic/gin"
)
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// 你的程序逻辑...
g := gin.Default()
g.GET("/hello", func(ctx *gin.Context) {
ch := make(chan bool)
go func() {
time.Sleep(2 * time.Second)
ch <- true
}()
select {
case <-ch:
break
case <-time.After(time.Second):
break
}
ctx.JSON(200, map[string]interface{}{
"success": true,
})
})
g.Run("127.0.0.1:8080")
}
2 排查和定位思路
2.1 操作系统内存泄漏
2.2 Golang pprof
stack和数量check匹配
2.3 协程数监控
在Golang中,可以使用runtime包的函数来监控和获取Goroutines的相关信息,如:
runtime.NumGoroutine():获取当前系统中的Goroutines数量
runtime.Gosched():主动让出CPU,让其他Goroutine运行
runtime.GOMAXPROCS():设置同时运行的最大CPU数量
参考
1 Go 项目中的 Goroutine 泄露及其防范措施
2 案例篇:内存泄漏了,我该如何定位和处理?
3 golang并发编程实践之goroutines的监控与调试技巧