The Key to Go Efficiency is Just a Few Go Runtime Metrics Away! - Bartłomiej Płotka & Arianna Vespri

Learn how Go runtime metrics provide essential insights into app behavior and performance. Discover key metrics for memory, GC, and goroutines to optimize efficiency and reliability.

Key takeaways
  • Go runtime metrics provide crucial insights into application behavior, memory usage, and garbage collection that can’t be obtained through regular profiling alone

  • Key default metrics to monitor:

    • GoGC - controls garbage collection frequency and memory overhead
    • GoMaxProcs - number of OS threads for Go routines
    • GoMemLimit - maximum memory limit for the runtime
    • GoMemStubHeapObjects - count of allocated heap objects
    • GoRoutines - number of active goroutines
  • Setting appropriate GoMemLimit helps prevent OOM kills in containerized environments and allows better memory management

  • Runtime metrics help detect:

    • Memory leaks
    • Goroutine leaks
    • GC pressure
    • Stack overflow issues
    • Scheduling latency problems
  • The Prometheus client Go library provides standardized collection of runtime metrics with filtering options to select specific metrics

  • Renaming metrics should be avoided as it breaks existing alerts, dashboards and automation

  • Both developers and SREs should monitor runtime metrics - it’s a shared responsibility for application reliability

  • Runtime metrics are essential for:

    • Capacity planning
    • Resource optimization
    • Cost reduction
    • Performance troubleshooting
    • Production incident investigation
  • Default runtime metrics provide a good balance between observability and overhead - collect additional metrics selectively based on needs

  • Consider workload characteristics (CPU vs memory bound, concurrency level) when tuning runtime parameters like GC frequency