Sobes.tech
Middle

Πώς μπορούμε να μετρήσουμε τη χρήση μνήμης στο Go και τι είναι το pprof;

sobes.tech AI

Απάντηση από AI

Η χρήση μνήμης στο Go μπορεί να μετρηθεί με διάφορους τρόπους:

  • runtime.MemStats: Παρέχει μια στιγμιότυπο των στατιστικών χρήσης μνήμης, συμπεριλαμβανομένου του μεγέθους της ουράς, του αριθμού αντικειμένων, της συλλογής απορριμμάτων κ.λπ. Είναι χρήσιμο για την απόκτηση μιας γενικής εικόνας της κατανομής μνήμης.

  • Profiler pprof: Ένα ισχυρό εργαλείο για την ανάλυση της απόδοσης και της χρήσης πόρων, συμπεριλαμβανομένης της μνήμης. Επιτρέπει τη συλλογή προφίλ χρήσης ουράς σε διαφορετικές στιγμές και την ανάλυσή τους για τον εντοπισμό σημείων συμφόρησης και διαρροών μνήμης.

  • debug.FreeOSMemory(): Αναγκαστικά απελευθερώνει μνήμη στο λειτουργικό σύστημα. Μπορεί έμμεσα να βοηθήσει στην κατανόηση του πόση μνήμη διατηρεί το runtime του Go.

Το pprof (net/http/pprof) είναι ένα πακέτο στη βιβλιοθήκη standard της Go που ενσωματώνεται με τον profiler 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.