<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > Go語言內置了獲取程序的運行數據的工具,包括以下兩個標準庫: ** runtime/pprof:采集工具型應用運行數據進行分析 ** net/http/pprof:采集服務型應用運行時數據進行分析 > pprof開啟后,每隔一段時間(10ms)就會收集下當前的堆棧信息,獲取各個函數占用的CPU以及內存資源;最后通過對這些采樣數據進行分析,形成一個性能分析報告 > 注意,我們只應該在性能測試的時候才在代碼中引入pprof。 [TOC] ## 工具型應用 > 如果你的應用程序是運行一段時間就結束退出類型,可以使用`runtime/pprof庫`進行測試 ### 測試程序 (test.go) ~~~ package main import ( "fmt" "os" "runtime/pprof" "time" ) // 一段有問題的代碼 func logicCode() { var c chan int for { select { case v := <-c: fmt.Printf("recv from chan, value:%v\n", v) default: } } } func main() { // CPU 性能測試 file, err := os.Create("./cpu.pprof") if err != nil { fmt.Printf("create cpu pprof failed, err:%v\n", err) return } pprof.StartCPUProfile(file) defer pprof.StopCPUProfile() for i := 0; i < 8; i++ { go logicCode() } time.Sleep(20 * time.Second) // Mem 性能測試 file2, err2 := os.Create("./mem.pprof") if err != nil { fmt.Printf("create mem pprof failed, err:%v\n", err2) return } pprof.WriteHeapProfile(file2) file.Close() } ~~~ > 程序執行后,等待30秒后會在當前目錄下生成一個`cpu.pprof`文件 ### 解析分析報告 ~~~ go tool pprof cpu.pprof ~~~ > 執行上面的代碼會進入交互界面,輸入`top3`來查看程序中占用CPU前3位的函數 ~~~ top3 ~~~ > 其中: * flat:當前函數占用CPU的耗時 * flat::當前函數占用CPU的耗時百分比 * sun%:函數占用CPU的耗時累計百分比 * cum:當前函數加上調用當前函數的函數占用CPU的總耗時 * cum%:當前函數加上調用當前函數的函數占用CPU的總耗時百分比 * 最后一列:函數名稱 > 我們還可以使用`list命令`查看具體的函數分析,例如執行`list logicCode`查看我們編寫的函數的詳細分析 ~~~ list logicCode ~~~ ### 圖形化分析報告 > 需要安裝`graphviz`工具 > 下載地址:https://graphviz.org/download/,linux安裝使用 `yum install graphviz` ~~~ go tool pprof --pdf cpu.pprof ~~~ ## 服務型應用 > 如果你的應用程序是一直運行的,比如web應用,那么可以使用`net/http/pprof庫`,它能夠在提供 HTTP 服務進行分析 ### web服務引如pprof ~~~ package main import ( "github.com/gin-contrib/pprof" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() pprof.Register(router) ... router.Run(":8080") } ~~~ ### 訪問性能測試web頁面 > 地址:http://localhost:8080/debug/pprof/ ![](https://img.kancloud.cn/e7/4c/e74cbd89194cc50d7a2171ee944c9e35_673x653.png) * /debug/pprof/profile:訪問這個鏈接會自動進行 CPU profiling,持續 30s,并生成一個文件供下載 * /debug/pprof/heap: Memory Profiling 的路徑,訪問這個鏈接會得到一個內存 Profiling 結果的文件 * /debug/pprof/block:block Profiling 的路徑 * /debug/pprof/goroutines:運行的 goroutines 列表,以及調用關系 ### 編寫測試代碼 > 路徑:/test/request_test.go ~~~ package test import ( "fmt" "io/ioutil" "net/http" "testing" ) // 向web接口請求,用于收集cpu占用情況。 func TestPprof(t *testing.T) { for i := 1; i <= 500; i++ { resp, _ := http.Get("http://localhost:8080/pro/test") defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) } } ~~~ ### 生成測試報告 > 點擊`測試web頁面`中的`profile`,進行cpu上的測試,點擊后30s后會生成測試文件,在此期間快速的模擬訪問,可執行以下腳本 ~~~ go test test/request_test.go ~~~ > 最后會生成`profile`文件供下載,將其拷貝到項目中,并進行分析報告 ### 解析分析報告 ~~~ go tool pprof profile ~~~ > 執行上面的代碼會進入交互界面,輸入`top3`來查看程序中占用CPU前3位的函數 ~~~ top3 ~~~ > 其中: * flat:當前函數占用CPU的耗時 * flat::當前函數占用CPU的耗時百分比 * sun%:函數占用CPU的耗時累計百分比 * cum:當前函數加上調用當前函數的函數占用CPU的總耗時 * cum%:當前函數加上調用當前函數的函數占用CPU的總耗時百分比 * 最后一列:函數名稱 > 我們還可以使用`list命令`查看具體的函數分析,例如執行`list logicCode`查看我們編寫的函數的詳細分析 ~~~ list logicCode ~~~ ### 圖形化分析報告 > 需要安裝`graphviz`工具 > 下載地址:https://graphviz.org/download/,linux安裝使用 `yum install graphviz` ~~~ go tool pprof --pdf profile ~~~ ![](https://img.kancloud.cn/15/a1/15a145b25115bf32fab137f2d3ae6b45_1920x4000.png) > 參考文章:https://www.liwenzhou.com/posts/Go/performance_optimisation/
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看