golang用のプロファイラ&アナライザを #isucon 対策で作って使った

こんにちは。どうもこんにちは。

先週末は #isucon で惨敗した わけなんですけども、手ぶらで望んだわけではなくてかなり準備とか練習してました。

今回は golang + redis の練習をしててそれはズバリあたったわけで、練習の中で kagenui というプロファイラ&アナライザを作ったので公開しました。 isuconをかなり意識した機能がついてます。

netmarkjp/kagenui - https://github.com/netmarkjp/kagenui

大きな特徴は2つ。

  • 集計できる( @matsuuさん作)
  • 通ったパスのメモが書ける

集計できる

ひとしきり記録した後に集計関数を呼ぶと、以下の様なかんじで集計結果が取得できます。

Sort by Count
Count   Total  Mean     Stddev     Min     Max  Description
  100   24286   242     22.909     197     350  someHandler/Last Step to End
  100  144162  1441   1669.445     631   16671  someHandler/exec XXX
   50  257665  5153  27030.228     952  194161  someHandler/exec YYY

Sort by Total
Count   Total  Mean     Stddev     Min     Max  Description
   50  257665  5153  27030.228     952  194161  someHandler/exec XXX
  100  144162  1441   1669.445     631   16671  someHandler/exec YYY
  100   24286   242     22.909     197     350  someHandler/Last Step to End

Sort by Mean
Count   Total  Mean     Stddev     Min     Max  Description
   50  257665  5153  27030.228     952  194161  someHandler/exec YYY
  100  144162  1441   1669.445     631   16671  someHandler/exec XXX
  100   24286   242     22.909     197     350  someHandler/Last Step to End

Sort by Standard Deviation
Count   Total  Mean     Stddev     Min     Max  Description
   50  257665  5153  27030.228     952  194161  someHandler/exec YYY
  100  144162  1441   1669.445     631   16671  someHandler/exec XXX
  100   24286   242     22.909     197     350  someHandler/Last Step to End

Sort by Maximum(100 Percentile)
Count   Total  Mean     Stddev     Min     Max  Description
   50  257665  5153  27030.228     952  194161  someHandler/exec YYY
  100  144162  1441   1669.445     631   16671  someHandler/exec XXX
  100   24286   242     22.909     197     350  someHandler/Last Step to End

通ったパスのメモが書ける

こんな感じで、その時に通ったパスとか状態をメモで記録できます。

func SomeHandler(){
    mp := kagenui.Begin("someHandler")
    defer mp.End()

    ...

    mp.Step("exec XXX")

    ...
    if valid {
        mp.AddMemo("cache is valid")
        ...
    } else {
        mp.AddMemo("cache is invalid")
        ...
    }

    ...

    mp.Step("exec YYY")

}

集計機能であたりをつけたあと、なにがどうなったとき遅いんだろうか?とか確認するときに効果的!

メモは,区切りで追記されていくのでバンバン入れていけばokです。

log:MPexec XXX:250exec YYY:1240...description:someHandlermemo:cache is valid
log:MPexec XXX:800exec YYY:3360...description:someHandlermemo:cache is invalid
log:MPexec XXX:255exec YYY:1140...description:someHandlermemo:cache is valid

ご活用ください。

golang 

See also