Nginx IO模型相关理论

花了一元钱买了某机构关于Nginx的视频,发现理论讲的不错,受益匪浅,接下来打算花几天学习,顺便做学习笔记

Httpd MPM

  1. prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责相应一个请求。
  2. worker: 线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求。
  3. event: 线程模型,三级结构,主进程master负责生成子进程,每个子进程响应多个请求。

传统Apache遇到高并发就出现问题,为了解决C10K问题,所以Nginx应运而生。
Apache用的是select模型,Nginx用的是Epoll模型

I/O过程

  1. 客户端向服务器发送http请求。
  2. 通过物理层直到应用层即Nginx,Nginx工作在用户空间,作为一个进程无法直接访问硬件。
  3. Nginx发送请求到内核,由内核来完成从磁盘获取文件,xx.html。
  4. 内核将xx.html文件从磁盘先加载到Kernel内存空间(缓冲区),时间长,因为是读磁盘到内存。
  5. 将数据从内核缓冲区复制到用户空间的进程的内存中,时间短,因为是内存交换

I/O模型

网络I/O:本质就是Socket读取
磁盘I/O:

同步/异步:关注的是消息通信机制
同步:调用者等待被调用者返回信息,才能继续执行。
异步:被调用者通过状态,通知或回调机制主动通知调用者被调用者的运行状态。

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
阻塞:Blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起。
非阻塞:Non-Blocking,指IO操作被调用后立即返回给用户一个状态值,无需等待IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起。

  • 同步阻塞:消耗精力,资源浪费严重
  • 同步非阻塞:并没有很好利用,资源浪费也严重
  • 异步阻塞:纯浪费资源
  • 异步非阻塞:两件事情互不干扰,资源最合理配置

生产中用到的五种IO模型

  • 同步阻塞IO模型
  1. 最简单的IO模型,用户线程在内核进行IO操作时被阻塞。
  2. 用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间,内核等数据包到达后,将接受的数据拷贝到用户空间,完成read操作。
  3. 用户需要等待read将数据读取到buffer后,才能继续处理接受的数据,整个IO请求过程,用户线程是被阻塞的,导致用户发起IO请求时,不能做任何事,对CPU资源利用率低,产生浪费。
  • 同步非阻塞IO模型
  1. 由于同步,进程反复调用轮询recvfrom进程,只要内核等待数据包到达之后,反复调用询问是否完成就停止了。
  2. 本质和没干活一样,消耗CPU反而更大,因为不断轮询。
  3. 后续过程和同步阻塞模型一致,一般没有用这个的。
  • IO多路复用模型
  1. select应用进程作为代理人(并发),请求不和内核直接打交道了,类似群体下单,然后完成内核缓冲区数据的加载后,即返回消息,类似大屏幕告知可以办业务了。
  2. 数据从内核空间复制到用户空间,后连续流程一致,这个模型在于阻塞在select上,换了阻塞对象。
  3. 数据复制到应用缓冲区期间,进程依旧阻塞,依旧是一个同步模型。
  4. 整个流程相当于两个阻塞,但是好处是多个进程共用一个select,整体来讲提升了效率然而有限。
  5. 使用场景:一个TCP服务器既要处理监听套接字,又要处理已连接套接字;多服务多协议;既要处理TCP又要处理UDP等。
  • 信号驱动IO模型
  1. 第一步实现非阻塞,建立SIGIO的信号处理程序,当内核缓冲区得到数据报后,返回SIGIO,此时进程不阻塞,可以做很多其他事儿了。
  2. 第二步后续内核缓冲区数据报赋值到用户空间过程依旧是阻塞的。
  3. 生产中使用不是很多。
  • 异步IO模型
  1. 全部交给内核来做,用户进程什么都不干,压力全部交给内核。
  2. 没有任何阻塞,但是这个异步非阻塞还是存在问题的。
  3. 只有微软的windows实现了真正的异步非阻塞,IOCP。

I/O模型的具体实现

  1. select:跨平台,I/O复用模型。
    select底层实现是数组,使用遍历方式查找结果反馈给进程,效率低下,最大连接数1024句柄。
    poll底层实现是链表,依旧使用遍历方式,最大连接数无上限。

  2. Poll: 仅linux版本,改进版的select。

  3. ePoll: 仅linux版本,对应I/O复用模型,具有信号驱动I/O模型的某些特性,
    epoll底层实现是哈希表,使用回调方式查找结果反馈给进程,IO使用事件通知方式,内核缓冲区数据拷贝每个用户空间由于接到通知而好似彼此独立,最大连接数无上限。
    epoll还支持内存拷贝,利用 mmap(Memory mapping,内存映射) 加速与内核空间的消息传递,减少复制开销,官方给出最多3万并发,还有端口号消耗问题,进程消耗,3万已经是极限了

mmap概念

  1. 三块:Nginx应用,内存,磁盘
  2. 磁盘根据块组Block中的inode索引和data真实存放数据,在硬盘的data中开辟一块儿空间,完全映射到内存当中,字节完全一一对应映射。
  3. 只要访问本内存空间,那么就省略了层层寻找inode的过程,也就直接从磁盘上读取所需要的数据了,因此提高了效率。
  4. 改变本内存映射空间中数据,那么直接就写到硬盘上,省略了多次拷贝的过程。

水平触发和边缘触发

水平触发:如果报告fd后没有被处理,那么下次poll时会再次报告该fd。
边缘触发:仅通知一次,epoll独有,相对效率更高,性能更好。

比较好的二次开发产品
Tengine: 淘宝专用
OpenResty:追求极致高性能

发布了49 篇原创文章 · 获赞 18 · 访问量 4002

猜你喜欢

转载自blog.csdn.net/weixin_41047549/article/details/90247735