Sobes.tech
Middle

Goда эс тутумдун колдонушун кантип өлчөө жана pprof эмне?

sobes.tech AI

AIден жооп

Go тилинде эс тутумду колдонуу бир нече жол менен өлчөнүшү мүмкүн:

  • runtime.MemStats: Эс тутумдун колдонулушунун статистикасынын сүрөттөмөсүн берет, анын ичинде кучтун өлчөмү, объекттердин саны, калыбына келтирүү жана башка. Бул эс тутумдун бөлүштүрүлүшүнүн жалпы сүрөтүн алуу үчүн пайдалуу.

  • Профайлер pprof: Иштөө жана ресурстарды колдонуу, анын ичинде эс тутумду анализдөө үчүн күчтүү инструмент. Ал кучту колдонуу профилдерин ар кандай учурларда чогултуу жана аларды анализдөө үчүн мүмкүндүк берет, бул кысымдар жана эс тутумдун агып кетүүсүн аныктоого жардам берет.

  • debug.FreeOSMemory(): Операциялык тутумга эс тутумду мажбурлап бошотуу. Бул косвенно Go рантаймында канча эс тутум кармалып турганын түшүнүүгө жардам берет.

pprof (net/http/pprof) — бул Go стандарттык китепканасындагы пакет, ал runtime/pprof пакетинен pprof профайлери менен интеграцияланат. Ал CPU, куч, блоктоолор, goroutine жана mutexтер сыяктуу ресурстардын профилдерин чогултуу үчүн HTTP интерфейстерин камсыз кылат.

Аны колдонуу үчүн:

  1. net/http/pprofти импорттоо.
  2. HTTP серверин иштетүү.
  3. Тийиштүү URL даректерине (/debug/pprof/) өтүү аркылуу профилдерге жетүү.
  4. Жыйналган маалыматтарды талдоо үчүн go tool pprof куралынан пайдалану.

Мисал катары runtime.MemStats колдонуу:

import (
	"fmt"
	"runtime"
	"time"
)

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Эс тутум статистикасын окуу
	fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
	fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
	fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
	fmt.Printf("\tNumGC = %v\n", m.NumGC)

	// Эс тутум менен иштөө мисалы
	_ = make([]byte, 1024*1024*10) // 10MB бөлүү

	time.Sleep(100 * time.Millisecond) // GC иштешин күтүү

	runtime.ReadMemStats(&m)
	fmt.Printf("Кийинки бөлүү: Alloc = %v MiB", bToMb(m.Alloc))
	fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
	fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
	fmt.Printf("\tNumGC = %v\n", m.NumGC)
}

func bToMb(b uint64) uint64 {
	return b / 1024 / 1024
}

HTTP серверинде pprof колдонуу мисалы:

import (
	_ "net/http/pprof" // pprof хендлерлерин каттоо үчүн импорттоо
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // 6060 портунда угуу
}

Бул кодду иштеткенден кийин, http://localhost:6060/debug/pprof/ дарегине өтсөңүз болот жана ар кандай профилдерге жетсеңиз болот. Кучтун анализи үчүн go tool pprof http://localhost:6060/debug/pprof/heap колдонсоңуз болот.