2013-05-13 16 views
5

Ich habe einen Service geschrieben, der 6-7G Speicher zur Laufzeit (RES in Top) dauert. Also habe ich das pprof-Tool verwendet, um herauszufinden, wo das Problem liegt.Warum 'Gesamt MB' in Gollang Heap-Profil ist weniger als "RES" in Top?

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

Aber es gibt nur etwa 1-2g Speicher in Folge ('Total MB' in pdf). Wo ist der Rest?

Und ich habe Profil mein Dienst mit GOGC = aus versucht, als Ergebnis ist die 'Gesamt MB' genau das gleiche wie 'RES' in Top. Es scheint, dass Speicher GCed ist, aber nicht zum Kernel zurückgekehrt ist, wird nicht profiliert.

Irgendeine Idee?

P.S, ich habe sowohl in 1.0.3 und 1.1rc3 getestet.

+0

rumtime; das klingt interessant :) – thwd

+0

@Tom oops, typo :) –

Antwort

4

Dies liegt daran, dass Go derzeit keinen Speicher für GC-Ed-Objekte an das Betriebssystem zurückgibt, und zwar nur für Objekte, die kleiner sind als das vordefinierte Limit (32 KB). Stattdessen wird Speicher zwischengespeichert, um zukünftige Zuweisungen zu beschleunigen Go:malloc. Es scheint auch, dass dies in der Zukunft TODO behoben wird.

+0

Vielen Dank, ich bin auch auf diesen Thread gestoßen. Eigentlich habe ich FreeOSMemory() von "runtime/debug" in Go1.1rc3 getestet. Nicht viel Hilfe. Irgendein Rezept in der aktuellen Go-Version verfügbar, um dieses Problem zu beheben? Vielleicht manipulierst du einen kritischen Speicher mit cgo? –

+0

Es ist nur vernünftig, zu versuchen, die Erstellung von temporären Objekten zu minimieren. Vielleicht sogar Profiling mit pprof, um zu sehen, was die größten Täter sind. Dinge wie das Festlegen der Kapazität von Slice usw. können nicht schaden. Alle anderen Dinge, IMHO, sollten von Go's GC gehandhabt werden. – Gvozden

+1

Wissen Sie, wie der aktuelle Status dieses Problems ist? –