|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 66772.7701 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
02.01.2011, 14:16
|
#1
|
Кролик
Регистрация: 15.08.2007
Сообщений: 297
Бабло: $37345
|
Утечка памяти в php
Чет вообще не везет.
Решил нагенерить >1лям страниц для доров, ды вот беда, где-то в коде идет утечка памяти, и после 20к страниц пхп сжирает всю память и вылетает.
Мож есть какие-нибудь тулзы для автоматического выявления утечек в коде?
А то ручками уже второй день копаюсь, так и не нашел от куда ноги растут.
|
|
|
02.01.2011, 14:29
|
#2
|
Бабло победит зло
Регистрация: 20.06.2008
Сообщений: 2,579
Бабло: $346045
|
Цитата:
Сообщение от Foma
Чет вообще не везет.
Решил нагенерить >1лям страниц для доров, ды вот беда, где-то в коде идет утечка памяти, и после 20к страниц пхп сжирает всю память и вылетает.
Мож есть какие-нибудь тулзы для автоматического выявления утечек в коде?
А то ручками уже второй день копаюсь, так и не нашел от куда ноги растут.
|
Сходу нагуглил:
Это не утечка памяти, а особенности работы с памятью mod_php. Если процесс использовал какой-то объем памяти, а потом освободил ее, то эта память физически не освобождается, а остается за процессом и будет использована в случае повторых запросов памяти. И так для каждого httpd процесса, если у тебя их 100, то рано или поздно все 100 будут занимать столько сколько по максимому запросит php скрипт в рамках каждого дочернего httpd.
Методы лечения:
1. Требовательные к памяти запросы выполнять не через mod_php, а через cgi-версию php.
2. Поставить memory_limit и похоронить жрущие память скрипты (для массового хостинга подходит).
3. Поставить MaxRequestsPerChild 1
4. Использовать два апаче, первый, бэкенд, с mod_php и ограничением на число клиентов в 5-10, второй, легкий фронтенд, с mod_accel или на nginx вместо apache, который будет пронимать запросы от клиентов и переправлять в бэкенд.
|
|
|
02.01.2011, 14:30
|
#3
|
Бабло победит зло
Регистрация: 20.06.2008
Сообщений: 2,579
Бабло: $346045
|
|
|
|
02.01.2011, 14:36
|
#4
|
Кролик
Регистрация: 15.08.2007
Сообщений: 297
Бабло: $37345
ТС -->
|
ТС
Цитата:
Сообщение от JackSoft
Сходу нагуглил:
Это не утечка памяти, а особенности работы с памятью mod_php. Если процесс использовал какой-то объем памяти, а потом освободил ее, то эта память физически не освобождается, а остается за процессом и будет использована в случае повторых запросов памяти. И так для каждого httpd процесса, если у тебя их 100, то рано или поздно все 100 будут занимать столько сколько по максимому запросит php скрипт в рамках каждого дочернего httpd.
Методы лечения:
1. Требовательные к памяти запросы выполнять не через mod_php, а через cgi-версию php.
2. Поставить memory_limit и похоронить жрущие память скрипты (для массового хостинга подходит).
3. Поставить MaxRequestsPerChild 1
4. Использовать два апаче, первый, бэкенд, с mod_php и ограничением на число клиентов в 5-10, второй, легкий фронтенд, с mod_accel или на nginx вместо apache, который будет пронимать запросы от клиентов и переправлять в бэкенд.
|
Спасибо, покопаю в этом направлении...
|
|
|
02.01.2011, 17:45
|
#5
|
Senior Member
Регистрация: 11.11.2009
Сообщений: 362
Бабло: $71310
|
Цитата:
Сообщение от Foma
Чет вообще не везет.
Решил нагенерить >1лям страниц для доров, ды вот беда, где-то в коде идет утечка памяти, и после 20к страниц пхп сжирает всю память и вылетает.
Мож есть какие-нибудь тулзы для автоматического выявления утечек в коде?
А то ручками уже второй день копаюсь, так и не нашел от куда ноги растут.
|
1. проапдейть софт (apache\php\eaccelerator итд). имхо это первое с чего нужно начинать.
2. что значит "пхп вылетает"? Работает как cli или mod_php?. смотри что в логах. Если скрипт отваливается изза ограничения по памяти в php.ini (обычно там 32м) то тебе скорее всего нада попробовать оптимизировать свой код (ибо 32м это реально дохуя) и возможно повысить этот лимит.
|
|
|
02.01.2011, 17:55
|
#6
|
сам иди в жопу!
Регистрация: 02.05.2009
Сообщений: 672
Бабло: $81580
|
А поэтапно запускать не вариант? Памяти побольше для php выделить.
|
|
|
02.01.2011, 17:58
|
#7
|
Кролик
Регистрация: 15.08.2007
Сообщений: 297
Бабло: $37345
ТС -->
|
ТС
Оно 500 метров оперативы сжирает, и больше не может выделить.
Хз что такое, везде переменные ручками очищаю на каждом заходе, а память все равно течет.
|
|
|
02.01.2011, 20:18
|
#8
|
Senior Member
Регистрация: 29.03.2009
Сообщений: 687
Бабло: $95875
|
Сколько стоит MaxRequestsPerChild?
|
|
|
03.01.2011, 08:20
|
#9
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
ну если действительно в алго проблема, то его дебажить надо
если генерится 1кк страниц, значит есть цикл, может в теле цикла переменная/объект копится и достигает немыслимых размеров. Попробуй внутри тела цикла коментить строки, чтобы вычислить примерно какой функционал все портит.
Ну и фунции пхпшные по памяти посмотри, там есть какие-то, которые статистику выводят, сколько занято/свободно
|
|
|
03.01.2011, 20:08
|
#10
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,230
Бабло: $247845871
|
полюбому дело в коде, но иногда просто не видишь ошибку в упор.
|
|
|
|