Процесс php-cgi жрет память более отведенного лимита

12 3
mfl
На сайте с 16.10.2006
Offline
134
mfl
4077

Скрипт запускается по cron.

В результате работы скрипта, процесс php-cgi который обрабатывает данный скрипт, постепенно увеливиает обьем потребляемой памяти. При поглощении всей свободной памяти, процесс прерывается.

В php.ini установлено memory_limit = 32M, но память потребляемая процессом превышает это ограничение почти в 10 раз

Да и не может сам скрипт такой обьем набрать.

максимум метра 2 по моим подсчетам.

Я так понимаю, значение параметра memory_limit распространяется именно на скрипт, а не на процесс, который обрабатывает данный скрипт.

Теперь вопрос, почему сам процесс php-cgi так поглащает оперативную память? Как это можно исправить?

Спасибо.

malls
На сайте с 08.08.2005
Offline
255
#1

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

Если скрипт жрет 320Мб - я бы попытался переписать скрипт...

mfl
На сайте с 16.10.2006
Offline
134
mfl
#2

во всех переменных скрипта максимум 2 мб, не может он столько жрать. Даже если не делать запросов к БД, потребляемая память не уменьшается.

Нарастание потребляемой памяти происходит постепенно, но в самих переменных скрипта обьем памяти не увеличивается.

malls
На сайте с 08.08.2005
Offline
255
#3
mfl:
во всех переменных скрипта максимум 2 мб, не может он столько жрать. Даже если не делать запросов к БД, потребляемая память не уменьшается.

Нарастание потребляемой памяти происходит постепенно, но в самих переменных скрипта обьем памяти не увеличивается.

Т.е. вы про чудеса в программировании только что написали?

Про те которых быть не может, вместо них баги только бывают....

Если есть переменных 4 штуки, каждая по 2Мб, то хоть убейся скрипт никак больше 10 Мб жрать не должен. А у вас 320 - как это обозвать?

mfl
На сайте с 16.10.2006
Offline
134
mfl
#4

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

Скрипт работает порядка 6 часов (~ 200 секунд процессорного времени), за это время процесс php-cgi с ~10мб возрастает до ~300мб и прерывается, в связи с поглощением всей свободной памяти.

Еще хотел спростиь, memory_limit ограничивает именно память процесса php-cgi? или память скрипта?

N
На сайте с 06.05.2007
Offline
419
#5

Поставьте для начала в скрипте переодический вывод memory_get_usage(0)

По крайней мере узнаете в php ли логическая ошибка или из самого интерпретатора "течет". Еще расширения могут быть дефектные. Они могут получать память из кучи php, а могут сами по себе.

Нетрадиционное это дело на php демоны писать. Поэтому низкая вероятность, что найдут и пофиксят специфичные для этого режима работы баги. Может переписать чтобы работало порциями?

memory_limit - ограничивает память интерпретатора скрипта. есть еще системные лимиты на память (те, которые ulimit).

у вас падает с какой диагностикой? появляется ошибка в php и просто сигнал ?

Кнопка вызова админа ()
Skom
На сайте с 02.12.2006
Offline
165
#6

А он так делает только если по крону стартует или если руками тоже?

Cras amet qui numquam amavit quique amavit cras amet
kxk
На сайте с 30.01.2005
Offline
970
kxk
#7

mfl, А что за железка у вас может у вас впс оверселенный до безумия или пароц VIA C3, мы тут не экстрасенсы, озвучьте уж заодно аппарат

Ваш DEVOPS
malls
На сайте с 08.08.2005
Offline
255
#8
mfl:
Скрипт работает порядка 6 часов

убица ап стену...

если б у меня скрипт PHP столько времени работал - первое что я сним сделал бы - удалил бы нафиг.

1. Разделяйте скрипт на части

2. Смотрите количество переменных в нем и по возможности втыкайте unset() везде.

3. Скрипт скорее всего циклично что-то грабит, если делает это не через CURL/сокеты - резать к чертовой матери не дожидаясь перитонитов.

4. Переменные живут все время работы скрипта, если вы циклично что-то грабите и у вас в процессе возникает $param[$i] который сам по себе не больше 2Мб, но таких сохранений образуется дофига, а вы их не удаляете сразу после итерации - вот вам и любое количество мегабайт на выходе. Выходы: - 1. сократить количество итераций, 2. писать переменные в базу/файлы, а не в память и т.п.

kxk:
mfl, А что за железка у вас может у вас впс оверселенный до безумия или пароц VIA C3, мы тут не экстрасенсы, озвучьте уж заодно аппарат

Да какая разница? Железка важна когда мы не знаем сколько пользователей будут юзать наши нагруженные сервисы. А когда мы собственными руками создаем PHP коды работающие по 6 часов - то тут никакая железка не поможет...

Возьми крутую, назавтра будем писать - помогите, что-то не так, скрипт работает 16 часов - жрут память...

Вывод - собственнные служебные задачи должны запускаться "на калькуляторе", если это не так - то их надо переписывать. И железки тут вторичны.

mfl
На сайте с 16.10.2006
Offline
134
mfl
#9
Поставьте для начала в скрипте переодический вывод memory_get_usage(0)

Сейчас буду проверять, спасибо за подсказку.

А он так делает только если по крону стартует или если руками тоже?

Без разницы. Итог один и тот же.

mfl, А что за железка у вас может у вас впс оверселенный до безумия или пароц VIA C3, мы тут не экстрасенсы, озвучьте уж заодно аппарат

VPS: CPU 900 MHZ, Оперативка: 384 Mb

На счет оверселлинга, не замечал, сайты работают быстро.

Смотрите количество переменных в нем и по возможности втыкайте unset() везде.

да так и делаю, в каждой итерации пременные удаляются.

Скрипт скорее всего циклично что-то грабит

Именно так, обновление через CURL. Переменные по завершении итерации удаляются.

В общем. сейчас буду тестить с memory_get_usage(0).

Тогда вопрос, почему скрипт игнорирует значение установленное в memory_limit?

N
На сайте с 06.05.2007
Offline
419
#10
mfl:
Тогда вопрос, почему скрипт игнорирует значение установленное в memory_limit?
mfl:
VPS: CPU 900 MHZ, Оперативка: 384 Mb

потому и игнорирует, что памяти вообще никакой нет.

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий