tgoop.com/bminaiev_blog/37
Last Update:
Memory profiler на коленке
Недавно я хотел понять, почему программа на Rust использует много памяти. Для этого существует много разных тулов. Вначале я попробовал heaptrack. С помощью LD_PRELOAD
он подменяет функции malloc/free/…
на свои, которые подсчитывают статистику, и вызывают обычные обработчики.
Проблема была в том, что судя по резузльтату heaptrack
, программа использовала 500 мегабайт, а на самом деле VmRss
у нее был больше 3 гигабайт. Почему так бывает? malloc
внутри себя обычно просит большие куски памяти у операционной системы через mmap
, а потом разбивает ее на более маленькие части.
Чтобы лучше понять, откуда получается такой большой VmRss
, я решил воcпользоваться небольшой утилитой mevi, которая как раз отслеживает все системные вызовы типа mmap
. Кстати, у автора этой утилиты очень хороший блог про Rust!
Но судя по результату ее работы, моя программа вообще работает почти идеально и использует только 200 мб! Чтобы проверить, что я не совсем схожу с ума, и память действительно используется, я посмотрел на вывод pmap <pid>
и увидел там много блоков размером около 64 мб, которые почему-то не отображаются в mevi
.
Наконец-то мы дошли до момента поста, где вы узнаете про самый лучший memory profiler:
strace -o ~/strace.out -f -e trace=mremap,mmap,munmap,brk -k <command>Такая команда отслеживает все вызовы
mmap
, которые делает <command>
, и сохраняет для них стектрейсы. strace
также показывает конкретные адреса памяти, которые были выделены, так что, например, можно понять, откуда взялись те самые блоки по 64мб из вывода pmap
. Оказывается, что стандартный аллокатор вызывает mmap
с PROT_NONE
, и отдельно делает mprotect
на части этой памяти, поэтому mevi
не замечает такие куски памяти.Кстати, если вы пофиксили проблему и хотите построить график, который показывает количество используемой памяти от времени, то вот вам лучший тул для этого:
while true; do cat /proc/<pid>/status | grep VmRSS | awk '{ print $2 }' ; sleep 1; done
BY Боря программирует
Share with your friend now:
tgoop.com/bminaiev_blog/37