nginx是如何把任务分配到每个worker的呢?这种分配平均吗?合理吗?
通过strace 一个worker进程,部分逻辑如下:
我们发现,accept4是放在epoll_wait后面的,不难推测:
- nginx的epoll_wait 是在看那个文件描述符有事件发生了(就是需要处理了),当然,这里不包含listen的那个文件描述符(不是不能,是不应该);如果有事件发生,则处理,这些都是已经接收了的连接,有可能是(已建立的连接上的)新的请求。如果没有事件发生,则调用accept4看看有没有新的连接进来。这个逻辑就保证了,如果我比较闲,那么我就接活儿,如果我没闲着,我就不接活儿了