π pprof: ΠΠ°ΠΊ Π½Π°ΠΉΡΠΈ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΆΡΠ΅Ρ 80% CPU
Π‘Π΅ΡΠ²ΠΈΡ Π½Π° ΠΏΡΠΎΠ΄Π΅ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΡΠΏΠΈΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠ»ΠΊΡ ΠΏΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ.
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π½ΠΎΠ²ΠΈΡΠΎΠΊ? Π‘ΠΈΠ΄ΠΈΡ ΠΈ ΡΠΌΠΎΡΡΠΈΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ Π²Π·Π³Π»ΡΠ΄ΠΎΠΌ Π³ΠΈΠΏΠ½ΠΎΡΠΈΠ·Π΅ΡΠ°, ΠΏΡΡΠ°ΡΡΡ ΡΠ³Π°Π΄Π°ΡΡ: "ΠΡ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΡΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠΊΠ° ΡΠΎΡΠΌΠΎΠ·ΠΈΡ". ΠΠ»ΠΈ ΠΎΠ±ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ Π²Π΅ΡΡ ΠΊΠΎΠ΄ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ time.Now() Π² Π½Π°ΡΠ°Π»Π΅ ΠΈ time.Since() Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π‘Π΅Π½ΡΠΎΡ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ΅ΡΠΌΠΈΠ½Π°Π», ΠΏΠΈΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΡΠ΅ΡΠ΅Π· 30 ΡΠ΅ΠΊΡΠ½Π΄ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΎΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΏΡΠΎΡΠ΅Π½Ρ ΡΠΊΡΠ°Π΄Π΅Π½Π½ΠΎΠ³ΠΎ CPU. ΠΠ°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ pprof.
ΠΠ½ Π²ΡΡΡΠΎΠ΅Π½ ΠΏΡΡΠΌΠΎ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Go. Π Π°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: ΡΠ°Π· Π² 10 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ ΡΠ°Π½ΡΠ°ΠΉΠΌ Go "Π·Π°ΠΌΠΈΡΠ°Π΅Ρ", ΡΠΌΠΎΡΡΠΈΡ Π½Π° ΡΡΠ΅ΠΊΠΈ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΡ Π³ΠΎΡΡΡΠΈΠ½ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ: "Π’Π°ΠΊ, Π² ΡΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΡΡΠ½ΠΊΡΠΈΡ json.Unmarshal.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ΠΌ Π²ΡΠΊΡΡΡΠΈΠ΅ Π·Π° 4 ΡΠ°Π³Π°.
Π¨Π°Π³ 1. ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ Β«ΠΆΡΡΠΊΠ°Β» Π² ΠΊΠΎΠ΄Π΅
ΠΡΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ΅ - ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ:
package main
import (
"net/http"
_ "net/http/pprof" // <-- ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΌΠ°Π³ΠΈΡ
)
func main() {
// ... Π²Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ° ...
// ΠΠ΅ΡΠ°Π΅ΠΌ pprof Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΏΠΎΡΡ!
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
}ΠΡΠ°Π½Ρ Π΄Π»Ρ Senior-ΠΎΠ²: ΠΠ°Π³ΠΈΡ _ "net/http/pprof" ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠΌ http.DefaultServeMux. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ chi, gin ΠΈΠ»ΠΈ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ http.NewServeMux(), ΡΠΎΡΡΡ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² Π²Π°Ρ ΡΠΎΡΡΠ΅Ρ ΡΡΠΊΠ°ΠΌΠΈ (ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Ρ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ net/http/pprof ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ Ρ Π΅Π½Π΄Π»Π΅ΡΡ).
Π¨Π°Π³ 2. ΠΠ°ΡΡΠ°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²ΡΠΈΠΊ
Π‘Π΅ΡΠ²ΠΈΡ ΠΊΡΡΡΠΈΡΡΡ ΠΏΠΎΠ΄ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ. ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» Π½Π° ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Go: *"ΠΠΎΡΠ»ΡΡΠ°ΠΉ ΡΡΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ 30 ΡΠ΅ΠΊΡΠ½Π΄ ΠΈ ΡΠΎΠ±Π΅ΡΠΈ ΠΌΠ½Π΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ"*:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30Π’Π΅ΡΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ΄ΡΠΌΠ°Π΅Ρ ΠΏΠΎΠ»ΠΌΠΈΠ½ΡΡΡ ΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡΡ Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ (pprof).
Π¨Π°Π³ 3. ΠΠ°Π³ΠΈΡ Π΄Π²ΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ
ΠΠ½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ top10:
Showing nodes accounting for 2.45s, 88.1% of 2.78s total
flat flat% sum% cum cum%
1.82s 65.5% 65.5% 1.82s 65.5% regexp.(*bitState).reset
0.34s 12.2% 77.7% 0.45s 16.2% encoding/json.Unmarshal
0.15s 5.4% 83.1% 2.50s 89.9% main.processOrder
ΠΠ»Π°Π²Π½Π°Ρ Π»ΠΎΠ²ΡΡΠΊΠ° Π½ΠΎΠ²ΠΈΡΠΊΠ° - ΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ cum.
β’ flat - ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΏΡΠΎΠ²Π΅Π» ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
β’ cum (cumulative) - ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΏΡΠΎΠ²Π΅Π» Π² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ + Π²ΠΎ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½Π° Π²ΡΠ·Π²Π°Π»Π° Π²Π½ΡΡΡΠΈ ΡΠ΅Π±Ρ.
ΠΡΠΈΠΌΠ΅Ρ: Π£ ΡΡΠ½ΠΊΡΠΈΠΈ main.processOrder ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ cum ΡΠ°Π²Π΅Π½ 89.9%, Π½ΠΎ flat Π²ΡΠ΅Π³ΠΎ 5.4%. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΡΠ°ΠΌΠ° ΠΎΠ½Π° ΠΏΠΎΡΡΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΡΠΈΡΠ°Π΅Ρ, ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·Π²Π°Π»Π° ΡΡΠΆΠ΅Π»ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ (regexp.reset, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ flat Π°ΠΆ 65.5%). ΠΠ΅ΡΠΈΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ, Π° Π½Π΅ processOrder!
Π¨Π°Π³ 4. ΠΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΡΡΠ°Π· (Flame Graph)
Π‘ΠΌΠΎΡΡΠ΅ΡΡ Π² ASCII-ΡΠ°Π±Π»ΠΈΡΡ Π² 2026 Π³ΠΎΠ΄Ρ Π±ΠΎΠ»ΡΠ½ΠΎ. ΠΡΡ ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ (Ctrl+D) ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΡ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ»Π°Π³ -http:
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30Π Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΎΡΠΊΡΠΎΠ΅ΡΡΡ ΡΠΈΠΊΠ°ΡΠ½ΡΠΉ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π²ΠΈΠ΄ ΡΠ²Π΅ΡΡ Ρ Π² ΡΠ΅ΠΆΠΈΠΌ Flame Graph (ΠΠ³Π½Π΅Π½Π½ΡΠΉ Π³ΡΠ°Ρ):
1. ΠΠ΅ΡΠ΅Π΄ Π²Π°ΠΌΠΈ "ΡΡΠΎΠ»Π±Ρ". Π§Π΅ΠΌ ΡΠΈΡΠ΅ ΡΡΠΎΠ»Π± ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ - ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ CPU ΡΠΎΠΆΡΠ°Π»Π° ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ. 2. ΠΠ»ΠΈΠΊΠ°Π΅ΠΌ ΠΌΡΡΠΊΠΎΠΉ Π½Π° ΡΠ°ΠΌΡΠΉ ΡΠΈΡΠΎΠΊΠΈΠΉ ΠΊΡΠ°ΡΠ½ΡΠΉ ΡΡΠΎΠ»Π±.
2. ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΡ Source.
3. ΠΠΈΠ΄ΠΈΠΌ Π½Π°Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄, Π³Π΄Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΅Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΡΡΡΠΎΡΠΊΠ° var re = regexp.MustCompile(...), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΠ°Ρ ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ Π²Π½ΡΡΡΠΈ ΡΠΈΠΊΠ»Π° Π² Ρ Π΅Π½Π΄Π»Π΅ΡΠ΅. ΠΡΠΎΠ΄ ΡΠΏΠ°ΡΠ΅Π½.
π₯ Senior Warning: ΠΡΠΎΠ²Π°Π²Π°Ρ ΡΠ΅Π½Π° Π΄Π΅ΡΠΎΠ»ΡΠ°
ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΡΡΠ°Π²Π»ΡΠΉΡΠ΅ ΠΏΠΎΡΡ 6060 Π½Π°ΡΡΠΆΡ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ!
ΠΠΎ Π°Π΄ΡΠ΅ΡΡ /debug/pprof/goroutine?debug=2 Π»ΡΠ±ΠΎΠΉ ΡΠΊΠΎΠ»ΡΠ½ΠΈΠΊ Π±Π΅Π· Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ Π΄Π°ΠΌΠΏ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΡ Π³ΠΎΡΡΡΠΈΠ½. Π ΠΈΡ ΡΡΠ΅ΠΊΠ°Ρ Π±ΡΠ΄ΡΡ Π»Π΅ΠΆΠ°ΡΡ Π²Π°ΡΠΈ ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΎΡ ΠΠ Π² ΡΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Bearer-ΡΠΎΠΊΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ.
Π ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅ pprof ΠΎΠ±ΡΠ·Π°Π½ Π²ΠΈΡΠ΅ΡΡ ΡΡΡΠΎΠ³ΠΎ Π½Π° localhost, ΠΊΡΠ΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π·Π°Ρ ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· kubectl port-forward ΠΈΠ»ΠΈ SSH-ΡΡΠ½Π½Π΅Π»Ρ.
π @golang_lib