Один рабочий процесс nginx обрабатывает два запроса одновременно или один за другим? - PullRequest
4 голосов
/ 15 июня 2011

Действительно крутая часть цепочки фильтров заключается в том, что каждый фильтр не ждет завершения предыдущего фильтра;он может обрабатывать вывод предыдущего фильтра по мере его создания, что-то вроде конвейера Unix.(из здесь )

Я предполагаю, что выше говорится о таком коде в конце каждого фильтра:

if (!chain_contains_last_buffer)
    return ngx_http_next_body_filter(r, in);

То есть nginx последовательно устанавливает фильтры.Но так как в конце каждого фильтра, он должен ждать, пока текущий фильтр не будет выполнен.Я не понимаю, как nginx удается сделать each filter doesn't wait for the previous filter to finish.

Итак, вышеизложенное касается параллелизма фильтра nginx, далее речь идет о параллелизме обработки запросов nginx:

Как мы знаемnginx использует epoll для обработки запросов:

events = epoll_wait(ep, event_list, (int) nevents, timer);
for (i = 0; i < events; i++) {
   ...
   rev->handler(rev);
}

С кодом, подобным приведенному выше, я не думаю, что nginx может обрабатывать два запроса одновременно, он может делать это только один за другим (каждый handler завершаетсяего работа достаточно быстрая, поэтому следующий запрос будет обработан довольно скоро), верно?

Или есть какая-то ошибка, по которой я скучаю?

1 Ответ

1 голос
/ 22 июля 2011

Есть способ проверить это. Напишите фильтр, который спит, и используйте его в цепочке фильтров. Затем проверьте, можете ли вы заставить nginx обслуживать запрос, пока предыдущий запрос спит.

Затем снова запустите тест, но на этот раз не дайте фильтру спать, заставьте его ждать, используя выбранные таймауты, например:

/* wait 1.5 secs */
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
select(0, NULL, NULL, NULL, &tv);
...