Πώς μπορούμε να μετρήσουμε τη χρήση μνήμης στο 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.
Για να το χρησιμοποιήσετε:
- Εισάγετε το
net/http/pprof. - Ξεκινήστε έναν HTTP διακομιστή.
- Προσεγγίστε τις αντίστοιχες διευθύνσεις URL (
/debug/pprof/) για να λάβετε προφίλ. - Χρησιμοποιήστε το εργαλείο
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.