Как определить потребление памяти на поток в процессе? - PullRequest
0 голосов
/ 02 октября 2018

Многопоточный процесс, написанный на C, исчерпывает почти всю системную память.Чтобы выяснить поток, который потребляет большую часть памяти, я создал файл core, используя gcore [pid], чтобы проверить использование памяти для потоков, но я не могу найти способ сделать это.

ps -eLFlm и команда top с опцией -H показывает общее потребление памяти, но не на поток.

Есть ли полезный совет для решения проблемы?

ОС: Centos6

1 Ответ

0 голосов
/ 02 октября 2018

Многопоточный процесс, написанный на C, исчерпывает почти всю системную память.Чтобы выяснить поток, который потребляет большую часть памяти ....

Этот вопрос не имеет смысла.По определению все потоки одного и того же процесса совместно используют одно и то же виртуальное адресное пространство .Вы можете запросить его программно, используя proc (5) (например, чтение /proc/self/maps из вашей программы).

Возможно (и довольно часто), что какая-то кучапамять распределяется (например, с malloc) в потоке A и будет освобождена (например, free -d) позже в каком-либо другом потоке B (часто в основном потоке, непосредственно перед выходом).

C динамическое управление памятью куча, по определению , целое свойство программы.

Типичным примером является последний arg аргумент pthread_create (3) .Это обычно должно быть выделено куча.Вы можете задокументировать и принять соглашение о том, что вызывающий поток (использующий pthread_create) будет malloc его, но созданный поток должен free его (вы можете потребовать, чтобы каждый start_routine передавался pthread_create долженfree что arg).

Есть какой-нибудь полезный совет для решения проблемы?

Возможно valgrind может помочь вам найти ваш утечки памяти .Вы лучше скомпилируете всю свою программу (и, возможно, некоторые соответствующие библиотеки) с отладочной информацией DWARF (например, скомпилируйте с gcc -g), а затем перезапустите программу.Но такие ошибки найти сложно, поэтому будьте готовы потратить на них несколько недель.


С концептуальной точки зрения, "теория" сборка мусора (а также умные указатели , RAII , возможно подсчет ссылок и т. Д.) Могут быть полезны.Итак, прочитайте справочник GC (он знакомит с хорошими понятиями и терминологией и объясняет, что управление памятью - это целая проблема программы).Многие понятия там даже актуальны для программ на не-GC-языках, таких как C или C ++.

Вам нужно определить и следовать некоторым достаточно хорошим целым соглашениям программы относительноуправление памятью (и это сложно).

...