Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ps auxf

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

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

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

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

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

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