Sobes.tech
Middle

Ինչպե՞ս կարելի է չափել հիշողության օգտագործումը Go-ում և ինչ է pprof-ը։

sobes.tech AI

Պատասխան AI-ից

Օգտագործումը հիշողության մեջ Go-ով կարելի է չափել մի քանի եղանակներով:

  • runtime.MemStats: Պատկերացնող նմուշ է հիշողության օգտագործման վիճակագրության, ներառյալ հողմի չափը, օբյեկտների քանակը, մաքրման հավաքագրումը և այլն: Օգտակար է ընդհանուր պատկերացում ստանալու համար հիշողության բաշխման մասին:

  • Profiler pprof: Ուժեղ գործիք կատարողականության և ռեսուրսների օգտագործման վերլուծության համար, ներառյալ հիշողությունը: Այն թույլ է տալիս հավաքել հողմի օգտագործման պրոֆիլներ տարբեր ժամանակներում և վերլուծել դրանք՝ գտնելու բլոկավորումներ և հիշողության արտահոսքեր:

  • debug.FreeOSMemory(): Ապահովում է հիշողության հարկադիր ազատում օպերացիոն համակարգին: Դա կարող է անուղղակիորեն օգնել հասկանալ, թե որքան հիշողություն է պահում Go ռանթայմը:

pprof (net/http/pprof) — դա Go-ի ստանդարտ գրադարանի մի փաթեթ է, որը ինտեգրվում է pprof պրոֆայլերով runtime/pprof փաթեթից: Այն ապահովում է HTTP ինտերֆեյսներ տարբեր ռեսուրսների պրոֆիլների հավաքագրման համար, ներառյալ CPU, հողմ, բլոկավորումներ, goroutine և մյուտեքսներ:

Օգտագործելու համար՝

  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" // ներմուծում պրոֆայլերի գրանցման համար
	"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։