Как обнаружить утечку памяти?

Кажется, у меня большая утечка памяти в моей текущей системе Ubuntu

После сообщения о странных ошибках памяти Eclipse ( https://askubuntu.com/questions/148998/eclipse-constant-different- ошибки из-за недостатка памяти ) Сегодня я начал получать сообщения об ошибках «Недостаточно памяти» в моей консоли - при выполнении простых задач, таких как ввод в sudo -s или даже - free -m

Набор в 'free -m' показал мне, как моя оперативная память быстро увеличивается с 700M до 900M, увеличившись за несколько секунд до размера 2000M (после освобождения памяти с помощью echo 3 > /proc/sys/vm/drop_caches)

Eclipse isnt причина, я полностью убил процесс, и баран все еще шел. Есть ли способ определить, откуда происходит утечка? Я даже больше не могу обновить свою систему, так как apt-get update не удается (возможно, из-за недостатка памяти)

Использование Ubuntu 11.10

18
задан 13 April 2017 в 15:24

6 ответов

Трюк drop_cache не освободит память, он сбросит кеш. Использует команду ps , если вы хотите определить, какие процессы используют больше памяти.

Например, для мониторинга списка 15 лучших пользователей памяти.

$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
  PID %MEM   RSS    VSZ COMMAND
 2590 13.4 136892 825000 firefox
 1743 10.7 109020 300780 Xorg
 2067  8.5 86764 1118140 unity-2d-shell
 3307  4.1 42560 627780 unity-2d-spread
 2068  2.9 29904 617644 unity-2d-panel
 2092  2.5 25524 1291204 nautilus
 2457  1.9 20292 530276 gnome-terminal
 2351  1.9 20016 821488 unity-scope-vid
 2161  1.9 19476 531968 unity-panel-ser
 2034  1.7 18256 759716 gnome-settings-
 2074  1.5 16176 518016 nm-applet
 2273  1.5 15452 580416 unity-lens-vide
 2051  1.4 15112 524260 metacity
 2395  1.2 12836 407336 update-notifi

Вы также можете проверить резервирование общей памяти, но вы будете знать только, кто является владельцем сегментов.

Распределение Pmap:

$ ls -l /run/shm
total 272
-r-------- 1 ed      ed      67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed      ed      67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed      ed      67108904 Nov 29 18:38 pulse-shm-863909656

$ df /run/shm 
Filesystem     1K-blocks  Used Available Use% Mounted on
none              509332   272    509060   1% /run/shm

обратите внимание, что зарезервированные выделения намного выше, чем реальные выделенные страницы (df «используется»)

Распределения системы V:

[ 112]

Редактировать : необходимо передать --sort -rss в ps, чтобы получить процессы с наибольшим использованием памяти, в противном случае список процессов сортируется по возрастанию по количеству и дает процессам с наименьшим использованием памяти.

0
ответ дан 13 April 2017 в 15:24

Вот почти гарантированные шаги для поиска утечки памяти:

  1. Узнайте PID процесса, который вызывает утечку памяти.

    ps -aux
    
  2. захватывает /proc/PID/smaps и сохраняет в некоторый файл, например BeforeMemInc.txt.

  3. дождитесь увеличения памяти.
  4. снова перехватить /proc/PID/smaps и сохранить его afterMemInc.txt
  5. найти разницу между первым smaps и вторым smaps, т.е. г. с помощью

    diff -u beforeMemInc.txt afterMemInc.txt

  6. запишите диапазон адресов, в котором увеличилась память, например:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. использовать GDB для выгрузки памяти при запущенном процессе или получить coredump с помощью gcore -o process

  8. Я использовал gdb при запущенном процессе для выгрузки памяти в какой-то файл. ]

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
    
  9. сейчас, используйте команду strings или hexdump -C, чтобы напечатать dump_outputfile.dump

    strings outputfile.dump
    
  10. Вы получите читаемую форму, где вы можете найти эти строки в вашем исходном коде.

  11. Проанализируйте источник, чтобы найти утечку.

0
ответ дан 13 April 2017 в 15:24

memprof - инструмент для профилирования использования памяти и обнаружения утечек памяти. Он может генерировать профиль, сколько памяти было выделено каждой функцией в вашей программе. Кроме того, он может сканировать память и находить блоки, которые вы выделили, но на которые больше нет ссылок.

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

memprof

Источник: Руководство по Ubuntu

0
ответ дан 13 April 2017 в 15:24

У меня есть более старая машина, которую я использую, это постоянно выкладывает сообщения утечки памяти:

root@:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1523        374        131         32        588
-/+ buffers/cache:        902        995
Swap:         1942        480       1462

Мой сценарий:

sync; sudo echo 3 > /proc/sys/vm/drop_caches

Названный им cache.sh

root@~# ./cache.sh
root@~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1106        791        126          1        207
-/+ buffers/cache:        897       1000
Swap:         1942        480       1462

Вы видите, что я был до 374 МБ, работал sync; sudo echo 3 > /proc/sys/vm/drop_caches и полученные 417 МБ назад. Каждый может cron это, чтобы работать каждые 5 минут или просто иметь терминал открывается и выполнить его, когда Вы видите медленную производительность. Да, мне нужно к дополнительной памяти к машине...

5
ответ дан 13 April 2017 в 15:24

У меня была похожая проблема, но с очень странным решением.

По какой-то неизвестной причине у меня был установлен и работает почтовый сервер на ноутбуке. Я не знаю, почему он у меня был ... Однако я отключил его, и оказалось, что это программное обеспечение на моем ноутбуке находилось под ddos attack. После этого все было нормально.

0
ответ дан 13 April 2017 в 15:24

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

memstat -w -p pid - хорошая команда для использования.

0
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: