pprof在http服务的使用¶
使用前准备¶
编译运行:
$ go build -o pprof_http pprof_http.go
$ ./pprof_http
模拟请求:
$ wrk -c 400 -t 8 -d 3m http://localhost:9876/test
CPU 的占用分析使用¶
打开 http://localhost:9876/debug/pprof:
 
$ wget http://localhost:9876/debug/pprof/profile
$ go tool pprof pprof_http profile
(pprof) top 5
Showing nodes accounting for 4.93mins, 97.46% of 5.06mins total
Dropped 180 nodes (cum <= 0.03mins)
Showing top 5 nodes out of 42
      flat  flat%   sum%        cum   cum%
  4.64mins 91.69% 91.69%   4.64mins 91.69%  main.doSomeThingOne
  0.11mins  2.16% 93.85%   0.11mins  2.16%  runtime.usleep
  0.09mins  1.83% 95.68%   0.09mins  1.84%  runtime.newstack
  0.08mins  1.52% 97.19%   0.08mins  1.52%  runtime.pthread_cond_signal
  0.01mins  0.27% 97.46%   0.14mins  2.68%  math/rand.(*Rand).Int31n
(pprof) web   // 打开本篇最后的效果图
内存快照的占用分析¶
$ wget http://localhost:9876/debug/pprof/heap
$ go tool pprof pprof_http heap
(pprof)
源码¶
package main
import (
  "bytes"
  "io/ioutil"
  "log"
  "math/rand"
  "net/http"
  _ "net/http/pprof"
)
func main() {
  http.HandleFunc("/test", handler)
  log.Fatal(http.ListenAndServe(":9876", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
  err := r.ParseForm()
  if nil != err {
    w.Write([]byte(err.Error()))
    return
  }
  doSomeThingOne(10000)
  buff := genSomeBytes()
  b, err := ioutil.ReadAll(buff)
  if nil != err {
    w.Write([]byte(err.Error()))
    return
  }
  w.Write(b)
}
func doSomeThingOne(times int) {
  for i := 0; i < times; i++ {
    for j := 0; j < times; j++ {
    }
  }
}
func genSomeBytes() *bytes.Buffer {
  var buff bytes.Buffer
  for i := 1; i < 20000; i++ {
    buff.Write([]byte{'0' + byte(rand.Intn(10))})
  }
  return &buff
}





