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

mfl

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

Скрипт запускается по cron.
В результате работы скрипта, процесс php-cgi который обрабатывает данный скрипт, постепенно увеливиает обьем потребляемой памяти. При поглощении всей свободной памяти, процесс прерывается.
В php.ini установлено memory_limit = 32M, но память потребляемая процессом превышает это ограничение почти в 10 раз

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

С переодичностью в 900 секунд проверялась память в самом скрипте:
Значения параметров
memory_get_usage() колебалось в пределах 524996 - 650544
memory_get_usage(true) колебалось в пределах 1572864 - 2359296
При этом значения не менялись по возрастающей, последующие значения могли быть как больше так и меньше текущих.

Командой top отслеживалась потребляемая процессом php-cgi память.
Наблюдалось постепенное увеличение потребляемой процессом памяти, которое заканчивалось поглащением всей свободной оперативной памяти (~300mb)

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

Спасибо.
 

AmdY

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

mfl

Новичок
AmdY, спасибо за ответ.
Сейчас буду смотреть ошибки.
А почему это нормально? Разьве процесс не должен прерываться при достижении 32 mb?

-~{}~ 28.02.09 21:18:

В общем запускал скрипт с отображением всех ошибок.
Ни одной ошибки зафиксировано не было. Даже ни одного NOTICE

В чем еще может быть пречина?
 

DiMA

php.spb.ru
Команда форума
где написано, что memory_limit имеет отношение к операционной системе и кол-ве выделенной настоящей вирутальной памяти? Это сам пхп решает, вылез ли скрипт за этот размер.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
странно: ты можешь "Наблюдать постепенное увеличение потребляемой процессом памяти", т.е. про дебаг ты знаешь,
но задаешь вопрос, для ответа на который нужна телепатия, хотя поможет только детальный нудный дебаг
 

korchasa

LIMB infected
mfl
Из серии "хорошо бы проверить": а в самом скрипте лимит точно не устанавливается?
 

mfl

Новичок
korchasa, нет лемит точно не устанавливается.

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

fixxxer

К.О.
Партнер клуба
потребление памяти скриптом и процессом php -- это две большие разницы.

второе ограничивают средстами ОС (man setrlimit).
 

mfl

Новичок
tashkentchi, да это именно php-cgi. В принципе и нет разницы как запускать скрипт, по крону, через командную строку, или через через браузер. Результат один и тот же.

fixxxer, спасибо за ответ, теперь уже знаю.

-~{}~ 01.03.09 18:24:

Короче, нашел причину. Все дело в функции strtotime. Без преобразовавыния даты, процесс не увеличивает размер потребляемой памяти.
Для того, чтобы на 100% убедиться в своих выводах, запустил скриптик
PHP:
<?php
while(true) { $t = strtotime('03.02.2009, 01:04'); }
?>
Процесс занял всю свободную память (300 мб) практически за 20 сек. и завершился.

Теперь надо думать, как это можно исправить.

-~{}~ 01.03.09 18:35:

Да собственно, все понятно. Стоял PHP v 5.2.8

Нашел информацию по PHP v 5.2.9
...
Исправлена ошибка #46889 (Утечки памяти в strtotime())

Всем спасибо за помощь.
 

korchasa

LIMB infected
Автор оригинала: mfl
...
Исправлена ошибка #46889 (Утечки памяти в strtotime())
Вот после таких вещей и появляется недоверие к языку. Хоть свои тесты на утечки пиши.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
korchasa
предлагаешь перейти на ассемблер?
 

korchasa

LIMB infected
Автор оригинала: grigori
korchasa
предлагаешь перейти на ассемблер?
...
много-много холивара
...

Просто не очень приятно видеть ошибки такого рода в релизах. Не в том смысле, что писать надо без ошибок, а в критериях работоспособности.

Откуда можно вырвать справочник функций PHP с параметрами, в каком-то более-менее легком для разбора виде?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Да еще бы, просто в реальном мире всегда есть вопрос выбора.
У какой web-ориентированной платформы точно нет проблем с памятью, гибкостью, универсальностью и потреблением ресурсов? C#/Java/ROR/Python/Perl ? Нет таких, а жить надо сегодня.
"И на солнце бывают пятна" (С)

>Откуда можно вырвать справочник функций PHP с параметрами, в каком-то более-менее легком для разбора виде?

В Зенд-студии есть файлы функций с описаниями для автокомплита.
 
Сверху