14.6 pprofのサポート

Go言語のとても良い設計は、標準ライブラリにコードの性能監視ツールを有することです。2つのパッケージがあります:

net/http/pprof

runtime/pprof

実はnet/http/pprofではruntime/pprofパッケージを使ってラップしているだけで、httpポートで現れるだけなのです。

beegoはpprofをサポートしています

現在beegoフレームワークはpprofを追加しています。この特徴はデフォルトで起動しません。もし性能をテストしたり、対応するgoroutineの実行といった情報を確認したりする必要があれば、Goのデフォルトパッケージ"/net/http/pprof"にはすでにこの機能があります。例えばGoのデフォルトの方法でWebを実行すれば、デフォルトで使用することができます。しかしbeegoはServHTTP関数をラップしていますので、もしデフォルトのパッケージをそのまま使っているのであればこの機能を起動することはできません。そのため、beegoの内部で改造を施し、pprofをサポートさせる必要があります。

  • まずbeego.Run関数において変数によって自動的に機能パッケージをロードするか決定します。

      if PprofOn {
          BeeApp.RegisterController(`/debug/pprof`, &ProfController{})
          BeeApp.RegisterController(`/debug/pprof/:pp([\w]+)`, &ProfController{})
      }
    
  • ProfConterllerを設計する

      package beego
    
      import (
          "net/http/pprof"
      )
    
      type ProfController struct {
          Controller
      }
    
      func (this *ProfController) Get() {
          switch this.Ctx.Params[":pp"] {
          default:
              pprof.Index(this.Ctx.ResponseWriter, this.Ctx.Request)
          case "":
              pprof.Index(this.Ctx.ResponseWriter, this.Ctx.Request)
          case "cmdline":
              pprof.Cmdline(this.Ctx.ResponseWriter, this.Ctx.Request)
          case "profile":
              pprof.Profile(this.Ctx.ResponseWriter, this.Ctx.Request)
          case "symbol":
              pprof.Symbol(this.Ctx.ResponseWriter, this.Ctx.Request)
          }
          this.Ctx.ResponseWriter.WriteHeader(200)
      }
    

使用方法

上の設計を通して、以下のようなコードによってpprofを起動することができます:

beego.PprofOn = true

次に、ブラウザで以下のURLを開くと以下のようなインターフェースが現れます:

図14.7 システムの現在のgoroutine、heap、threadの情報

goroutineをクリックすると詳細な情報を得ることができます:

図14.8 現在のgoroutineの詳細情報を表示

コマンドラインから更に多くの詳細な情報を得ることもできます

go tool pprof http://localhost:8080/debug/pprof/profile

この時、プログラムは30秒のprofile収集時間に入ります。この時間内に必死にブラウザ上のページをリロードし、なるべくcpuを専有させてデータを生成します。

(pprof) top10

Total: 3 samples

   1 33.3% 33.3% 1 33.3% MHeap_AllocLocked

   1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors

   1 33.3% 100.0% 1 33.3% runtime.sigprocmask

   0 0.0% 100.0% 1 33.3% MCentral_Grow

   0 0.0% 100.0% 2 66.7% main.Compile

   0 0.0% 100.0% 2 66.7% main.compile

   0 0.0% 100.0% 2 66.7% main.run

   0 0.0% 100.0% 1 33.3% makeslice1

   0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP

   0 0.0% 100.0% 2 66.7% net/http.(*conn).serve    

(pprof)web

図14.9 デモの実行プロセス情報

results matching ""

    No results matching ""