一个nginx工作进程是同时处理两个请求还是逐个处理?

时间:2011-06-15 07:50:05

标签: c nginx pipeline epoll aio

  

关于过滤器真的很酷的部分   链是每个过滤器不等待   以前的过滤器完成;它   可以处理前一个过滤器   输出,因为它正在生产,有点   像Unix管道。 (来自here

我猜以上是在谈论每个过滤器的最后代码

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 个答案:

答案 0 :(得分:1)

有一种方法可以测试它。编写一个睡眠过滤器,并在过滤器链中使用它。然后测试是否可以在前一个请求正在休眠时让nginx提供请求。

然后再次运行测试,但这次不要让过滤器休眠,让它等待使用选择超时如下:

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