Из-за чего повышенное потребление памяти на VPS?

Добрый день, сложилась некоторая проблема на используемом VPS, может кто-то подскажет наиболее верное решение.
Есть скрипт загрузки пользователями изображений (предполагается до 10Мб), загрузка происходит
через AJAX фоном по 1 файлу. До этого момента все работает хорошо и красиво. После аплода делается кроп изображений, создание миниатюр и наложение вотермарка с использованием
расширения Imagick и график потребления памяти в панели хостинга растет ступенеобразно, было даже два падения VPS с ошибками в логе типа: Cannot allocate memory: fork: Unable to fork new process и PHP Fatal error: Out of memory (allocated 262144) (tried to allocate 261900 bytes) in Unknown on line 0. В этот момент тарифный план включал в себя 512 Mb (1024 Mb burst). Сервак падал при достижении гигабайта. Также периодически операция аплода для немаленьких файлов 5-7 Мб заканчивалась POST-ошибкой в консоль браузера.
По совету хостера был произведен апгрейд на 1024 Mb (2048 Mb burst) и файлы стали аплодиться и обрабатываться без ошибок, но память по-прежнему растет после каждой сессии загрузки файлов (5-7 штук) и не снижается впоследствии. Складывается ощущение, что рано или поздно она достигнет предела и все рухнет. Это при том условии, что не было еще релиза проекта и файлы аплодит 1 человек.
Собственно вопрос: в чем может быть проблема?
В использовании imagick или конфигах? Есть вариант поковырять конфиги, но не очень понятно пока что конкретно. Думаю о maxrequestsperprocess, maxprocesses и установке ulimit -s 1024. Или искать альтернативу imagick?
Заранее благодарен всем откликнувшимся.
  • Вопрос задан
  • 5360 просмотров
Решения вопроса 1
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
У вас openvz с некорректно настроенными лимитами на память. Просто переехайте на любую Xen/KVM виртуалку - digitalocean, flops, например.
Найти openvz-хостера с корректными лимитами на память посложнее будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
@rivalsm Автор вопроса
Спасибо за ответ, в данный момент все лежит на IntoVPS, который был выбран после некоторого количества прочтенных положительных отзывов. Выбирал между им и Hetzner'ом. Проще уехать, чем разобраться и договориться с хостером и его настройками?
Ответ написан
@rivalsm Автор вопроса
Небольшой отчет по тестам на Digitalocean. Взял 512MB и залил скрипты. Произвожу аналогичные действия — картинка аплодится, после чего скрипт делает кроп и создание двух миниатюр с использованием расширения Imagick. Гляжу память известным мне способом через free -m.
Состояние памяти до работы скрипта:
total used free shared buffers cached
Mem: 495 218 276 0 2 127
-/+ buffers/cache: 89 406
Swap: 0 0 0

После чего закидываю файл на загрузку и иду снова в шелл и начинаю усердно задрачивать free -m.
В момент загрузки файла особо ничего не меняется, после загрузки, очевидно начинают работать мои кропы и рисайзы, память резко подскакивает до пикового значения в 486 Мб.

used free shared buffers cached
495 490 5 0 2 263
224 271
0 0 0

И также резко опускается вниз. В данный момент спустя некоторое время работы скрипта уровень памяти вот такой.

total used free shared buffers cached
495 103 392 0 0 18
84 411
0 0 0

У Digitalocean нет графиков для памяти, поэтому похвастаться красивой картинкой не могу, но ситуация с памятью мне видится иной, чем на IntoVPS.
Ответ написан
opium
@opium
Просто люблю качественно работать
Сделайте профайлинг приложения по потреблению памяти и увидите кто или что её скушало.
Ответ написан
Комментировать
@rivalsm Автор вопроса
Несколькими сессиями загрузки файлов скушал и 2 Гб в течение часа вчера вечером.
На графике видно. Потребление памяти до сих пор на этом уровне.0o29.png
Ответ написан
Комментировать
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
@rivalsm
Прочитайте мой ответ к Повышенное потребление памяти на VPS
Ваше приложение может некорректно работать с памятью (не высвобождать её или ещё как-то некорректно себя вести), но Linux давно уже способен самостоятельно справляться с подобными ситуациями. В крайнем случае - всегда есть OOM, который сделает kill -9 части процессов и память снова появится. Cannot allocate memory означает то, что ваша виртуалка на самом деле не имеет указанного количества _физической_ памяти.
Сначала переезжайте на kvm, потом продолжайте копаться с приложением.

Ситуация "вся память занята" - абсолютно нормальна, и это не повод к "Cannot allocate memory" при форке.
Ответ написан
@rivalsm Автор вопроса
Результаты работы с памятью из мониторикса. В месте, где виден продолжительный подъем производились последовательные аплоды в течение некоторого промежутка времени.
В общем и целом из free видно, что уровень свободной памяти за вычетом бкферов и кэшей
остается на примерно одинаковом уровне в 390-400 мегабайт, из чего можно предположить,
что проблема была у хостера IntoVPS. По всей видимости, Влад @inkvizitor68sl оказался прав, за что ему огромное спасибо, а то я уже начал рвать волосы на голове и собирался идти к гадалке за выяснением причин возникновения проблемы.
liih.png
Ответ написан
ValdikSS
@ValdikSS
У вас, похоже, OpenVZ.
А сделайте-ка ulimit -s 1024 и перезапустите все демоны.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы