加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.cn/)- 图像处理、低代码、云通信、数据工具、物联设备!
当前位置: 首页 > 站长资讯 > 动态 > 正文

Nginx为什么快到停不下来?

发布时间:2020-11-06 14:10:42 所属栏目:动态 来源:互联网
导读:select: 查询 fd_set 中,是否有就绪的 fd,可以设定一个超时时间,当有 fd (File descripter) 就绪或超时返回; fd_set 是一个位集合,大小是在编译内核时的常量,默认大小为 1024 特点: 连接数限制,fd_set 可表示的 fd 数量太小了; 线性扫描:判断 fd

select:

  • 查询 fd_set 中,是否有就绪的 fd,可以设定一个超时时间,当有 fd (File descripter) 就绪或超时返回;
  • fd_set 是一个位集合,大小是在编译内核时的常量,默认大小为 1024
  • 特点:
  • 连接数限制,fd_set 可表示的 fd 数量太小了;
  • 线性扫描:判断 fd 是否就绪,需要遍历一边 fd_set;
  • 数据复制:用户空间和内核空间,复制连接就绪状态信息

poll:

  • 解决了连接数限制:
  • poll 中将 select 中的 fd_set 替换成了一个 pollfd 数组
  • 解决 fd 数量过小的问题
  • 数据复制:用户空间和内核空间,复制连接就绪状态信息
  • 处理多个请求时,可以采用:IO 多路复用 或者 阻塞 IO +多线程

    • IO 多路复用:一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;
    • 阻塞 IO + 多线程:每一个请求,新建一个服务线程

    思考:IO 多路复用 和 多线程 的适用场景?

    • IO 多路复用:单个连接的请求处理速度没有优势
    • 大并发量:只使用一个线程,处理大量的并发请求,降低上下文环境切换损耗,也不需要考虑并发问题,相对可以处理更多的请求;
    • 消耗更少的系统资源(不需要线程调度开销)
    • 适用于长连接的情况(多线程模式长连接容易造成线程过多,造成频繁调度)
    • 阻塞IO + 多线程:实现简单,可以不依赖系统调用。
    • 每个线程,都需要时间和空间;
    • 线程数量增长时,线程调度开销指数增长场景:

      处理多个请求时,可以采用:IO 多路复用 或者 阻塞 IO +多线程

      • IO 多路服用:一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;
      • 阻塞 IO + 多线程:每一个请求,新建一个服务线程

      思考:IO 多路复用 和 多线程 的适用场景?

      • IO 多路复用:单个连接的请求处理速度没有优势,适合 IO 密集型 场景,事件驱动
      • 大并发量:只使用一个线程,处理大量的并发请求,降低上下文环境切换损耗,也不需要考虑并发问题,相对可以处理更多的请求;
      • 消耗更少的系统资源(不需要线程调度开销)
      • 适用于长连接的情况(多线程模式长连接容易造成线程过多,造成频繁调度)
      • 阻塞IO + 多线程:实现简单,可以不依赖系统调用,适合 CPU 密集型 场景
      • 每个线程,都需要时间和空间;
      • 线程数量增长时,线程调度开销指数增长
      • HTTP 连接建立和请求处理过程

        1. Nginx 启动时,Master 进程,加载配置文件
        2. Master 进程,初始化监听的 socket
        3. Master 进程,fork 出多个 Worker 进程
        4. Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

        Nginx 高性能、高并发

        1. Nginx 采用:多进程 + 异步非阻塞方式(IO 多路复用 epoll)
        2. 请求的完整过程:
        3. 建立连接
        4. 读取请求:解析请求
        5. 处理请求
        6. 响应请求
        7. 请求的完整过程,对应到底层,就是:读写 socket 事件

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读