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")
}🎯 关键指标说明
- Alloc: 当前堆上分配的字节数
- TotalAlloc: 累计分配的总字节数
- Sys: 从操作系统获取的总内存
- NumGC: GC执行次数
- PauseNs: GC暂停时间数组
- NumGoroutine: 当前goroutine数量
