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



Попробуйте наш инструмент устранения неполадок

Есть несколько причин, по которым утечка памяти может произойти в Ubuntu, но, к счастью, когда она действительно происходит, это очевидно. Ошибочный код часто является самой большой причиной, поскольку у программистов, возможно, не было возможности проверить, освобождается ли память, которая больше не нужна. Если вы устанавливаете нестабильные пакеты или компилируете код из исходного кода, то по этой причине вы можете иметь дело с утечками памяти. Вы, вероятно, начнете замечать их, потому что пакеты программных приложений начинают жаловаться на то, что им не хватает памяти, когда у вас установлено более чем достаточно физической памяти.



Если вас беспокоит утечка памяти, попробуйте несколько раз набрать в терминале free. Если вы вдруг заметите, что использование ОЗУ быстро растет, значит, вы уже обнаружили утечку памяти. Если вы получаете сообщение об ошибке вроде bash: Недостаточно памяти при этом и у вас нет ничего, кроме терминала или даже виртуальной консоли, то вы почти наверняка имеете дело с одним. Некоторые утечки памяти могут быть немного более незаметными, но Ubuntu и его различные побочные продукты содержат инструменты и пакеты, которые могут помочь вам обнаружить их.



Обнаружение утечек памяти в Ubuntu

Поскольку инструменты, используемые для обнаружения утечек памяти, в основном основаны на командной строке CLI, не имеет значения, на какой версии Ubuntu вы их запускаете. Они должны нормально работать внутри терминала Unity в обычном Ubuntu, с виртуальной консоли на сервере Ubuntu, с lxterm в Lubuntu, с Konsole в Kubuntu или даже внутри Xfce в Xubuntu. Попробуйте выполнить простую задачу, например sudo -s, и для начала введите свой пароль.



Это должно дать вам корневую оболочку, если все выполнено правильно, но может вызвать ошибку памяти, если вы работаете с утечкой, которая уже зашла слишком далеко. Если вы действительно можете получить доступ к корневой оболочке, попробуйте ввести echo 3> / proc / sys / m / drop_caches, нажмите клавишу ввода и затем введите exit. Попробуйте снова запустить free или free -m, чтобы узнать, помогло ли это освободить память.

Некоторые программисты утверждают, что нет смысла заставлять ядро ​​отбрасывать свои кеши, поскольку они должны быть очищены и, таким образом, возвращены, как только потребуется дополнительная физическая память. Однако, хотя принудительная очистка этих кешей ухудшит производительность системы, имейте в виду, что это всего лишь тест. После перезагрузки системы ядро ​​Linux должно снова собрать кеши памяти так, как они были изначально.

Несколько человек предложили добавить синхронизацию строк; sudo echo 3> / proc / sys / vm / drop_caches к сценарию, который cron запускается последовательно, но это в первую очередь противоречит цели кэширования памяти. Сама по себе свободная память - это просто неиспользуемая оперативная память, а это означает, что данные должны загружаться из гораздо более медленныхэлектромеханический или устройства хранения NAND. Независимо от того, насколько быстры эти устройства, они не так быстры, как оперативная память, а это означает, что, хотя вы должны устранять утечки памяти, вам не следует вмешиваться в систему кеширования, когда вы настроили ее на оптимальные настройки.



Если вы решили, что у вас действительно есть постоянная утечка памяти, которая периодически случается при использовании вашего компьютера, и ее нельзя конкретно сузить, но у вас все еще есть доступ к интерфейсу командной строки, попробуйте выполнить команду top. Это должно дать вам список запущенных процессов.

Если Ubuntu выдаст необычную ошибку в отношении top, попробуйте вместо этого ввести busybox top, чтобы получить доступ к еще более простой версии этой программы. Когда у вас есть список, посмотрите в столбец% MEM или аналогичный, чтобы увидеть, каким приложениям назначено больше всего памяти. Хотя вы можете записать PID и выполнить команду kill для точного номера PID, это просто заставит приложение закрыть. Память, которую они используют, может все еще не высвободиться после того, как вы сделаете это, хотя, конечно, стоит попробовать.

Если вы найдете приложение, использующее большой объем памяти, нажмите q, чтобы выйти, а затем попробуйте kill #### с номером PID из предыдущего экрана. Системные процессы не должны быть уничтожены таким образом, равно как и все, что у вас есть, не должно работать. Думайте об этом аналогично уничтожению чего-либо с помощью списка задач Ctrl + Alt + Del, который вы также можете использовать для этого же процесса.

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

Если вы не просто устраняете неполадки в приложениях, но и работаете с кодом, у вас есть несколько других ресурсов. Ubuntu и его производные предлагают для программирования подпрограммы Си-мембраны, memusage и memusagestat.

Просто используйте manmbarrier, man memusage или man memusagestat, чтобы просмотреть страницы Руководства программиста Linux, посвященные этим важным процедурам. Если в будущих версиях библиотек будут обновления по мере выхода новых версий Ubuntu, то изменения всегда будут описаны здесь.

Если вам нужен графический контент, то memusagestat даже предлагает возможность сохранить графическое представление использования памяти в файл PNG. Это делает эту функцию привлекательной и для авторов утилит, поскольку ее можно использовать для создания приложений, которые регулярно проверяют утечки памяти.

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

Если вы планируете использовать это, не забудьте удалить строку include memprof из начала вашего кода, прежде чем выпускать его. Это используется, чтобы убедиться, что у вас нет утечек, но это не должно стать зависимостью, если вы упакуете свой код и выпустите его в репозитории.

4 минуты на чтение