Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "Apache - утечка памяти..."
16.11.2006 10:08
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюApache - утечка памяти

Сервер, на котором поселился ваш любимый ткардс, обрабатывает оч большое число запросов, и когда по тем или иным причинам время выполнения скрипта большое, вырастает огромная очередь из клиентов, которые ожидают, и параллельно все ломятся и ломятся новые.
Хоть и стоит на апаче ограничение в 1000 параллельных запросов, все равно происходит какая-то утечка памяти, съедается своп и мертвый висяк происходит.
Как с этим бороться, я не знаю, разве что вот такой очень жесткий вариант, скрипт, который следит за памятью и свопом, и если кончаться начинает, перезапускает апач.

# cat mem.monitor
#!/bin/bash
SWAP=`cat /proc/meminfo |grep SwapFree |sed -re 's/(^[a-zA-Z\:]*\s+)|(\s+[a-zA-Z]*$)//g'`
MEM=`cat /proc/meminfo |grep MemFree |sed -re 's/(^[a-zA-Z\:]*\s+)|(\s+[a-zA-Z]*$)//g'`
TOTAL=`expr $SWAP + $MEM`
if [ $TOTAL -lt 204800 ]
then
/etc/init.d/apache2 stop
PROC=`ps -ef |grep apache`
while [ `expr length "$PROC"` -gt 0 ]
do
echo "waiting"
sleep 1
PROC=`ps -ef |grep apache`
done
/etc/init.d/apache2 start
fi


Есть какие-нить мысли у кого по этой теме?
20.11.2006 00:40
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюApache - утечка памяти

Есть подозрение, что это mod_php память не освобождает, хочу попробовать скрипт переписать на perl и заюзать его в режиме cgi, fastcgi или под mod_perl, посмотрим, что будет быстрее/надёжней.
29.11.2006 18:13
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюApache - утечка памяти

В общем, путем долгих тестов и экспериментов причину удалось понять.
Во всем виноват multi-threading, непонятно по каким причинам подвисали эти треды, и вешали целый процесс, не освобождая при этом память. Тем паче, что скрипт мой работает с сокетами, тут ух синхронности потоков никак не достичь, стопудняк возникал дедлок или еще какие прочие радости.
Варианты решения - отключаем на апаче режим worker (когда на один child запускается несколько потоков) и используем режим prefork (один процесс - один поток). И теперь поддержка threads ни на php, ни на mod_perl не нужна (перл кстати тоже не выдержал испытания ).
Что меня удивило - казалось бы, однопоточный режим должен быть тормознее, ан нет! Процессор грузится вдвое меньше в режиме prefork, память освобождается, когда апач киляет child, все тип-топ.
Так и оставим.

P.S. Еще остался для тестов режим fastcgi для исполнения перловых скриптов, тогда он не покатил из-за того, что апаче вообще умирал напрочь, наверное, тоже из-за deadlock'а в потоках, посмотримс, но это позже.