Кажется, у меня большая утечка памяти в моей текущей системе Ubuntu
После сообщения о странных ошибках памяти Eclipse ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) я начал получать сообщения об ошибках «недостаточно памяти» в своей консоли сегодня - пока делать простые задачи, такие как ввод sudo -s
- или даже -free -m
Набрав в 'free -m', я убедительно показал, как быстро увеличивается объем ОЗУ с 700 до 900 МБ, а за несколько секунд вырос до 2000 М (после освобождения памяти с помощью echo 3 > /proc/sys/vm/drop_caches
).
Затмение - не причина, я полностью убил процесс, и баран все еще шел. Есть ли способ определить, откуда происходит утечка? Я даже больше apt-get update
не могу обновить свою систему, так как происходит сбой (возможно, потому что не хватает памяти)
С помощью Ubuntu 11.10
источник
Ответы:
memprof
Источник: Руководство по Ubuntu
источник
Во-первых, убедитесь, что у вас есть временная папка, в которой достаточно свободного места. Следующие команды создают дампы размером несколько ГБ.
Вы можете создать новую папку tmp, используя следующую команду. Вы можете перейти
/tmp
на другую файловую систему с достаточным пространствомШаги, чтобы найти утечку памяти
Узнайте PID процесса, который вызывает утечку памяти (вы также можете использовать, например,
htop
если доступно) и сохранить его в переменной с именемpid
Учитывая, что PID доступен в переменной
pid
, вы можете зафиксировать потребление памяти с помощью/proc/$pid/smaps
и сохранить в некоторый файл, напримерbeforeMemInc.txt
.Захватите
/proc/$pid/smaps
снова и сохраните какafterMemInc.txt
Найдите разницу между первым
smaps
и вторымsmaps
, например, с помощьюЗапишите диапазон адресов, в котором увеличилась память, например:
Используйте GDB для дампа памяти при запущенном процессе или получите coredump, используя
Я использовал gdb в запущенном процессе, чтобы записать память в какой-нибудь файл.
Теперь используйте
strings
команду или,hexdump -C
чтобы напечататьmemory.dump
Из этого вы получите читаемую информацию, которая поможет вам найти эти строки в вашем исходном коде.
источник
cat /proc/2882/smaps > /tmp/before.txt
на шаге 2. Что я сделал не так?Трюк drop_cache не освободит память, он сбросит кеш. Использует команду ps, если вы хотите определить, какие процессы используют больше памяти.
Например, чтобы следить за списком 15 лучших пользователей резидентной памяти.
Вы также можете проверить резервирование общей памяти, но вы будете знать только, кто является владельцем сегментов.
Распределение Pmap:
обратите внимание, что зарезервированные выделения намного выше, чем реальные выделенные страницы (df 'used')
Распределение системы V:
Изменить : необходимо перейти
--sort -rss
к,ps
чтобы получить процессы с наибольшим использованием памяти, в противном случае список процессов сортируется по возрастанию численных и дает процессам с наименьшим использованием памяти.источник
У меня есть старая машина, которую я использую, которая постоянно выдает сообщения об утечке памяти:
Мой сценарий:
Назвал это
cache.sh
Вы можете видеть, что я сократился до 374 МБ, побежал
sync; sudo echo 3 > /proc/sys/vm/drop_caches
и получил 417 МБ обратно. Можноcron
запустить его каждые 5 минут или просто открыть терминал и запускать его, когда вы видите низкую производительность. Да, мне нужно добавить память на машину ...источник
memstat также является хорошим инструментом, который покажет объем памяти, используемый каждым блоком, а также объем памяти, используемый загруженными библиотеками. Не лучший инструмент, но его стоит использовать для сбора деталей и статистики.
memstat -w -p pid
хорошая команда для использования.источник
У меня была похожая проблема, но с очень странным решением.
По какой-то неизвестной причине у меня был установлен и работает почтовый сервер на ноутбуке. Я не знаю, почему он у меня был ... Однако я отключил его обслуживание, и оказалось, что это программное обеспечение на моем ноутбуке подверглось атаке ddos. После этого все было нормально.
источник