2010-10-03 3 views
1

Приложение LAMP, похоже, в конечном итоге использует всю память моего сервера и место подкачки. Чувство моего чувства заключается в том, что оно имеет какое-то отношение к внешним процессам, которые я должен назвать (поскольку это единственный раз, когда проблема проявляется).Проблема с LAMP и памятью/подкачкой

Мне нужно постоянно называть GhostScript, ImageMagick «конвертировать», PDFTK и т. Д. Когда эти процессы работают, я вижу, что моя память заканчивается. Итак, вопросы:

  1. Какие методы следует использовать для окончательного определения того, какой процесс на самом деле вызывает проблемы с памятью? Мой план прямо сейчас состоит в том, чтобы запускать процессы индивидуально и просто наблюдать за использованием памяти с помощью команды * nix «top». Есть ли способ сделать это программно?

  2. Есть ли какие-либо варианты «промывки памяти», которые я могу использовать? Будет ли это хорошей идеей?

ответ

0

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

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

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

BTW: Не считайте пространство подкачки как «настоящую» память, ваше приложение должно работать без использования места подкачки. После того, как вы начнете удалять пространство подкачки, производительность снижается настолько быстро, что запрос начинает накапливаться, что приводит к увеличению объема памяти, что приводит к замене других вещей. Если вы видите, что выделено значительное пространство подкачки, увеличьте память (или купите более крупный план хостинга)

+0

Эти внешние процессы вызывают через PHP exec(). Означает ли это разветвление? Разве эти процессы не освобождают память, когда они будут сделаны? Или я должен это сделать? Как узнать, не освобождают ли они память? – StackOverflowNewbie

+0

Да, php exec использует fork для создания подпроцесса. Он освободит память, когда приложение будет выполнено, до тех пор, пока вы не перенаправляете файлы ввода/вывода, которые по той или иной причине блокируются. –

+0

Не могли бы вы рассказать о своем комментарии: «Решение этой проблемы - запустить небольшой резидентный скрипт/программу, прослушивающий сокет или именованный канал для запуска внешних программ».? – StackOverflowNewbie

Смежные вопросы