当前位置:Gxlcms > PHP教程 > [读书笔记]1_初探nginx架构_2_事件处理机制何来高并发

[读书笔记]1_初探nginx架构_2_事件处理机制何来高并发

时间:2021-07-01 10:21:17 帮助过:8人阅读

原文:http://tengine.taobao.org/book/chapter_02.html

nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?

nginx采用了异步非阻塞的方式来处理请求,而这种异步非阻塞的事件处理机制,具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用。它们提供了一种机制,让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。

拿epoll为例(在后面的例子中,我们多以epoll为例子,以代表这一类函数)

  1. 当事件没准备好时,放到epoll里面
  2. 事件准备好了,我们就去读写
  3. 当读写返回EAGAIN时,我们将它再次加入到epoll里面。

这样,只要有事件准备好了,我们就去处理它,只有当所有事件都没准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了。

当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。

更多的并发数,只是会占用更多的内存而已。

之前提到的worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

这里推荐设置worker的个数为cpu的核数,在这里就很容易理解了,更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,提供了cpu亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。像这种小的优化在nginx中非常常见,同时也说明了nginx作者的苦心孤诣。比如,nginx在做4个字节的字符串比较时,会将4个字符转换成一个int型,再作比较,以减少cpu的指令数等等。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    以上就介绍了[读书笔记]1_初探nginx架构_2_事件处理机制何来高并发,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

  • 人气教程排行