Apache убивает систему

Discussion in 'Linux, Freebsd, *nix' started by svesve, 22 Sep 2009.

  1. svesve

    svesve Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    574
    Likes Received:
    86
    Reputations:
    11
    Имеем:
    Freebsd 7.0
    Apache/2.2.8
    nginx/0.5.35 - как проксирующий веб сервер

    Проблема:

    Проведем тест при помощи ab (apache benchmark)

    PHP:
    ap -n 10 -c 10 http://host/


    при тестах от -n 30-100 -с 30-100 серваку становится очень плохо и он грубо говоря ложиться напрочь
    судя по top порождается куча процессов (httpd) и далее ахтунг полный

    для соединений 80 порта на фаере прописан keep-state

    PHP:
    allow tcp from any to me dst-port 80,443 setup keep-state


    переломал всю голову, куда копать?
     
  2. freelsd

    freelsd Elder - Старейшина

    Joined:
    25 Oct 2007
    Messages:
    108
    Likes Received:
    25
    Reputations:
    10
    Насколько я понимаю, это лавинное порождение детей у апача. Не справляются, он рождает больше и тд...
    Попробуй здесь поиграться:

    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxClients 150
    MaxRequestsPerChild 0
     
  3. ghostwizard

    ghostwizard Member

    Joined:
    4 Dec 2005
    Messages:
    127
    Likes Received:
    36
    Reputations:
    21
    У тебя не настроен как надо апач. Убери вообще нафиг keep-alive. Поменяй настройки для дочерних процессов.

    MinSpareServers, MaxSpareServers - отвечают за минимум и максимум дочерних процессов в ожидании. [1]

    Т.к. судя по всему что у тебя апач дефолтный, то MaxClients означает для prefork максимальное кол-во дочерних процесов, если у тебя это значение в нуле, то они рождаются до бесконечности.

    MaxRequestsPerChild - тут понятно, сколько запросов обрабатывает один дочерний процесс. [2]

    В твоем случае, за всеми соединениями следит front-end nginx, его надо тоже настраивать [3]. Общение nginx - apache, в случае, если все на одной машине происходит практически молниеносно, поэтому keep-alive в данном случае для апача не нужен. Так же апачу не нужно иметь огромное кол-во дочерних процессов, т.к. если nginx еще и кэширует, то запросов к apache он делает намного меньше. Собственно, для этого nginx и создавался - снизить нагрузку на сервер за счет снижения кол-ва дочерних процессов apache.

    Эта запись не полная [4]. Keep-state лишь работает с check-state, предназачено для динамических правил в ipfw. [5]
    Тебе файрволл можно не трогать вообще. Как выйдешь за предел в 10к соединений/с тогда можно будет что-то крутить.

    Ref:
    1. _http://httpd.apache.org/docs/2.0/mod/prefork.html
    2. _http://httpd.apache.org/docs/2.0/mod/mpm_common.html
    3. _http://adw0rd.ru/2009/nginx-and-apache-install/
    4. _http://www.opennet.ru/openforum/vsluhforumID1/42434.html
    5. _http://www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=32
     
    #3 ghostwizard, 22 Sep 2009
    Last edited: 22 Sep 2009
    1 person likes this.
  4. @D_

    @D_ New Member

    Joined:
    29 Jul 2009
    Messages:
    15
    Likes Received:
    3
    Reputations:
    0
    убей апач, оставь nginx =) это общий совет. А по делу — искал бы причину в своём софте. Вряд ли это проблема апача, скорее того, что он пытается обработать. php (perl, python etc), mysql, memcache если юзаешь на прямую и так далее. Скорее всего apache отдает запрос кому-то и долго ждет ответа. Забивая детей новыми запросами, которые так же попадают в бесконечную очередь.