2016-03-08 113 views
1

我已經構建了一個web服務器並且做了一個ab(apache benchmark)測試。現在我想知道每個部分的計算時間。Golang:如何在web服務器中使用pprof獲得計算時間

我使用了go tool pprof url:port/xxx並得到了這個程序的配置文件,但它並沒有告訴我計算時間(只有內存)。以下是結果:

(pprof) top10 
1827.59MB of 1978.12MB total (92.39%) 
Dropped 175 nodes (cum <= 9.89MB) 
Showing top 10 nodes out of 48 (cum >= 43.50MB) 
    flat flat% sum%  cum cum% 
    769.54MB 38.90% 38.90% 769.54MB 38.90% reflect.unsafe_New 
    459.08MB 23.21% 62.11% 459.08MB 23.21% services/semanticnew.TopicProbCounter.Update 
    189.17MB 9.56% 71.67% 1081.21MB 54.66% github.com/golang/protobuf/proto.(*Buffer).dec_slice_struct 
    122MB 6.17% 77.84%  122MB 6.17% github.com/golang/protobuf/proto.(*Buffer).dec_int32 
    107.56MB 5.44% 83.28% 107.56MB 5.44% github.com/garyburd/redigo/redis.(*conn).readReply 
    68.13MB 3.44% 86.72% 527.21MB 26.65% services/semanticnew.caculApPoiScore 

    40.51MB 2.05% 88.77% 40.51MB 2.05% runtime.malg 
    28.59MB 1.45% 90.22% 28.59MB 1.45% net/http.newBufioWriterSize 
    22.50MB 1.14% 91.35%  23MB 1.16% redismanage.(*Manager).getRequest 
    20.50MB 1.04% 92.39% 43.50MB 2.20% redismanage.(*Manager).GetRequest 

在我的web程序中,我已經添加以下代碼:

f, _ := os.Create("x.cpuprofile") 
pprof.StartCPUProfile(f) 
defer pprof.StopCPUProfile() 

,但它仍然無法正常工作。

我檢查了http://blog.golang.org/profiling-go-programs,但是xxx.prof文件讓我困惑。我怎樣才能生成這個xxx.prof文件?作者使用go tool pprof xxx xxx.prof,這是否意味着xxx是由xxx.go生成的二進制文件?

無論如何,目標是獲得計算時間,但如何?我是否必須生成此xxx.prof文件才能實現此目標?

非常感謝

+0

備註:不要使用'ab',它不好,不能跟上基本的go服務器。 CPU配置文件不具體測量「計算時間」。 pprof是一個採樣分析器,您正在對採樣進行計數。 – JimB

+0

另外,您在第二個示例中創建了'xxx.prof'文件,但將其命名爲'x.cpuprofile' – JimB

回答

1

我使用梅德的意見,從這裏取得了成功:https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs

你只需要導入淨/ HTTP/pprof,並收集型材:

$走tool pprof --text mybin http://myserver:6060:/debug/pprof/profile

net/http/pprof僅爲其副作用導入S,所以你可以使用

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

除了「mybin」和「MYSERVER」你還需要替​​換端口號和端口號後刪除尾隨冒號。 例如我的寵物項目,該命令是

go tool pprof http://127.0.0.1:8000/debug/pprof/profile 

然後你會得到創建pprof存檔,您可以通過pprof交互方式探索,也可以使用外部工具 - 我個人更喜歡的內置功能。

請注意,https://github.com/golang/go/issues/13841https://github.com/golang/go/issues/6047是pprof和一些內核組合存在的問題。