1、memory profile方式查看
查看内存消耗位置
代码添加:
import _ "net/http/pprof"
func main() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
}
运行:
go tool pprof http://localhost:6060/debug/pprof/heap
使用top命令:
官方使用方式:
https://blog.golang.org/profiling-go-programs
2、观察gorountine
是否gorountine没有回收一直增长
代码添加:
// goroutine stats and pprof
go func() {
http.HandleFunc("/goroutines", func(w http.ResponseWriter, r *http.Request) {
num := strconv.FormatInt(int64(runtime.NumGoroutine()), 10)
w.Write([]byte(num))
});
http.ListenAndServe("localhost:6060", nil)
glog.Info("goroutine stats and pprof listen on 6060")
}()
使用命令:
curl localhost:6060/goroutines
3、结论:
从整体内存使用状态来看主要是zk连接使用内存没有回收
4、排查死锁
代码添加
import _ "net/http/pprof"
func main() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
}
查看详细goroutine状态