美文网首页
Nginx实现高并发的原理

Nginx实现高并发的原理

作者: 超鸽带你飞 | 来源:发表于2018-11-20 19:23 被阅读81次

如何提高Web服务器的并发连接处理能力

大概有几个基本条件:

  1. 基于线程,即一个进程生成多个线程,每个线程响应用户的每个请求。
  2. 基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。
  3. 基于磁盘的AIO(异步I/O)
  4. 支持mmap内存映射,mmap传统的web服务器,进行页面输入时,都是将磁盘的页面先输入到内核缓存中,再由内核缓存中复制一份到web服务 器上,mmap机制就是让内核缓存与磁盘进行映射,web服务器,直接复制页面内容即可。不需要先把磁盘的上的页面先输入到内核缓存去。

Nginx 采用的是多进程(单线程) + 多路IO复用模型,就成了”并发事件驱动“的服务器。

多进程的工作模式

image
  1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
  2. 接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
  3. master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程
  4. worker 进程数,一般会设置成机器 cpu 核数。因为更多的worker 数,只会导致进程相互竞争 cpu,从而带来不必要的上下文切换。

【总结】: 使用多进程模式,不仅能提高并发率,而且进程之间相互独立,一个 worker 进程挂了不会影响到其他 worker 进程。

惊群现象

主进程(master 进程)首先通过 socket() 来创建一个 sock 文件描述符用来监听,然后fork生成子进程(workers 进程),子进程将继承父进程的 sockfd(socket 文件描述符),之后子进程 accept() 后将创建已连接描述符(connected descriptor)),然后通过已连接描述符来与客户端通信。

由于所有子进程都继承了父进程的 sockfd,那么当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,这当然会消耗系统资源。

Nginx 提供了一个 accept_mutex 这个东西,这是一个加在accept上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accpet(),这样就不会有惊群问题了。accept_mutex 是一个可控选项,我们可以显示地关掉,默认是打开的。

IO多路复用模型epoll

  1. epoll() ,内核维护一个链表,epoll_wait 直接检查链表是不是空就知道是否有文件描述符准备好了。内核实现epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的 回调函数 实现的。那么,某个 sockfd 上的事件发生时,与它对应的回调函数就会被调用,来把这个 sockfd 加入链表,其他处于“空闲的”状态的则不会。
  2. select() ,内核采用 轮训 的方法来查看是否有fd 准备好,其中的保存 sockfd 的是类似数组的数据结构 fd_set,key 为 fd,value 为 0 或者 1。
  3. poll()

【总结】:epoll 与 select 相比最大的优点是不会随着 sockfd 数目增长而降低效率。

相关知识参考:

  1. 进程和线程的区别:
    https://www.cnblogs.com/zhehan54/p/6130030.html

  2. Apache的三种工作模式:
    http://balich.blog.51cto.com/6641781/1743798
    https://www.cnblogs.com/zhichaoma/articles/7784688.html

    • Prefork 多进程
    • Worker 多进程+多线程
    • Event 多进程+多线程+epoll
  3. Apache常用操作
    httpd -V 常看版本、配置信息
    apachectl –l 查看Apache当前工作模式
    在configure时,可以通过指定参数,将工作模式设置为worker模式或prefork模式。
    使用命令:./configure –with-mpm=worker
    cd /etc/apache2 切换工作目录
    sudo apachectl -k stop // 关闭 apache 服务器
    sudo apachectl -k start // 启动 apache 服务器

相关文章

  • Nginx实现高并发及原理

    关键词:nginx 1、nginx基本介绍 1.nginx高并发原理(多进程(单线程)+epoll实现高并发) 1...

  • Nginx实现高并发的原理

    如何提高Web服务器的并发连接处理能力 大概有几个基本条件: 基于线程,即一个进程生成多个线程,每个线程响应用户的...

  • nginx实现高并发的原理

    Nginx 采用的是多进程(单线程) & 多路IO复用模型。使用了 I/O 多路复用技术的 Nginx,就成了”并...

  • 对高并发的思考

    近期很长的一段时间,都在学习总结,什么是高并发,怎么样实现高并发,接触了解的内容包括Nginx工作原理,Tomca...

  • Nginx 实现高并发

    面试题: Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错...

  • java 高并发中volatile的实现原理

    java 高并发中volatile的实现原理 摘要: 在多线程并发编程中synchronized和Volatile...

  • 【Nginx源码研究】Nginx的事件模块介绍

    运营研发团队 谭淼 一、nginx模块介绍 高并发是nginx最大的优势之一,而高并发的原因就是nginx强大的...

  • java并发

    1.并发编程中的锁 并发编程中的各种锁java高并发锁的3种实现Java并发机制及锁的实现原理 2.线程池核心线程...

  • nginx、swoole高并发原理初探

    阅前热身 为了更加形象的说明同步异步、阻塞非阻塞,我们以小明去买奶茶为例。 同步与异步 同步与异步的重点在消息通知...

  • 大型高并发与高可用的三层缓存架构总结

    对于高并发架构,毫无疑问缓存是最重要的一环,对于大量的高并发,可以采用三层缓存架构来实现,nginx+redis+...

网友评论

      本文标题:Nginx实现高并发的原理

      本文链接:https://www.haomeiwen.com/subject/yegxqqtx.html