PHP Fatal error: Out of memory

12
M
На сайте с 22.02.2007
Offline
103
10377

Есть сервер под линуксом. Фронтэндом стоит nginx, раздает статику. Динамику раздает апач 1.3.41 + php 5.2.8

Сайт довольно нагруженный, но ресурсов пока хватает.

Памяти 4G, в настройках php memory_limit установлено 32M

C недавних пор стали валиться ошибки:

1. PHP Fatal error: Out of memory (allocated 1835008) (tried to allocate 77824 bytes) in xxx.php on line 3187

2. PHP Fatal error: out of dynamic memory in yy_create_buffer() in Unknown on line 0

1-я выдается в абсолютно произвольных местах на разных исходниках. Правда все исходники указывают только на движок форума (phpbb 3.0).

Ошибки никак не связаны с пиками нагрузки и появляются даже в абсолютный минимум ее.

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

memory_limit пробовал увеличивать до 64M, но результат не меняется. В инете ничего конкретного на этот случай не нашел :(

Подскажите плз, в какую сторону копать для решения проблемы?

kxk
На сайте с 30.01.2005
Offline
990
kxk
#1

Maxxi, Выложите результат команды TOP или Atop

Ваш DEVOPS
Boris A Dolgov
На сайте с 04.07.2007
Offline
215
#2
Maxxi:
Есть сервер под линуксом. Фронтэндом стоит nginx, раздает статику. Динамику раздает апач 1.3.41 + php 5.2.8
Сайт довольно нагруженный, но ресурсов пока хватает.
Памяти 4G, в настройках php memory_limit установлено 32M

C недавних пор стали валиться ошибки:
1. PHP Fatal error: Out of memory (allocated 1835008) (tried to allocate 77824 bytes) in xxx.php on line 3187
2. PHP Fatal error: out of dynamic memory in yy_create_buffer() in Unknown on line 0

1-я выдается в абсолютно произвольных местах на разных исходниках. Правда все исходники указывают только на движок форума (phpbb 3.0).
Ошибки никак не связаны с пиками нагрузки и появляются даже в абсолютный минимум ее.

После каких действий появились ошибки - я не заметил. Единственное, на сайте стоит cpanel, которая периодически обновляется. Но апач и пхп она сама не обновляет.
memory_limit пробовал увеличивать до 64M, но результат не меняется. В инете ничего конкретного на этот случай не нашел :(
Подскажите плз, в какую сторону копать для решения проблемы?

php как модуль или как cgi?

копайте в сторону ulimit/rlimit.

С уважением, Борис Долгов. Администрирование, дешевые лицензии ISPsystem, Parallels, cPanel, DirectAdmin, скины, SSL - ISPlicense.ru (http://www.isplicense.ru/?from=4926)
N
На сайте с 06.05.2007
Offline
419
#3

Первая ошибка - точно превышение memory_limit. возможно, вы на самом деле не смогли увеличить эту настройку php.

Кнопка вызова админа ()
Boris A Dolgov
На сайте с 04.07.2007
Offline
215
#4
netwind:
Первая ошибка - точно превышение memory_limit. возможно, вы на самом деле не смогли увеличить эту настройку php.

Fatal error: Allowed memory size of x bytes exhausted (tried to allocate n) - при превышении memory limit.

Fatal error: Out of memory (allocated x) (tried to allocate n bytes) - при неудачном malloc (или что он там делает).

M
На сайте с 22.02.2007
Offline
103
#5
kxk:
Maxxi, Выложите результат команды TOP или Atop

Результат могу выложить чуть позже, но там ничего криминального нет. Сверху ~5 процессов апача, ниже nginx. Проц загружен до 40%.

Maxxi добавил 26.03.2009 в 16:01

netwind:
Первая ошибка - точно превышение memory_limit. возможно, вы на самом деле не смогли увеличить эту настройку php.

phpinfo показывает то значение, которое я ставлю в конфиге.

Если бы это было превышением memory_limit, то значение allocated + tried to allocate должно было превышать установленное, но оно далеко не дотягивает.

php установлен как модуль.

M
На сайте с 22.02.2007
Offline
103
#6

Вроде, поборол я свою беду..

Если кому интересно, поделюсь.

Сначала оказалось, что база mysql (innodb) уже не влезала в память. Увеличил под нее место. Лог ошибок значительно уменьшился, но все равно иногда выскакивали.

Затем уменьшил MaxRequestsPerChild с 10000 до 1000 (в десять раз) - ошибки исчезли.

А вот как выглядят диаграммы выделения памяти при MaxRequestsPerChild 10000 и 1000 соответственно:

png memory-day_03_30.png
png memory-day_03_31.png
M
На сайте с 22.02.2007
Offline
103
#7

Я так понимаю, что при больших MaxRequestsPerChild память потихоньку утекает. При 0 она вообще постепенно вся съедается. Но вопрос - куда?? Неосвобождение в php скриптах? так ведь php сам после завершения скрипта все должен освобождать. Какие еще варианты?

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

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

Обычно это правильная стратегия, ведь каждому следущему запросу вероятно потребуется столько же памяти сколько и предыдущему.

Регулируйте, раз нашли как :) MaxClients тоже неплохо бы подобрать не очень большое.

M
На сайте с 22.02.2007
Offline
103
#9
netwind:
Утечкой памяти называют совсем другое поведение. Здесь просто потомки apache потребляют память, но не отдают отбратно операционной системе при каждом запросе. Чем потомок больше работает - тем больше шансов на разрастание.
Обычно это правильная стратегия, ведь каждому следущему запросу вероятно потребуется столько же памяти сколько и предыдущему.

Т.е. если потомок вырос скажем до 500 мб, то это означает, что на обработку какого-то из запросов потребовалось столько памяти?

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

Maxxi, именно так. если конечно нет утечки, но это уже форс-мажор.

Кое-какой выход я тут предложил /ru/forum/comment/4565475.

12

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