Upgrade to Pro — share decks privately, control downloads, hide ads and more …

You, latency and profiling @ GolangUK 2017

You, latency and profiling @ GolangUK 2017

Filippo Valsorda

August 17, 2017
Tweet

More Decks by Filippo Valsorda

Other Decks in Programming

Transcript

  1. A fast database… … can store many GB per second

    … or replies to queries in a few ms
  2. A fast API… … can handle many clients … or

    answers in a few milliseconds
  3. Running on CPU I/O I/O I/O I/O h>p.Handler 1 h>p.Handler

    2 h>p.Handler 3 h>p.Handler 4 CPU profiling
  4. func Write(data []byte) { for i := 0; i <

    50; i++ { tmpfile, _ := ioutil.TempFile("", "ex") defer os.Remove(tmpfile.Name()) _, err = tmpfile.Write(data) tmpfile.Close() } } func Hash(data []byte) { for i := 0; i < 50; i++ { sha256.Sum256(data) } }
  5. $ time curl http://127.0.0.1:12345/hash-and-write
 9.831 total
 
 
 $ time

    curl http://127.0.0.1:12345/write-no-hash
 7.692 total
  6. The tracer Detailed nanosecond-level log of execuOon events: • gorouOne

    scheduling, blocking • syscalls, network, I/O • garbage collecOon
  7. go tool trace -pprof=TYPE trace.out Supported profile types are: -

    net: network blocking profile - sync: synchronization blocking profile - syscall: syscall blocking profile - sched: scheduler latency profile
  8. -pprof=syscall func Write(data []byte) { for i := 0; i

    < 50; i++ { tmpfile, _ := ioutil.TempFile("", "ex") defer os.Remove(tmpfile.Name()) _, err = tmpfile.Write(data) tmpfile.Close() } }
  9. WriIng our own profile prof := make(map[uint64]pprof.Record) for _, ev

    := range events { if ev.Type != trace.EvGoBlockNet { continue } rec := prof[ev.StkID] rec.Stk = ev.Stk rec.N++ rec.Time += ev.Link.Ts - ev.Ts prof[ev.StkID] = rec } pprof.BuildProfile(prof).Write(os.Stdout)
  10. var childG = make(map[uint64]struct{}) var lastGLen int for { for

    _, ev := range events { if ev.Type != trace.EvGoCreate { continue } if _, ok := childG[ev.G]; !ok && !filterStack(ev.Stk, re) { continue } childG[ev.Args[0]] = struct{}{} } if len(childG) == lastGLen { break } lastGLen = len(childG) }
  11. Build more tools! • Focus on gorouOne number • Aggregate

    all blocking types • VisualizaOons • …