Профилирование памяти кучи для поиска утечек памяти - PullRequest
0 голосов
/ 22 сентября 2019

В довольно насыщенной памяти программе я пытаюсь найти утечки памяти (или проблемы с сборкой мусора), потому что она потребляет слишком много памяти в течение нескольких часов, и поэтому решил запустить pprof (импортировав net / http / pprof, запустивсервер на 6060, и, наконец, подключиться к нему с помощью "http://localhost:6060/debug/pprof/heap?debug=1"). Есть некоторые моменты, которые я не понимаю, может быть, кто-то может помочь?

Во-первых, краткий обзор памяти в самом конце говорит (ядобавили несколько «, чтобы сделать меня более читабельным»:

# Alloc = 4'702'361'800
# TotalAlloc = 22'597'867'947'496
# Sys = 32'198'957'880
# Lookups = 0
# Mallocs = 43'685'679'881
# Frees = 43'674'183'514
# HeapAlloc = 4'702'361'800
# HeapSys = 31'045'058'560
# HeapIdle = 25'753'124'864
# HeapInuse = 5'291'933'696
# HeapReleased = 24'779'595'776
# HeapObjects = 11'496'367

, предполагая, что на куче выделено 4,7 ГБ (HeapUse 5,2 ГБ, возможно, из-за фрагментации?) ... но в самой первой строке я вижу

heap profile: 4117: 118'349'192 [33286087: 7'831'672'653'232] @ heap/1048576

, который, кажется, говорит о том, что 118MB был замечен в 4117 объектах - оба значения намного меньше, чем указанные выше размеры, как это может быть, и как я могу найти другие ~ 4,5 ГБ? ПрофильПохоже, что это только эти 120 МБ.

Тогда я также проверил всю ситуацию с htop (он на Ubuntu 18 с 64 ГБ ОЗУ) .Этот отчет сообщает для этого процесса 37,9 ГБ виртуальной памяти и 29,9 ГБрезерваЭд память.Хотя 29,9 ГБ соответствуют более или менее HeapSys, я не понимаю виртуальную память (которая, я думаю, основана на физической памяти) ... Go, похоже, говорит мне, что 24 ГБ (HeapReleased) из 30 ГБ было возвращено в ОС,но хтоп вроде не видит этого?Я также читал в каком-то месте, Go никогда не возвращает кучи обратно в ОС, но документ Go говорит: HeapReleased is bytes of physical memory returned to the OS..

Последняя проблема: когда я пишу дамп памяти, используя debug.WriteHeapDump, я не могупрочитайте данные результата обратно с помощью "go tool pprof binaryfile heapdumpfile", он говорит мне hheapdump: parsing profile: unrecognized profile format и failed to fetch any source profiles

...