【问题标题】:Does one nginx worker process handle two requests concurrently or one by one?一个 nginx 工作进程是同时处理两个请求还是一个一个处理?
【发布时间】:2011-09-15 07:50:46
【问题描述】:

关于过滤器的真正酷的部分 链是每个过滤器不等待 完成前一个过滤器;它 可以处理前一个过滤器的 生产时的输出,有点 像 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 完成它的工作足够快,所以下一个请求很快就会被处理),对吧?

或者有什么我遗漏的问题吗?

【问题讨论】:

  • 你是对的。 Nginx 不能在一个 worker 中同时处理两个或多个请求。
  • @Cyber​​Dem0n,过滤器流水线怎么样?从理论上讲,我认为在没有线程的情况下在单个进程中是不可能的。

标签: c nginx pipeline epoll aio


【解决方案1】:

有一种方法可以对此进行测试。编写一个休眠的过滤器,并在过滤器链中使用它。然后测试看看你是否可以让 nginx 在前一个请求处于休眠状态时为请求提供服务。

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

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

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2017-01-18
    • 2020-07-12
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多