New We are sorting MAX channels into categories and territories. Read the news

πŸ”Ž 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
Views: 497
Open in MAX Report an inaccuracy

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content β€” check the address before entering passwords or payment details.

Redirecting in 10 s

Go