π¬ Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ pprof ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Go?
π pprof β ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ Go. ΠΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π² ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΠ·ΠΊΠΈΡ ΠΌΠ΅ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ CPU ΠΈ ΠΏΠ°ΠΌΡΡΡ.
π ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
1. ΠΠΌΠΏΠΎΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ°
2. ΠΠ°ΠΏΡΡΠΊ HTTP ΡΠ΅ΡΠ²Π΅ΡΠ°:
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΏΠΎΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΡΠΎΡΠΈΠ»ΡΠΌ ΡΠ΅ΡΠ΅Π·
3. Π‘Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ: ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠΈΠ»Ρ CPU, ΠΏΠ°ΠΌΡΡΠΈ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΡ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ CPU-ΠΏΡΠΎΡΠΈΠ»Ρ:
ΠΡΠΎΡ ΠΊΠΎΠ΄ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ CPU.
4. ΠΠ½Π°Π»ΠΈΠ· ΠΏΡΠΎΡΠΈΠ»Ρ: ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
Π ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
5. ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
π pprof β ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ Go. ΠΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π² ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΠ·ΠΊΠΈΡ ΠΌΠ΅ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ CPU ΠΈ ΠΏΠ°ΠΌΡΡΡ.
π ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
pprof
Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅: 1. ΠΠΌΠΏΠΎΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ°
pprof
: ΠΈΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ import _ "net/http/pprof"
, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΠ° ΠΊ HTTP-ΡΠ΅ΡΠ²Π΅ΡΡ. 2. ΠΠ°ΠΏΡΡΠΊ HTTP ΡΠ΅ΡΠ²Π΅ΡΠ°:
pprof
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ HTTP-ΡΠ΅ΡΠ²Π΅Ρ Π΄Π»Ρ ΡΠ±ΠΎΡΠ° ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΎΡΠΈΠ»Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΏΠΎΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
go
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΡΠΎΡΠΈΠ»ΡΠΌ ΡΠ΅ΡΠ΅Π·
http://localhost:6060/debug/pprof/
. 3. Π‘Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ: ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠΈΠ»Ρ CPU, ΠΏΠ°ΠΌΡΡΠΈ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΡ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ CPU-ΠΏΡΠΎΡΠΈΠ»Ρ:
go
f, err := os.Create("cpu.prof")
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
ΠΡΠΎΡ ΠΊΠΎΠ΄ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ CPU.
4. ΠΠ½Π°Π»ΠΈΠ· ΠΏΡΠΎΡΠΈΠ»Ρ: ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
go tool pprof
Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΎΠ±ΡΠ°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ: shell
go tool pprof cpu.prof
Π ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
pprof
ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΊΠ°ΡΡ ΡΠ·ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠ°, ΠΈ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ². 5. ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
pprof
ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΎΡΠΈΠ»Ρ Π² Π²ΠΈΠ΄Π΅ Π³ΡΠ°ΡΠΈΠΊΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Π½ΡΡΡΠΈ pprof
, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ web
ΠΈΠ»ΠΈ svg
, Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ»Ρ.