golang在自定义的https服务器中启用pprof接口

以下所有观点都是个人愚见,有不同建议或补充的的欢迎emial, aboutme
原文章地址

pprof的简介

pprof是golang标准库里面的其中一个库,它通过其HTTP服务器得到运行时的分析数据,从而给pprof可视化工具提供数据分析来源。它可以用来分析性能消耗,分析内存泄漏,死锁等。
具体使用可以了解官方包pprof,那我如何在http中使用pprof?如何在已有http或者https服务上使用pprof呢? 这些答案在标准库找不到,随在此记录一下。

如何启动pprof

在官方包中已经给出了例子:

package main

import  "net/http"
import _ "net/http/pprof"  //  初始化pprof

func main() {
    // do something
    ...

    go func() {
	    log.Println(http.ListenAndServe("localhost:6060", nil)) //启动http服务器
    }()
}

启动完后,就可以使用go自动的工具go tool pprof
如:

go tool pprof http://localhost:6060/debug/pprof/heap    // 获取堆的相关数据
go tool pprof http://localhost:6060/debug/pprof/profile // 获取30s内cpu的相关数据
go tool pprof http://localhost:6060/debug/pprof/block   // 在你程序调用 runtime.SetBlockProfileRate ,查看goroutine阻塞的相关数据
go tool pprof http://localhost:6060/debug/pprof/mutex   // 在你程序调用 runtime.SetMutexProfileFraction,查看谁占用mutex

为什么我自定义mux的http服务不能用?

启动自定义mux的http服务器

package main

import (
	"net/http"
	_ "net/http/pprof"
)

func main() {
	// 启动一个自定义mux的http服务器

	mux := http.NewServeMux()
	mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("hello"))
	})

	http.ListenAndServe(":6060", mux)
}

得到结果: 404 Not Found

go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
http://localhost:6060/debug/pprof/heap: server response: 404 Not Found
failed to fetch any source profiles

为什么程序导入了_ "net/http/pprof"还是会404呢?因为导入pprof的时侯只是调用了pprof包的init函数,看看init里面的内容,pprof.init(),可以得知,这里注册的所有路由都是在DefaultServeMux下的, 所以当然我们自定义的mux是没有用的,要使它有用也很简单,我们自己手动注册路由与相应的处理函数。

package main

import (
	"net/http"
	"net/http/pprof"
)

func main() {
	// 启动一个自定义mux的http服务器
	mux := http.NewServeMux()
	mux.HandleFunc("/debug/pprof/", pprof.Index)
	mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
	mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
	mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
	mux.HandleFunc("/debug/pprof/trace", pprof.Trace)

	mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("hello"))
	})

	http.ListenAndServe(":6066", mux)
}

这样,线上的服务出现问题时,就可以用pprof工具看看,是否有异常。

pprof如何在https中使用?

go tool pprof https+insecure://localhost:8001/debug/pprof/heap将原来的http替换成https+insecure即可。

注意:go的版本要>=go1.8,具体查看go1.8的release信息tip.golang.org/doc/go1.8#t…

    原文作者:小蜜蜂
    原文地址: https://juejin.im/entry/5b0636d2f265da0db251423e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞