Что-то съедает всю память (я подозреваю утечку памяти в каком-то приложении). Как определить что?

16

У меня есть сервер, на котором работает пакет liquidsoap + icecast и простой веб-сайт (httpd + mysqld). Ничего особенного. Посетители около 2000+ в день, в среднем около 50 человек одновременно находятся в сети.

Сервер имеет 8 ГБ оперативной памяти. С течением времени объем свободной памяти постоянно уменьшается, хотя на сервере не запускается ничего нового и новых пользователей нет. В какой-то момент он начинает меняться, нагрузка на сервер увеличивается, и он перестает отвечать на запросы. Обычно я просто перезагружаю сервер ...

Что можно сделать, чтобы обнаружить, что именно утечки памяти? Я использую top для мониторинга использования ресурсов, но, насколько я вижу, он не показывает ничего полезного:

введите описание изображения здесь

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

jayarjo
источник
Любая причина, почему вы не пытаетесь перезапустить некоторые службы (apache, liquidsoap) вместо сервера?
jamespo
Я изначально отвечал за нормальное использование памяти. Я обновил набор инструментов, которые могут помочь выявить проблему.
BillThor
@jamespo, на самом деле я попробовал это, но это не имело никакого эффекта, так что перезагрузка была единственной вещью, которую я знал, что мог помочь
Джаярджо
Кэшированный 4027092k должен объяснить использование памяти, нет? Сейчас я работаю над подобной проблемой в другом месте, и до сих пор мне удалось выяснить, можно ли регулировать передачу памяти с помощью следующих параметров: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Это не полное исправление и любые отзывы наиболее желанный. Я надеюсь, что это правильное направление.

Ответы:

16

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

Вы можете использовать limit.conf, чтобы ограничить максимальный размер ядра программ. Правильно настроенный, это должно убить все программы, которые имеют утечку памяти. Это работает с модулем pam_limits. Пределы также могут быть установлены с помощью ulimitsкоманды.

Вы запускаете несколько программ, которые могут использовать большие объемы памяти. Некоторые вещи, которые вы можете посмотреть, включают в себя.

  • Плохо запрограммированные приложения, работающие под, apache2могут вызвать утечку памяти. Вы должны увидеть увеличение объема памяти, когда это произойдет. Вы можете настроить apache2 для утилизации детей после определенного числа использований, установив MaxRequestsPerChildзначение 100 или около того. Если это решит проблему, то вам необходимо устранить утечку. Я бы посмотрел это в первую очередь.
  • MySQL может попытаться загрузить данные в память. Если у вас много данных в памяти, это может вызвать некоторую порчу, но не должно быть таким драматичным, как вы видите.
  • Если у вас установлена ​​большая tmpfsфайловая система, вы можете потерять память, если файлы не удаляются при использовании. Большие долгоживущие файлы также могут быть проблемой.
  • Если проблема возникает примерно в одно и то же время суток, возможно, у вас есть запланированная программа, в которой происходит утечка памяти.
  • Если у вас есть программа, которая выделяет общую память, но не освобождает ее перед выходом, у вас будет относительно невидимая утечка памяти. Если общая память заблокирована в памяти, это может привести к обмену. Объем доступной разделяемой памяти обычно относительно ограничен.
  • У пакета liquidsoap + icecast могут возникнуть проблемы с буферизацией, использующие память. Я не использовал эту комбинацию, поэтому я не уверен, как это будет выглядеть.

Нормальное использование памяти: Свободная память - это не то, чего вы хотите. Если ваша система работала долгое время и имеет много свободной памяти, значит что-то не так. Каждый раз, когда вы читаете или пишете файл, блоки попадают в буферный кеш. Это уменьшит вашу свободную память, и это хорошо. В системе будет достаточно свободного места для запуска нескольких программ без поиска места в другом месте. Поскольку многие программы работают быстро, их память будет возвращена в свободный пул, когда они прекратят работу.

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

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

BillThor
источник
Проблема в моем случае довольно странная. Даже когда нагрузка огромна и сервер сильно переставляет, свободной памяти достаточно (как я понял после прочтения о буферах и кэшах). top не показывает какой-либо процесс захвата памяти все чаще. Но нагрузка возрастает, и в какой-то момент сервер становится непригодным для использования: | Спасибо за подробный ответ.
Джаярджо
2
@jayarjo: Munin и sar должны помочь определить, что происходит. Если у вас много свободной памяти, вы не должны обмениваться. У вас может быть другая проблема ввода / вывода. sarпоможет определить, какой раздел имеет ввод / вывод, и может помочь обнаружить проблему.
BillThor
+1 за советы MaxRequestsPerChild
jamespo
11

Вы можете использовать эту команду для просмотра 10 лучших приложений, касающихся использования оперативной памяти:

ps -A --sort -rss -o comm,pmem | head -n 11

Иногда эта команда помогает вам, если было создано много подпроцессов:

ps auxf

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

Рафаэль Лютигер
источник
Это удобные команды, спасибо, я отмечу их на будущее. Но проблема в том, что сверху всегда одни и те же процессы (вы можете увидеть их на прикрепленном скриншоте) - apache, mysql, liquidsoap, icecast. И они используют (или, по крайней мере, показывают, что используют) тот же объем памяти (на самом деле ничтожно мал), даже когда сервер умирает от нагрузки: |
Джаярджо
@jayarjo: Меняется ли количество процессов? У тебя намного больше процессов? И это физический сервер или виртуальный?
Рафаэль Лютигер
Я не заметил каких-либо изменений в количестве процессов. В основном, когда я выполняю top, когда сервер умирает от нагрузки, я вижу картинку, очень похожую на ту, что я прикрепил в исходном вопросе, за исключением огромной нагрузки: | Сервер физический.
Джаярджо
2
Попробуйте получить больше информации с помощью "vmstat" (например, vmstat -s). Или с уже упомянутым инструментом "Сар". Может быть, у вас есть файловая система на основе ОЗУ? Тогда, возможно, "iostat" может дать больше информации.
Рафаэль Лютигер
1
Я сомневаюсь, что поле «pmem» (% MEM) на входе psили topвыходе - это то, на что нужно обратить внимание при попытке обнаружить утечку памяти: разве это не только процент физической памяти, используемой процессом в настоящее время? Но другие части используемой (включая утечку) памяти процесса могут быть выгружены. Возможно, «размер» или «vsize» будет более подходящим для измерения размера процесса? Например, ps -A --sort -size -o comm,size | head -n 11илиps -A --sort -vsize -o comm,vsize | head -n 11
imz - Иван Захарящев
8

Ничто не использует эту память с точки зрения приложений.

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

В основном это хорошее управление памятью, и это в идеале то, что вы хотите.

Смотрите ссылку здесь для получения дополнительной информации: http://www.linuxatemyram.com/

Мэтью Ифе
источник
Да нашел эту ссылку и прочитал о буферах и кешах, но насколько я могу судить по тому, что я прочитал, они не могут вызвать обмен, не так ли?
Джаярджо
@jayarjo Я думаю, чтобы понять, что там происходит, нам нужна статистика, демонстрирующая проблему. Числа, которые вы дали, не показывают перестановки или большого использования памяти.
Мэтью Ифе
1

Я не профессионал в этом деле, но жидкое мыло + icecast связано с мультимедиа. Когда система свободна, она кэшируется и / или занимает память для будущего использования. И если трафик увеличивается в определенное время дня / в течение определенного периода времени, то он начнет обмениваться. На этом этапе, если количество запросов (пользователей, просматривающих контент) увеличивается, то необходимые ресурсы будут более 8 ГБ ОЗУ.

Яши
источник