2013-05-13 14 views
5

Ho un servizio scritto in go che richiede 6-7G di memoria in fase di esecuzione (RES in alto). Quindi ho usato lo strumento pprof cercando di capire dove si trova il problema.Perché 'Total MB' nel profilo heap golang è inferiore a 'RES' in alto?

go tool pprof --pdf http://<service>/debug/pprof/heap > heap_prof.pdf 

Ma ci sono solo circa 1-2G di memoria in risultato ('Total MB' in pdf). Dov'è il resto?

E ho provato il profilo del mio servizio con GOGC = off, di conseguenza il 'Total MB' è esattamente lo stesso di 'RES' in alto. Sembra che la memoria sia GCed ma che non sia stato restituito al kernel non verrà profilato.

Qualche idea?

P.S, l'ho provato sia in 1.0.3 che in 1.1rc3.

+0

rumtime; sembra interessante :) – thwd

+0

@Tom oops, errore di battitura :) –

risposta

4

Questo perché Go attualmente non restituisce la memoria degli oggetti GCed al sistema operativo, per la precisione, solo per gli oggetti più piccoli del limite predefinito (32 KB). Invece la memoria viene memorizzata nella cache per accelerare le allocazioni future Go:malloc. Inoltre, sembra che questo sarà risolto nel futuro TODO.

+0

Grazie mille, mi sono imbattuto anche in quel thread. In realtà, ho provato su FreeOSMemory() da "runtime/debug" in Go1.1rc3. Non molto aiuto. Qualche ricetta nella versione corrente di Go disponibile per risolvere questo problema? Forse manipolare qualche memoria critica con cgo? –

+0

L'unica cosa sensata da fare è cercare di minimizzare la creazione di oggetti temporanei. Forse anche la profilazione con pprof per vedere quali sono i più grandi delinquenti. Cose come specificare la capacità di una fetta, ecc. Non possono ferire. Tutte le altre cose, IMHO, dovrebbero essere gestite dal GC di Go. – Gvozden

+1

Sai qual è lo stato corrente di questo problema? –