Я пытаюсь подтвердить, что на моем устройстве Linux происходит утечка памяти в режиме ожидания (непрерывного потребления памяти не должно быть). Меня не интересует определение процесса, вызывающего утечку, я просто хочу сделать вывод, что утечка памяти.
я использую top
как диагностический инструмент. Пример полей памяти сверху:
Mem: 118616k total, 83980k used, 34636k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 24140k cached
Я вижу ценность free
непрерывно снижается, однако, значение cached
постоянно увеличивается.
Чтобы подтвердить, что есть утечка памяти, сумма free+cached
должен постоянно снижаться, а не просто free
уменьшается (в этом случае ядро может просто использовать свободную память для кеширования)?
Утечка памяти процесса пользовательского пространства приведет к постоянно растущему объему памяти, используемой этот процесс.
Вы можете просто отслеживать процессы, используя top в пакетном режиме (однако кажется, что top не поддерживает сортировку по памяти в пакетном режиме, https://bugzilla.redhat.com/show_bug.cgi?id=547749)
В качестве альтернативы top вы также можете каждую минуту выполнять следующую команду:
ps aux --sort -rss | head -n 10
чтобы увидеть 10 самых популярных процессов, использующих ОЗУ.
Например.
while [ true ]; do ps aux --sort -rss | head -n 10 >> memory_usage_log.txt; echo "#########" >> memory_usage_log.txt; sleep 60; done;
Если какой-либо процесс со временем использует все больше и больше ОЗУ, при отсутствии активности или входных данных, это может быть утечка памяти (например, если вы запускаете веб-браузер и продолжаете его работу, не используя его, использование памяти в Интернете браузер явно не должен расти со временем).
Невозможно узнать, есть ли у вас утечка памяти. Вы можете предположить это, основываясь на ваших знаниях о системе и программах вместо нее. Я бы проверил файл /proc/meminfo
, принимая значение MemFree
и проверять его через определенные промежутки времени. Если он всегда уменьшается, через определенные промежутки времени я должен утверждать, что есть утечка памяти.
cat /proc/meminfo | gawk '{if (/MemFree/ ~ $0) print $2}'
Но насколько я знаю, нет возможности проверить "глобальную" утечку памяти. Ждите других ответов;)