Skip to content

Latest commit

Β 

History

History
72 lines (58 loc) Β· 3.93 KB

profile.md

File metadata and controls

72 lines (58 loc) Β· 3.93 KB

Go profile

goμ–Έμ–΄λ‘œ μ§  μ†ŒμŠ€λ₯Ό ν”„λ‘œνŒŒμΌλ§ν•˜λŠ” 방법 μ •λ¦¬πŸ“
β†’ "ν”„λ‘œνŒŒμΌλ§" : λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰, ν•¨μˆ˜λ³„ CPU μ μœ μ‹œκ°„, tracing λ“± μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ™μ μœΌλ‘œ λΆ„μ„ν•˜λŠ” 것
이λ₯Ό 잘 ν™œμš©ν•œλ‹€λ©΄ CPU μ‚¬μš©λΆ€λΆ„,λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°œκ²¬ν•˜κ³ ,μž₯κΈ°κ°„ μ•ˆμ •μ μœΌλ‘œ μœ μ§€λ˜λ„λ‘ κ°œλ°œν•˜λŠ” 데에 맀우 μœ μš©ν•¨β—

방법

  1. go tool pprof ν”„λ‘œκ·Έλž¨
  2. runtime/pprof νŒ¨ν‚€μ§€
  3. net/http/pprof νŒ¨ν‚€μ§€
  4. test νŒ¨ν‚€μ§€

1. go tool pprof

  • ν”„λ‘œνŒŒμΌμ„ μ‹œκ°ν™”ν•΄μ£ΌλŠ” 툴둜써, golang μ„€μΉ˜μ‹œ 같이 μ„€μΉ˜λ¨
  • λ¨Όμ € μ‚¬μš©ν•˜κΈ° 전에, graphvizλ₯Ό μ„€μΉ˜ν•΄μ•Ό 함
    • μ„€μΉ˜κ°€ μ•ˆλ˜μ–΄μžˆμœΌλ©΄, ν”„λ‘œνŒŒμΌ μ‹œ μ—λŸ¬λ°œμƒν•¨ (graphvizκ°€ μ„€μΉ˜λ˜μ–΄μžˆμ§€ μ•Šλ‹€, μ„€μΉ˜ν•΄μ•Όλœλ‹€λŠ” κ΄€λ ¨ μ—λŸ¬λ©”μ‹œμ§€κ°€ 뜰 κ²ƒμž„)
  • 2~4λ₯Ό 톡해 얻은 ν”„λ‘œνŒŒμΌ νŒŒμΌλ“€μ„ μ‹œκ°ν™”ν•΄μ£ΌλŠ” 툴둜 μƒκ°ν•˜λ©΄ 됨
  • λͺ…λ Ήμ–΄
    • go tool pprof -http :<port> <profile File>
      • "localhost:"에 μ ‘μ†ν•΄μ„œ 에 λŒ€ν•œ μ‹œκ°ν™”λœ ν”„λ‘œνŒŒμΌμ„ 확인할 수 있음.
    • go tool pprof -http :<port> <profile HTTP Endpoint>
      • "localhost:"에 μ ‘μ†ν•΄μ„œ 에 λŒ€ν•œ μ‹œκ°ν™”λœ ν”„λ‘œνŒŒμΌμ„ 확인할 수 있음.
  • μ‹œκ°ν™”λœ ν”„λ‘œνŒŒμΌμ„ μ΄ν•΄ν•˜κΈ°μœ„ν•΄ μ•Œμ•„μ•Όλ  κ°œλ…
    • Flat : ν•¨μˆ˜κ°€ μ§μ ‘μ μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 뢀뢄에 λŒ€ν•œ λΆ€ν•˜
    • Cum : ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κΈ° μœ„ν•΄ μˆ˜ν–‰λ˜λŠ” λͺ¨λ“  뢀뢄에 λŒ€ν•œ λΆ€ν•˜
      func FuncA() { // FuncA()에 λŒ€ν•œ Cum은 FuncA() 전체에 λŒ€ν•œ λΆ€ν•˜λ₯Ό λœ»ν•˜κ³ 
         FuncB()      
         FuncC()
         a:= "sujiny-tech" // FuncA()에 λŒ€ν•œ Flat은 μ§μ ‘μ μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” κ²ƒμ²˜λŸΌ, 
         b:= 2023          // μ§μ ‘μ μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 뢀뢄에 λŒ€ν•œ λΆ€ν•˜λ₯Ό λœ»ν•¨!
         ...
      }
      

2. runtime/pprof

  • runtime/pprof νŒ¨ν‚€μ§€λŠ” CLI와 같이 ν•œλ²ˆ μ‹€ν–‰λ˜κ³ , μ’…λ£Œλ˜λŠ” App ν”„λ‘œνŒŒμΌμ„ μœ„ν•΄ μ‚¬μš©λ˜λŠ” νŒ¨ν‚€μ§€

  • ν•΄λ‹Ήν•˜λŠ” νŒ¨ν‚€μ§€μ—μ„œλŠ” CPU, Memory Heap에 λŒ€ν•œ ν”„λ‘œνŒŒμΌλ§Œ 얻을 수 있음

  • cpu ν”„λ‘œνŒŒμΌ μ„€μ •

  • memory ν”„λ‘œνŒŒμΌ μ„€μ •
  • go tool pprof -http :8080 cpu.out : CPU μ‚¬μš©λŸ‰ λ“± ν”„λ‘œνŒŒμΌλ§(cpu.out에 κ²°κ³Όκ°’ λ°”μ΄λ„ˆλ¦¬ 파일둜 μƒμ„±λ˜λ©΄μ„œ, ν•΄λ‹Ή ν¬νŠΈμ— μ›Ήμ‚¬μ΄νŠΈλ₯Ό 띄움)
  • go tool pprof -hhtp :9090 mem.out : Memory μ‚¬μš©λŸ‰ λ“± ν”„λ‘œνŒŒμΌλ§(mem.out에 κ²°κ³Όκ°’ λ°”μ΄λ„ˆλ¦¬ 파일둜 μƒμ„±λ˜λ©΄μ„œ, ν•΄λ‹Ή ν¬νŠΈμ— μ›Ήμ‚¬μ΄νŠΈλ₯Ό 띄움)

3. net/http/pprof

  • net/http/pprof νŒ¨ν‚€μ§€λŠ” μ„œλ²„μ™€ 같이 계속 λ™μž‘μ€‘μΈ App의 ν”„λ‘œνŒŒμΌμ„ μœ„ν•΄ μ‚¬μš©λ˜λŠ” νŒ¨ν‚€μ§€
  • http Handler ν•˜μœ„μ— λ‹€μ–‘ν•œ ν”„λ‘œνŒŒμΌμ„ 얻을 수 μžˆλŠ” Endpointλ₯Ό λ“±λ‘ν•˜λ©΄ 됨
    • /debug/pprof/profile : cpu ν”„λ‘œνŒŒμΌ
    • /debug/pprof/heap : λ©”λͺ¨λ¦¬ νž™ ν”„λ‘œνŒŒμΌ
    • /debug/pprof/block : block ν”„λ‘œνŒŒμΌ
    • /debug/pprof/threadcreate : thread ν”„λ‘œνŒŒμΌ
    • /debug/pprof/goroutine : goroutine ν”„λ‘œνŒŒμΌ
    • /debug/pprof/mutex : mutex ν”„λ‘œνŒŒμΌ

4. test

  • go test μ—μ„œ λ‹¨μœ„ν…ŒμŠ€νŠΈ μ‹€ν–‰ μ‹œ, ν”„λ‘œνŒŒμΌλ§ μˆ˜ν–‰λ„ κ°€λŠ₯함
  • go test ./... -cpuprofile cpu.out -memprofile mem.out -blockprofile block.out -mutexprofile mutex.outλ₯Ό 톡해 ν”„λ‘œνŒŒμΌμ„ 얻을 수 있음
    • go tool pprof http :8080 cpu.out

μ°Έκ³