Nginx高效核心

Introduction

做最近的软工作业的时候,需要部署网站,比较了多款Web服务器之后,选择了短小精悍的Nginx,本文记录学习Nginx过程中理解到的Nginx高效的核心原因。

Nginx,Engine X简称,是一个高性能的HTTP服务器,和其他同类产品相比,Nginx一直以内存小、高并发闻名。

访问Nginx服务器,大致可以归结为一个网络I/O过程,而网络I/O的本质上是socket流的读取。对于socket流而言,通常分为两步,将数据从磁盘准备好然后从内核缓冲区复制到应用进程缓冲区,然后进行传送过程。

I/O特性

同步/异步

调用者、被调用者的消息的通信机制

  • 同步:调用者等待被调用者返回消息,才能继续执行,通常表现为轮询
  • 异步:被调用者通过状态、通知、回调等机制通知调用者自己的运行状态

阻塞/非阻塞

调用者在调用结束之前所处的状态

  • 阻塞:当调用结束之前,调用者被挂起
  • 非阻塞:无需等到调用结束,调用者可以继续执行其他任务

常见的I/O模型

下面的五种常见模型,前四种都是同步模型

阻塞型

在数据拷贝(内核空间、用户空间之间)完成之前,进程会一直阻塞,直到完成。如下图:

发起recvfrom()调用的时候,系统会检查是否有准备好的数据,如果没有则等待(阻塞),当数据准备完成之后,将数据从内核空间复制到用户空间(依然阻塞),然后再返回。

非阻塞型

在数据拷贝(内核空间、用户空间之间)完成之前,进程不会一直阻塞,而是会继续执。如下图:

发起recvfrom()调用的时候,如果没有准备好的数据,进程会继续执行,但是执行过程中会轮询测试系统调用的状态,准备好之后再复制数据(阻塞),尽管比阻塞型有所改善,但轮询会消耗大量计算资源。

多路复用模型(多路阻塞)

多路复用是指对于一个I/O端口,可以多次调用,多次返回。如下图:

当进程发起select()调用的时候,这个函数也会使进程阻塞,但是和阻塞I/O不同的,它可以同时阻塞多个I/O操作,而且可以同时对多个读/写操作的I/O进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

信号驱动模型

仍然是多次调用多次返回,如下图:

I/O伊始,给socket对应一个信号处理函数,然后进程继续执行,当数据准备完成之后,进程会受到一个SIGIO信号,然后调用信号处理函数进程I/O处理(仍然阻塞)。

异步模型

数据复制的时候无需阻塞,如下图:

当发起aio_read()调用的时候,调用者不会立刻得到结果,二十要等所有操作结束之后才通知信号处理程序。

Nginx中的I/O模型

nginx 支持多种并发模型,并发模型的具体实现根据系统平台而有所不同。在支持多种并发模型的平台上,nginx自动选择最高效的模型,当然也可以手动指定。

Nginx的高并发性能正是因为Nginx采用了异步I/O模型(epoll()),而Apache等服务器采用的多路复用模型(select)。

epoll()优点:

  • 理论并发数无上限
  • 内存映射机制
  • ...

Reference

https://www.cnblogs.com/chuyiwang/p/9884041.html

Nginx高效核心的更多相关文章

  1. nginx高效学习方法

    nginx高效学习方法 nginx做为一个高性能的web服务器,相对于apache等服务器来说它的代码量并不是非常庞大,反而非常精简.看过nginx源码的人都知道,nginx将“一切皆为模块”和“所有 ...

  2. Nginx HTTP 核心模块

    原文链接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=17238776&id=2982697aio 语法:aio [ ...

  3. 【Nginx】核心模块ngx_events_module

    核心模块ngx_events_module是一个专门用于管理事件模块的模块. 它的实现非常easy.以下是该模块的定义: ngx_module_t ngx_events_module = { NGX_ ...

  4. nginx学习(五):nginx.conf 核心配置文件详解

    整体结构 详细信息 1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody user root; 2.worker进程工作数设置,一般来 ...

  5. Nginx之核心结构体ngx_cycle_t

    1. ngx_listening_t 结构体 ngx_cycle_t 对象中有一个动态数组成员叫做 listening,它的每个数组元素都是 ngx_listening_t 结构体,而每个 ngx_l ...

  6. Nginx的核心功能及应用实战

    反向代理功能及配置: 反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给interne ...

  7. Java高级架构师(一)第33节:Nginx常用核心模块指令

    error_log:错误日志级别 http://www.nginx.cn/doc/  Nginx中文文档 # 并发总数是 worker_processes 和 worker_connections 的 ...

  8. Nginx(二)--nginx的核心功能

    反向代理 nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理. proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端 ...

  9. RogrePirates Scrum Meeting 博客汇总

    RogrePirates 博客目录 一.Scrum Meeting 1.Alpha阶段 第一次会议 第二次会议 第三次会议 第四次会议 第五次会议 第六次会议 第七次会议 第八次会议 第九次会议 第十 ...

随机推荐

  1. CSS002. 字体穿透蒙层(用img设置字体的color)

    之前在逛Apple Store时看到了下面的UI: 交互图标非常圆滑上手也很舒服,虽然背景底色本就是白底,但是只依赖css能不能使  "+" 穿透背景看到底色 ? 大致思路如下: ...

  2. 口护万亿市场杀出的实力派 Oclean欧可林

    撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 在"青年必去的电影节"上,发现了一个跟他们打成一片的智能护齿"新星". 25日,备受关注的第15届FIRST青年电 ...

  3. C++病毒

    病毒代码一#include <bits/stdc++.h> #include <windows.h> using namespace std; void HideWindow( ...

  4. ECMAScript 2021(ES12)新特性简介

    简介 ES12是ECMA协会在2021年6月发行的一个版本,因为是ECMAScript的第十二个版本,所以也称为ES12. ES12发行到现在已经有一个月了,那么ES12有些什么新特性和不一样的地方呢 ...

  5. JDBC-1(概述&建立)

    基于宋红康老师所讲JDBC所作笔记 1.JDBC概述 1.1 数据持久化 持久化:将数据保持到可掉电式存储设备中以供之后使用. 数据持久化意味着将内存中的数据保存到硬盘上加以固化,实现过程大多通过各种 ...

  6. Jmeter系列(1) - 踩坑之代理服务器录制失败

    前景 Jmeter代理服务器报错信息如下.Jmeter录制不成功 解决方案 需了解 代理服务器启动后会在/bin目录生成ApacheJMeterTemporaryRootCA.crt和ApacheJM ...

  7. Shell系列(30)- 单分支if语句判断分区使用率

    需求 监控分区已用空间,超过80%,抛出警告 脚本 #!/bin/bash #给tets赋值用于接收参数,传递给if进行判断 #申明变量test并赋值,由于赋的值是系统变量的结果,所以得用$()引用 ...

  8. vue 学习资料

    自学资料地址: https://zhuanlan.zhihu.com/p/26535530项目UI部分1.pc站 UI:(1)考虑自己写成本高,需要花费不少时间,好处是可以自己控制维护!(2)引入第三 ...

  9. 为什么Charles中的中文展示成数字、英文字符串

    在使用charles抓包时,可能非看到如下图的字符串: 为什么会出现这样的字符串? 我们看到的汉字.字母,对电脑来说并不长这样,而是用二进制表示的(显然--),为了统一标准,老外发明了"字符 ...

  10. AT3949-[AGC022D]Shopping【贪心】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3949 题目大意 长度为\(L\)的坐标轴上,给出\(n\)个点,每个点\(x_i\)需要购物\(t_i\)的时 ...