Sobes.tech
Middle

Чӣ гуна метавон истифодаи хотираро дар Go андозагирӣ кард ва pprof чист?

sobes.tech AI

Ҷавоб аз AI

Истифодаи хотира дар Go метавонад бо чанд роҳ андозагирӣ шавад:

  • runtime.MemStats: Манзараи тасвирӣ аз омори истифодаи хотира, аз ҷумла андозаи кӯпча, шумораи объектҳо, ҷамъоварии калаф ва ғайра медиҳад. Он барои гирифтани тасвири умумии тақсимоти хотира муфид аст.

  • Профайлер pprof: Инструменти қавӣ барои таҳлили иҷроиш ва истифодаи захираҳо, аз ҷумла хотира. Он имкон медиҳад профилҳои истифодаи кӯпча дар вақтҳои гуногун ҷамъоварӣ ва таҳлил барои муайян кардани нуқтаҳои танг ва шикастани хотира.

  • debug.FreeOSMemory(): Маъзурона хотираро ба системаи оператсионӣ озод мекунад. Он метавонад ба таври ғайримустақим кӯмак кунад, ки фаҳмем, ки чанд хотира дар Go рантайм нигоҳ дошта мешавад.

pprof (net/http/pprof) — ин як бастаи дар китобхонаи стандартии Go мебошад, ки бо профайлери pprof аз пакети runtime/pprof ҳамкорӣ мекунад. Он интерфейси HTTP барои ҷамъоварии профилҳои захираҳои гуногун, аз ҷумла CPU, кӯпча (хотира), бастагиҳо, goroutine ва mutex-ҳоро пешниҳод мекунад.

Барои истифода:

  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
}

Масалан барои истифодаи pprof дар сервери HTTP:

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.