Задать вопрос

Потребление памяти после апдейта с PHP 5.2 до 5.3?

Столкнулся со странным после апдейта с 5.2 до 5.3 (5.2.10 до 5.3.10, mod_php, x86_64). Есть тяжелые скрипты, которые потребляют много памяти, на 5.2 стоял лимит 2гб памяти для скриптов, на 5.3 они падают по причине недостатка памяти. Экспериментальным путем установил, что после апдейта там где раньше хватало менее 2гб теперь требуется 8.6гб.


Погуглил и ничего подобного не нашел, может сталкивался кто с подобным? В релизнотах нет упоминаний об увеличенном потреблении.


К сожалению, на 5.2 тот же код не могу отпрофилировать, сейчас на 5.3 на каждый элемент массива, где элементом вытупает stdClass с тремя полями по 25 символов в среднем, потребляет под 1кб памяти, что до безобразия много.

UPD. curl не используется и т.п., проблема явно в другом. Я вижу два варианта: 1) расход памяти под обьекты stdClass вырос; 2) gc по неведомой причине не чистит память.

UPD2. После множества тестов установлено, что gc не виноват, это у 5.3 потребление памяти нереальное и превосходит все возможные пределы. Такой вот код на PHP потребляет 3181МБ памяти, а вот код на python (2.6.6) сьест всего 1648МБ памяти. Но python код выполняется 1 мин 38 сек, когда пхп код выполняется 14 сек. Оффтоп, но почему медленно так работает python код? На python 3.2.2 время 16.3 сек, а потребление памяти — 2352МБ. Глобальная тенденция к увеличению потребления памяти.
  • Вопрос задан
  • 3302 просмотра
Подписаться 8 Оценить 3 комментария
Решения вопроса 1
homm
@homm
Вам не кажется, что вы выбрали не тот инструмент для своей задачи?
Ответ написан
Пригласить эксперта
Ответы на вопрос 8
@edogs
Гугл говорит нечто бредовое «PHP 5.3.0 and up has a better garbage collector but it is disabled by default. To enable it, you must call gc_enable() once.», но возможно в этом дело?
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Хм. А как вы выставили лимит в 9 гб? Оно же в сегфолт падает при лимите выше 2.3?
Ответ написан
prairie_dog
@prairie_dog
Я как-то случайно забыдлокодил код, в котом была рекурсия. На 5.2 — этот скрипт работал и достигал лимита памяти, под 5.3 работал аналогично, но лимит по памяти достигался быстрее. Вся память, как я полагаю, уходила на то, что бы запоминать точку возврата и, возможно, на контекст. Расскажите подробнее о скрипте, какие библиотеки используются, если упомянутый curl, хотя бы строку на которой достигается лимит.
Ответ написан
Eternalko
@Eternalko
> На каждый элемент массива.

Похоже тут проблема. Это скорее всего garbage collector барахлит.

Попробуйте замерять потребление памяти на тестовой выборке с помощью:
echo memory_get_usage() / 1024 / 1024;

А потом в циклах, где данные используются, попробуйте ручками всюду unset поставить.
Ответ написан
taliban
@taliban
php программист
1. habrahabr.ru/blogs/php/137860/ — Такой способ немного уменьшит потребление памяти, но это при условии что память выжирает только работа с бд
2. php.net/manual/ru/function.mysql-free-result.php Обратите внимание на последний камент (по хронологии он первый) Причем второй сверху камент подтверждает такой же глюк. Проверьте этот вариант тоже.
Ответ написан
@vivo
$ python -V
Python 2.7.2+
$ time python py.py
Memory used: 900.89MB

real 0m13.582s
user 0m12.929s
sys 0m0.588s

$ php -v
PHP 5.3.6-13ubuntu3.6 with Suhosin-Patch (cli) (built: Feb 11 2012 02:17:16)
$ time php php.php
Memory used: -1742.00 MB

real 0m13.998s
user 0m12.365s
sys 0m1.512s
Ответ написан
Комментировать
После Вашего вопроса искал причину такого возрастания памяти и нашёл интересную статью, вот её перевод.
Ответ написан
Sannis
@Sannis
Нда, хорошо не стали переходить на 5.3. Надо будет перед этим покопаться, отчего так происходит.
Ответ написан
Ваш ответ на вопрос

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

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