pprof对go的性能监控

写一段代码测试

首先写一个demo:

package main

import (
	"bytes"
	"io/ioutil"
	"log"
	"math/rand"
	"net/http"
	_ "net/http/pprof"
)

func main() {
	http.HandleFunc("/test", handler)
	log.Fatal(http.ListenAndServe(":9997", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
	err := r.ParseForm()
	if nil != err {
		w.Write([]byte(err.Error()))
		return
	}
	log.Println(r.Form)
	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
}

里面负责2件事:

doSomeThingOne

genSomeBytes

运行起来,执行 go run pprof_t.go

使用wrk压测

新开启一个terminal窗口,执行:./wrk -c400 -t8 -d5m http://localhost:9997/test

(上面pprof_t.go里面监听的是port :9997)

参数说明:-c400means we have 400 connections to keep open

-t8means we use 8 threads to build requests

-d5mmeans the duration of the test will last for 5 minutes

观看结果

image.png

然后用命令进入:go tool pprof http://localhost:9997/debug/pprof/profile
交互:top 10
image.png

但是很不直观对不对

所以我们安装Graphviz 在mac下

brew install graphviz

之后再这个(pprof)里面输入web
image.png
会生产一个svg文件

用右键快速打开我们就会看到
image.png

直观图解

image.png

分析

该server在main.doSomeThingOne函数上花费了81.45秒中的74.01秒。如果我们可以优化它使其运行更快,这将是向前迈出的一大步。

所以让我们看看代码,看看到底该函数计算的功能是什么。

func doSomeThingOne(times int) {
  for i := 0; i < times; i++ {
    for j := 0; j < times; j++ {

    }
  }
}

这样,便知道了性能瓶颈和待优化的点了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值