Skip to content

Go运行时统计信息 - Golang Runtime监控指标详解

运行时统计信息是监控和优化Go程序的重要依据。掌握这些指标能够帮助开发者深入了解程序运行状态。

📋 核心统计指标

go
package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    fmt.Println("=== Go运行时统计信息 ===")
    
    // 内存统计
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    
    fmt.Printf("\n--- 内存统计 ---\n")
    fmt.Printf("堆分配: %.2f MB\n", float64(m.Alloc)/1024/1024)
    fmt.Printf("总分配: %.2f MB\n", float64(m.TotalAlloc)/1024/1024)
    fmt.Printf("系统内存: %.2f MB\n", float64(m.Sys)/1024/1024)
    fmt.Printf("堆对象数: %d\n", m.HeapObjects)
    
    // GC统计
    fmt.Printf("\n--- GC统计 ---\n")
    fmt.Printf("GC次数: %d\n", m.NumGC)
    fmt.Printf("上次GC: %v ago\n", time.Since(time.Unix(0, int64(m.LastGC))))
    fmt.Printf("GC CPU占用: %.2f%%\n", m.GCCPUFraction*100)
    
    if m.NumGC > 0 {
        lastPause := m.PauseNs[(m.NumGC+255)%256]
        fmt.Printf("最近GC暂停: %v\n", time.Duration(lastPause))
    }
    
    // Goroutine统计
    fmt.Printf("\n--- Goroutine统计 ---\n")
    fmt.Printf("Goroutine数量: %d\n", runtime.NumGoroutine())
    fmt.Printf("CPU核心数: %d\n", runtime.NumCPU())
    fmt.Printf("GOMAXPROCS: %d\n", runtime.GOMAXPROCS(0))
    
    // CGO调用统计
    fmt.Printf("\n--- CGO统计 ---\n")
    fmt.Printf("CGO调用数: %d\n", runtime.NumCgoCall())
    
    // 调度器统计(需要GODEBUG=schedtrace=1000)
    fmt.Printf("\n--- 调度器信息 ---\n")
    fmt.Printf("提示: 设置GODEBUG=schedtrace=1000查看详细调度信息\n")
    
    fmt.Printf("\n📊 监控最佳实践:\n")
    fmt.Printf("1. 定期采样runtime.MemStats\n")
    fmt.Printf("2. 监控GC频率和暂停时间\n")
    fmt.Printf("3. 跟踪Goroutine数量趋势\n")
    fmt.Printf("4. 使用pprof进行深度分析\n")
    fmt.Printf("5. 集成到监控系统(如Prometheus)\n")
}

🎯 关键指标说明

  1. Alloc: 当前堆上分配的字节数
  2. TotalAlloc: 累计分配的总字节数
  3. Sys: 从操作系统获取的总内存
  4. NumGC: GC执行次数
  5. PauseNs: GC暂停时间数组
  6. NumGoroutine: 当前goroutine数量

正在精进