ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 

  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА














     АРХИВ :: Apache-Talk
Apache-Talk mailing list archive (apache-talk@lists.lexa.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[apache-talk] mod_accel MC & MW




Добрый день!

Ситуация: [MC=1,MW=32,MP=P]. Медленный backend.
При более чем одном одновременном запросе получаем 503 на "лишние" запросы. То 
есть запросы в очередь на ожидание освобождения backend не встают...

Документацию можно интерпретировать и таким образом:

"можно указать флаги MC и MW, позволяющие ограничить соответственно число 
соединений с бэкендом и число процессов, ждущих этот бэкенд в busy lock'е. Если 
достигнут максимум по одному из параметров и (skip) если ответа в кэше нет, то 
возвращается ошибка 503 (HTTP_SERVICE_UNAVAILABLE)."

Но на самом деле вероятно правильнее вести себе так:

"Если достигнут максимум по параметру MW и (skip) если ответа в кэше нет, то 
возвращается ошибка 503 (HTTP_SERVICE_UNAVAILABLE)."

То есть если достигнут MC, остальные запросы просто становятся в ожидание.

Если посмотреть на код accel_lock.c, то он по-моему себя так и ведет:

     if (!busy && !a->max_connected) {
         accel_state[accel_slot_num].state = ACCEL_BUSY_LOCK;
         accel_state[accel_slot_num].time = a->time;
         accel_state[accel_slot_num].sum = a->pass->sum;
         ap_cpystrn(accel_state[accel_slot_num].md5, a->md5, MD5_LEN + 1);

         a->busy_lock = 1;

     } else if (wait && !a->max_waiting) {
         accel_state[accel_slot_num].state = ACCEL_WAIT;
         accel_state[accel_slot_num].time = a->time;
         accel_state[accel_slot_num].sum = a->pass->sum;

         a->busy_lock = 1;
     }

То есть если запрос передать нельзя (busy || a->max_connected), и если не 
достигнут MW, он ставится в ожидание.

Но далее в mod_accel.c:

     /* too many connections to backend */
     if ((a->pass->max_conn && a->max_connected_checked && a->max_connected)
         || (!a->busy_lock
             && accel_max_connected(a))){
        ....
        return HTTP_SERVICE_UNAVAILABLE;
     }

То есть независимо от всего, если просто достигнут MC, выдается 503.

Добавление в это условие && a->max_waiting в каком-то смысле помогает ситуации 
(запросы не отваливаются с 503 а ждут освобождения backend и потом успешно 
отрабатываются), но вероятно это не совсем корректный патч...

WBR, MoKo



 




Copyright © Lexa Software, 1996-2009.