Траблы с апач
У меня возникли проблемы с апачем после увеличения посещаемости ресурса. Дело в том, что апач съедает всю память на сервере, в том числе весь свап в результате чего сервер умирает. Происходит это очень быстро - 4 гига опреративки + 4 гига свап сжираются буквально за считанные минуты. У меня стоят Linux, Apache 2 версии и PHP 5 установленный как модуль. Смотрел процессы - куча httpd каждая из которых отъедает от 30 до 50 Мб. Вариации с директивой в httpd.conf MaxRequestsPerChild ни к чему не привели. Читал, что если PHP установлен как модуль "пожирание" памяти случается, но рекомендуемое лечение (apache.child_terminate = 1 в php.ini и @apache_child_terminate в php скрипте) не помогли. Подскажите как с этим бороться? Не хотелось бы устанавливать php-cgi, так как сайт будет работать медленнее.
Очень прошу помочь.
Заранее спасибо.
как ставился Apache? какой контент отдает апач?
Апач отдает просто html код. Ничего сверхъестественного как говорится. Html генерируется через XSL в связке с PHP. Есть на сервере и скрипты работающие с изображениями. Но я не думаю что проблема в них.
Надо знать название и версию ОС, версию точную РНР и Apache. Нужно знать с какими параметрами компилировался РНР и апач. И самое главное - знать что именно делают скрипты. Ибо если как вы говорите ничего особенно не меняли - таких траблов быть не должно
ЗЫ ИМХО для никсов лучше использовать апач ветки 1.3.х - как-то с ним проблем меньше по личному опыту.
Какие никсы?
Точная версия апача и пхп?
на вскидку у вас образуются какие-то неубиваемые процессы, посмотрите, почему они зависают в стадии выполнения?
Apache 2.2.3
PHP 5.1.4
modrewrite может теоритически жрать память если правила для него написаны через зад...
'./configure' '--with-mysql' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-xsl=/usr' '--with-mssql=/usr/local' '--with-saprfc=/usr/local/lib' '--with-zlib=/usr' '--enable-track-vars' '--enable-trans-sid' '--with-jpeg=/usr' '--with-jpeg-dir=/usr/lib' '--with-png' '--with-gd' '--with-regex' '--with-unixODBC'
Про то как скомпилирован апач уже писал.
Правила для mod_rewrite написаны нормально. Затык в том, что апач плодит процессы. Если посмотреть на статистику запущенных им httpd то получается что активных несколько штук, а вот спящих (sleeping) около 200. Такое ощущение что апач резервирует их на всякий случай, но висят они напрасно и съедают память.
во-вторых - возможно, стоит раздавать картинки и прочую статику НЕ апачем?
кстати, кто рекомендовал вам использовать apache.child_terminate?
Допустим, у нас есть скрипт который работает и отедает некоторое кол-во памяти. И у нас есть пользователь на медленном канале. Пользователь заходит на сайт, кликает, у тебя отрабатывает апач, пхп и наверняка mysql. Это я к тому что пока пользователь не получит страницу апачевый потомок не освободит память пока скрипт не закончит свою работу.
Теперь, у тебя пара пользователей на медленном канале одновременно зашли, отъелось в 2 раза памяти, 10 юзеров - в 10 раз, все до тех пор хорошо пока железо тянет. Но наступает момент, как у тебя, он называется Spiral Down, когда железо несправляется на пиках.
Ну и пхп, не знаю как сейчас, но было такое что если он собран как апачевый модуль, он все равно считывает каждый раз скрипты с диска и не работает с кешем.
Вариан простой - нужно воткнуть прокси, т.е. сделать связку
юзер -> proxy -> рабочий апач (php)
юзер <- proxy <- рабочий апач (php)
для того что бы твои пхп апачи не ждали пока юзер все примет, а отдавали сгенерированный текст проксе.
GracefulShutdownTimeout
Директива убивает httpd независимо от того закончилась транзакция или нет. Установил значение равное 20. Думаю, это достаточно. Не знаю правда, что с теми у кого канал плохой. Пока не жаловались, значит все ОК. ;)
не думаю, что это умное решение. правильное решение - проверить нормальность работы ваших скриптов и если все нормально - ставить прокси
Абсолютно согласен - это не нормальное решение, но на первое время, пока не найду, где грабли, сойдет.