Ngnix-是如何实现高性能的?


Ngnix-是如何实现高性能的?

epoll 多路复用

epoll 解决 IO 复用的多路通知

epoll 观察多个流,只通知 I/O 事件的流,避免 select 的轮询操作

master worker 进程模型

一个 master,多个 worker,master 管理 worker,worker 处理请求,且 worker 进程为单线程

  • master 进程用来管理 worker 进程

    包含:

    • 接收来自外界的信号,向各 worker 进程发送信号
    • 监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程
  • worker进程用来处理基本的网络事件

    • 多个 worker 进程间同等竞争来自客户端的请求,各进程间相互独立
    • 一个请求,只能在一个 worker 进程中处理,一个 worker 进程,不能处理其它进程的请求
    • worker 进程的个数一般与机器 cpu 核数一致

      原因: 与 Nginx 的进程模型以及事件处理模型有关

协程机制

将每个用户的请求对应到线程中的某一个协程,然后在协程中,依靠 epoll 多路复用机制来完成同步调用开发
Lua 脚本也是基于协程机制

  • 进程的出现是为了更好的利用CPU资源使得并发成为可能
  • 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使得进程内并发成为可能
  • 协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈

事件驱动模型

基于异步及非阻塞的事件驱动模型,可以说是 Nginx 得以获得高并发、高性能的关键因素。

多进程机制

使用多进程的好处有两点:

  • 1.进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本
  • 2.采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低

内存池

为了避免出现内存碎片,减少向操作系统申请内存的次数、降低各个模块的开发复杂度,Nginx 设计了简单的内存池,它的作用主要是把多次向系统申请内存的操作整合成一次,这大大减少了 CPU 资源的消耗,同时减少了内存碎片


文章作者: darebeat
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 darebeat !
  目录