Go hat hervorragende integrierte Profiling-Werkzeuge. So verwenden Sie sie.
pprof aktivieren¶
import _ “net/http/pprof” go func() { log.Println(http.ListenAndServe(“:6060”, nil)) }()
CPU Profiling¶
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
Memory¶
go tool pprof http://localhost:6060/debug/pprof/heap
Goroutines¶
curl http://localhost:6060/debug/pprof/goroutine?debug=1
Flame Graphs¶
go tool pprof -http=:8080 cpu.prof
Benchmarks¶
func BenchmarkMyFunc(b *testing.B) { for i := 0; i < b.N; i++ { MyFunc() } } go test -bench=. -benchmem
Optimierung¶
- sync.Pool für wiederholte Allokationen
- Slices vorab allozieren
- strings.Builder
- Gepufferte Channels
Praktischer Profiling-Workflow¶
Gehen Sie bei der Optimierung einer Go-Anwendung systematisch vor: Identifizieren Sie zunaechst den Engpass mit einem CPU-Profil, analysieren Sie dann Allokationen mit einem Heap-Profil. Ein Flame Graph visualisiert den Call Stack und zeigt, wo die Anwendung die meiste Zeit verbringt — breite Bloecke zeigen Hot Paths an.
Die Go-Runtime bietet auch ein Trace-Tool (go tool trace), das eine detaillierte Timeline von Goroutinen, GC-Pausen und Scheduler-Aktivitaeten anzeigt. Fuer Produktionsanwendungen aktivieren Sie Continuous Profiling mit Pyroscope oder Parca — Sie sammeln Profile mit minimalem Overhead und koennen die Leistung rueckwirkend analysieren. Wichtige Go-Optimierungen: Verwenden Sie sync.Pool fuer wiederholte Allokationen, allozieren Sie Slices vorab mit make([]T, 0, expectedSize) und bevorzugen Sie strings.Builder gegenueber String-Konkatenation.
Zusammenfassung¶
pprof ist integriert und leistungsstark. CPU + Heap decken 90% der Probleme ab.