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

У меня есть работающий (частный) сервер, который использует около 1,1 ГБ виртуальной памяти (1,0 ГБ физической памяти). Несмотря на то, что у меня есть исходный код сервера, я хочу найти лучшее решение, которое можно использовать для получения полной картины распределения памяти между объектами на сервере? Примерно так:

HashTable: 50%, 500M

PlayerCache: 20%, 200M

OtherA: 10%, 100M

...

где указатель может находиться в объекте и указывает на динамически распределяемые запоминания.

1 Ответ

0 голосов
/ 06 мая 2018

В Linux вы можете использовать proc (5) и pmap (1) (Кстати, pmap (1) , top (1) ) , ps (1) все используют /proc/ и полезны для вас).

Итак, если ваш сервер process имеет pid 1234, вы можете попробовать pmap 1234 и cat /proc/1234/maps в своем терминале, чтобы понять виртуальное адресное пространство из ваш процесс. Попробуйте также cat /proc/1234/status

Помните, что процессы выполняются в виртуальной памяти , и каждый из них имеет свое собственное виртуальное адресное пространство, и что физическая память является ресурсом, управляемым ядром. Вас может заинтересовать RSS

У вас не будет отчета, детализирующего использование динамической памяти по типу или по переменной (потому что вообще не имеет смысла : например, в C, a данная malloc область памяти может быть разыменована посредством приведения различных типов и быть доступной - возможно, косвенно - через несколько переменных). Вы можете использовать malloc_stats (3) (это может дать статистику, связанную с размером зон памяти), если ваша программа использует C динамическое выделение памяти .

Вы можете использовать valgrind , очень полезный для поиска утечек памяти .

Вы можете изменить исходный код вашего сервера, чтобы он обрабатывал и определенным образом учитывал выделенное им выделение кучи , которое он выполняет. Например, если вы пишете код на C ++, вы можете изменить конструкторы и деструкторы ваших классов, увеличивая или уменьшая некоторые static или глобальные счетчики, или предоставляя некоторые специфичные для класса operator new и delete. Потребление динамической памяти является свойством всей программы (и оно не привязано, в общем , к конкретному типу или переменной). Некоторые программы имеют свои собственные (специфичные для типа) распределители или используют на основе арены или распределение на основе области .

Прочтите также кое-что о сборке мусора , например справочник GC , чтобы получить полезные понятия, терминологию и методы (например, трассировка GC , подсчет ссылок , слабые ссылки , циклические ссылки , умные указатели и т. д.). Они имеют значение даже для ручного управления памятью .

Управление памятью и ее распределение характерны для каждой программы, особенно в таких языках программирования, как C или C ++ (или Rust) с ручным управлением памятью, где соглашения имеют большое значение и характерны для каждой программы. Изучите исходный код существующих свободных программ серверов (например, Apache , Lighttpd , PostGreSQL , Xorg , Unison , Git , ...) и вы обнаружите, что у каждого из них есть свои соглашения об управлении памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...