分享

Nginx 高并发原理解析

 拼命奋斗的自己 2020-05-28

异步

指同一时间不止一个事件发生,或者说是多个相关事件不等待前一事件完成就发生。计算机技术中,异步一词用于两大背景。

异步程序设计更为详细地阐释该概念,其编写的代码使程序能够要求一项任务和原先任务一起运行,不需停止任务去等待另一任务完成。第二项任务完成时,原先的任务利用一个约定好的机制得到通知,这样得知任务完成,可以的话就返回结果。有一些编程技术用来实现异步软件

阻塞和非阻塞

阻塞和非阻塞通常被用来形容多线程间的相互影响。

也即,当一个线程占用了临界区资源,那么其它需要使用这个资源的线程都必须在这个临界区上等待。等待会导致线程挂起,这样就形成了阻塞。如果占用资源的线程一直没有释放资源,那么其它的线程在这个临界区上都不能继续工作。反之,非阻塞表明多个线程之间的执行是不会相互影响的。

异步,非阻塞,epoll

异步,非阻塞,使用了epoll 和大量的底层代码优化。

阻塞I/O模式下,一个线程只能处理一个流的I/O事件。如果想要同时处理多个流,要么多进程(fork),要么多线程(pthread_create),这两种方法有很低的效率。

(1)采用非阻塞忙轮询的I/O方式,可以同时处理多个流。

l  为了避免CPU空转,可以引进了一个代理(select的代理,或poll的代理)。这个代理比较厉害,可以同时观察许多流的I/O事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中醒来。

l  如果没有I/O事件产生,我们的程序就会阻塞在select处。但是依然有个问题,我们从select那里仅仅知道了,有I/O事件发生了,但却并不知道是那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。

l  使用select,有O(n)的无差别轮询复杂度,同时处理的流越多,没一次无差别轮询时间就越长。

l  epoll 可以理解成event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

(2)epoll 触发模式

l  EPOLLLT水平触发模式

只要这个文件描述符还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作

l  EPOLLET边缘触发模式

在它检测到有 I/O 事件时,通过 epoll_wait 调用会得到有事件通知的文件描述符,对于每一个被通知的文件描述符,如可读,则必须将该文件描述符一直读到空,让 errno 返回 EAGAIN 为止,否则下次的 epoll_wait 不会返回余下的数据,会丢掉事件。如果ET模式不是非阻塞的,那这个一直读或一直写势必会在最后一次阻塞。

l  事件”的就绪通知方式

通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

Nginx: 采用单线程来异步非阻塞处理请求,不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。

管理员可以配置Nginx主进程的工作进程的数量(epoll)

Nginx采用一个master进程,多个woker进程的模式

 

如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。正常情况下,会有很多进程一直在等待中。

b0e68df32f0.jpeg

多worker进程模式

 

l  master进程主要负责收集、分发请求。每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。同时master进程也负责监控woker的状态,保证高可靠性。

l  woker进程一般设置为跟cpu核心数一致。nginx的woker进程在同一时间可以处理的请求数只受内存限制,可以处理多个请求。

Nginx 的异步非阻塞工作方式正把当中的等待时间利用起来了。在需要等待的时候,这些进程就空闲出来待命了,因此表现为少数几个进程就解决了大量的并发问题

每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?

处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。

这个worker会在发送完请求后,注册一个事件,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多