Проверить утечки памяти линукс

поиск утечки памяти

Есть встраиваемая система на базе x86 и в ней OpenEmbedded крутится. Со временем, в течение часа, потребление памяти системой возрастает на 10 Мб, и так всё время, видимо до исчерпания.

Есть ли какой-то способ выявить процессы в системе, потребление памяти которыми (не обращая внимания на периодические колебания) имеет тенденцию к увеличению?

Кто как решает эту проблему?

Всякими профилировщиками для поиска утечек памяти относительно единичной программы своей разработки пользоваться умею, а вот как с системой поступить?

Первое, что приходит в голову — собирать скриптом выхлоп

и потом распарсить.

Что такое вообще «потребление памяти системой»?

Объем занятой памяти. Он растет, потом ее не хватит. Свопа в системе нет, да и он не безграничен.

Занятой кем или чем? Как ты увидел, что «память занята системой»?

Я _не_знаю_ что заняло память. Просто свободной памяти становится меньше и это не дисковое кэширование. Просто что-то течет.

Спасибо, интересный метод, надо попробовать.

atop еще умеет статистику собирать.

1. Растут ли процессы? От этого зависит, в ядре искать или в юзерспейсе.

2. Фейлят ли попытки выделить память? Если нет, то память занимается под кэш и в этом ничего страшного нет.

3. Есть ли в ядре самописаные драйверы? Если есть, можно посмотреть /proc/slabinfo — в зависимости от тактики выделения памяти в драйвере, утечка может быть заметна там.

1. это еще надо выяснить — растет общий объем используемой памяти 2. про кэш в курсе, он тут ни при чем 3. нет

Спасибо, попробую atop, не слышал про эту штуку ранее.

1. это еще надо выяснить — растет общий объем используемой памяти

Чудес не бывает — память либо в процессах, либо в кэше, либо в слабах.

2. про кэш в курсе, он тут ни при чем

Отказы в выделении памяти есть или нет?

  • Кэш ядра имеет тенденцию съедать всю доступную память
  • Проверить не возвращается ли память после вызова

Вангую зелененький блоб втихую жрет.

Вангую зелененький блоб втихую жрет

Пока не занимался этой задачей. Короче, я использую утилиту htop, она показывает что кэш (дисковый в том числе), а что просто занятая память. И я вижу что в течение часа память кушается всё больше и больше. Попробую покилять свои программы, drop_caches тоже попробую.

Гдето на просторах интернетов есть перловый скрипт который это делает для приложений путем периодического парсинга /proc. Кажется он один такой.

Спасибо за наводку, попробую его поискать.

Как ты узнаешь, что потребление памяти растёт?

Оставлю на сутки и посмотрю сколько сожрало. Это когда всё доделаю.

Понял. htop Mem: used: — это used растет, медленно растет, что-то течет.

Какой-то процесс в htop становится безусловным лидером по потреблению памяти? Плодятся ли новые процессы? Если да, то какие?

Ты перепутал с амд.

На рабочем компьютере я вижу что память очень прыгает, но если ничего не делать и смотреть htop то видно что нет тенденции к росту, утечек нет. На целевой же системе ПО, написанное коллегами, видимо что-то не чистит за собой, но! Их ПО это не просто софт на Qt но еще и набор скриптов, может стороннее ПО дает эффект.

Читайте также:  Ati radeon x1000 драйвера для windows 10

Чисто визуально процент потребленной памяти процессами не растет. Лидеры по потреблению тоже не увеличивают процент. Новые процессы не плодятся — есть общий счетчик процессов и он не растет (была ошибка что плодились процессы и я ее пофиксил).

В общем, буду пробовать этот совет выше:

Гдето на просторах интернетов есть перловый скрипт который это делает для приложений путем периодического парсинга /proc. Кажется он один такой.

Источник

Невидимая утечка памяти на Linux — сервер Ubuntu (не кеш-диск /буферы)!

Обратите внимание, что это все еще происходит. Это не , связанное с linuxatemyram.com — память не используется для дискового кэша /буферов. Это выглядит так, как в NewRelic — система течет вся память, использует все пространство подкачки, а затем падает. На этом снимке экрана я перезагрузил сервер, прежде чем он разбился:

Невозможно определить источник утечки, используя общие средства пользовательского пространства. Теперь есть чат, чтобы обсудить эту проблему: http://chat.stackexchange.com /комнаты /27309 /невидимы-памяти утечки-на-Linux

Единственный способ восстановить «недостающую» память — это перезагрузка сервера. Это была давняя проблема, воспроизведенная на серверах Ubuntu 14.04, 14.10 и 15.04.

Использование памяти не отображается сверху и не может быть восстановлено даже после убийства практически каждого процесса (исключая такие вещи, как процессы ядра и ssh). Посмотрите на «кеш-память», «буферы» и «свободные» поля сверху, они не используют память, используемая память «отсутствует» и не восстанавливается без перезагрузки.

Попытка использовать эту «отсутствующую» память заставляет сервер обмениваться, замедлять сканирование и в конечном итоге замораживать.

Оборудование

Я наблюдал это на 3 серверах из примерно 100 до сих пор (хотя другие могут быть затронуты). Один из них — Intel Atom D525 @ 1.8ghz, а второй — Core2Duo E4600 и Q6600. Один использует JMicron Technology Corp. JMC250 PCI Express Gigabit Ethernet Controller, остальные используют Qualcomm Atheros Attansic L1 Gigabit Ethernet (rev b0).

Я запускал lshw на серверах проблем, а также на примере сервера OK. Серверы проблем: http://pastie.org/10370534 http://pastie.org/10370537 и http://pastie.org /10370541 — OK Сервер: http://pastie.org/10370544

Применение

Это совершенно безгласное приложение. Монитор не подключен, и фактически XServer не установлен. Это должно исключать графические драйверы /проблемы.

Сервер используется для прокси-сервера и анализа RTSP-видео с использованием live555ProxyServer, ffmpeg и openCV. Эти серверы проходят через большой трафик, потому что это приложение для видеонаблюдения: http://pastie.org/9558324

Я пробовал как очень старые, так и последние версии транков live555, ffmpeg и openCV без изменений. Я также пытался использовать opencv через модули python2 и python3, без изменений.

Точное программное обеспечение /конфигурация загружена на 100 серверов, до сих пор 3 подтвердили утечку памяти. Серверы медленно и незаметно протекают вокруг xMB (один протекал 8 Мбайт, один медленнее, один быстрее) в час, пока все порты не исчезли, серверы начинают сильно меняться, замедляются до обхода и требуют перезагрузки.

MemInfo

Опять же, вы можете видеть, что Cached и Buffers не используют много памяти. HugePages также отключены, поэтому это не преступник.

Свободный выход

Free показывает следующее (примечание кэшировано, а буферы оба низки, поэтому это не кеш диска или буферы!) — память не восстанавливается без перезагрузки:

Если мы вычитаем /добавляем буферы /кеш к используемым и свободным, мы видим:

  • 1,772MB действительно используется (- Буферы /Кэш) = 1,838MB используется — 1MB буферы — 66 МБ кэша
  • 220 МБ действительно бесплатно (+ буфер /кеш) = 154 МБ свободных + 1 МБ буферов + 66 МБ кэша
Читайте также:  Центр обновления не может обновить windows

Точно так же, как мы ожидаем:

Таким образом, около 1,7 ГБ не используется в пользовательском пространстве и фактически используется ядром, так как система фактически использует 53,7 МБ (см. вывод PS Mem ниже).

Я удивлен количеством комментариев, которые считают, что 1,7 Гбайт используется для кеширования /буферов — это принципиально неверное истолкование вывода! — эта строка означает используемую память , исключая буферы /кеш , подробнее см. в файле linuxatemyram.com.

Выход PS

Ниже приведен полный список запущенных процессов, отсортированных по памяти:

Вот полный список всех запущенных процессов:

Выходной сигнал PS

Выход Slabtop

Ятакже попробовал slabtop:

Другие

Я также пробовал сканировать руткит с rkhunter — ничего не нашел. И я попытался синхронизировать и сбрасывать кеш с помощью:

Это тоже не имело значения.

Я также попытался принудительно отключить или отключить swap с помощью

Я также пытался использовать htop и сортировать по памяти, и он не показывает, куда идет память. Версия ядра — это Linux 3.13.0-40-общий # 69-Ubuntu SMP.

Заключение

Что происходит? — Где все память идет? — Как узнать?

4 ответа

Мое заключение — это утечка памяти ядра где-то в ядре Linux, поэтому ни один из инструментов пользовательского пространства не может показать, где происходит утечка памяти. Возможно, это связано с этим вопросом: https://serverfault.com/вопросы /670423 /Linux-памяти-использование-выше, чем сумма-из-процессов

Я обновил версию ядра с 3.13 до 3.19, и кажется, что утечка памяти прекратилась! — Я верну отчет, если снова увижу утечку.

Было бы полезно иметь простой /простой способ узнать, сколько памяти используется для разных частей ядра Linux. По-прежнему остается загадкой, что вызывало утечку в 3.13.

Вы меняете Swapiness своего ядра или отключите его?

вы можете узнать текущий уровень подкачки с помощью

Вы можете попытаться заставить ваше ядро ​​агрессивно меняться с помощью

, если это уменьшит ваши проблемы, найдите хорошее значение между 1 и 100, подходящее для вашего требования.

История

Я могу воспроизвести вашу проблему, используя ZFS в Linux .

Вот сервер с именем node51 с помощью 20GB ОЗУ. Я обозначил 16GiB ОЗУ для размещения в Кэш адаптивной замены ZFS (ARC) :

Затем я прочитал файл 45GiB , используя Pipe Viewer в моем пуле ZFS zeltik , чтобы заполнить ARC:

Теперь посмотрите на свободную память:

51MiB в буферах
69MiB в кеше
120MiB в обоих
19688MiB используемой ОЗУ, включая буферы и кеш
19568MiB используемой ОЗУ, исключая буферы и кеш

Сценарий Python, на который вы ссылаетесь, сообщает, что приложения используют только небольшой объем оперативной памяти:

19568MiB — 137.4MiB ≈ 19431MiB неучтенной ОЗУ

Объяснение

120MiB используемых буферов и кешей, которые вы видели в приведенной выше истории, для эффективного управления кэшированием данных ядра, отправленных или полученных с внешнего устройства.

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

Вторая строка данных, которая начинается с — /+ buffers /cache , показывает объем физической памяти, которая в настоящее время предназначена для системного буфера Кэш . Это особенно важно в отношении применения программ, поскольку все данные, поступающие из файлов в системе, которые выполняются с помощью read () и write () системных вызовов pass через этот кеш. Этот кеш может значительно ускорить доступ к данным посредством уменьшая или устраняя необходимость чтения или записи на жесткий диск или другой диск.

Читайте также:  Sudo in windows terminal

Теперь, как мы учитываем недостающие 19431MiB ?

В выводе free -m , 19688MiB « used » в « — /+ buffers /cache » происходит из этой формулы:

(Если вы делаете цифры на основе моего вывода free -m , вы заметите, что 2MiB не учитываются, но это из-за ошибок округления, введенных этим кодом: #define S(X) ( ((unsigned long long)(X) > shift) )

Цифры не складываются в /proc/meminfo , либо (я не записывал /proc/meminfo , когда я запускал free -m , но из вашего вопроса можно видеть, что /proc/meminfo не показывает, где отсутствует ОЗУ), поэтому из вышесказанного можно сделать вывод, что /proc/meminfo не рассказывает всю историю.

В моих условиях тестирования язнают как контроль, что ZFS на Linux отвечает за использование высокой ОЗУ. Я сказал ARC, что он может использовать до 16GiB ОЗУ сервера.

ZFS в Linux не является процессом. Это модуль ядра.

Из того, что я нашел до сих пор, использование ОЗУ модуля ядра не отображалось с помощью инструментов информации о процессе, потому что модуль не является процессом.

Устранение неполадок

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

В этот момент мы можем спекулировать, догадываться и проверять.

Вы предоставили вывод dmesg . Хорошо разработанные модули ядра будут записывать некоторые из своих данных в dmesg .

Просматривая dmesg , мне выделился один элемент: FS-Cache

FS-Cache является частью cachefiles и относится к пакету cachefilesd в Debian и Red Hat Enterprise Linux.

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

Попробуйте отключить любые подозрительные модули ядра, которые могли бы сесть в ОЗУ. Вероятно, они могут быть отключены с помощью blacklist в /etc/modprobe.d/ , а затем sudo update-initramfs -u (команды и местоположения могут различаться в зависимости от дистрибутива Linux).

Заключение

Утечка памяти теряет 8MB/hr вашей ОЗУ и не освобождает ОЗУ, похоже, что бы вы ни делали. Я не смог определить источник утечки памяти на основе предоставленной вами информации и не смог найти способ найти утечку памяти.

Тот, кто более опытен с Linux, чем мне нужно будет предоставить информацию о том, как мы можем определить, куда идет «другое» использование ОЗУ.

Я начал щедрость по этому вопросу, чтобы узнать, можем ли мы получить лучший ответ, чем «спекулировать, догадываться и проверять».

Вы не совсем правы — да, ваша бесплатная команда -m показывает бесплатную 220MB, но она также показывает, что 1771MB используется в качестве буферов. Буферы и кэширование — это память, используемая ядром для оптимизации доступа к данным медленного доступа, обычно к дискам. Поэтому вы должны учитывать всю память, помеченную как буферы, как свободную память, потому что ядро ​​может вернуть ее, когда это требуется.

Источник

Оцените статью