Nginx系列(7):Nginx高并发初探

目录

1、场景设置 — NGINX进程模型

二、为什么框架如此重要?

三、NGINX是如何运作的呢?

四、NGINX内部工作进程

五、NGINX是一个真正的大师

六、更新配置文件升级NGINX

七、结语


原文出处:https://www.cnblogs.com/dz11/p/10215089.html

NGINX 在网络应用中表现超群,在于其独特的设计。许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接。

NGINX 内部信息图从进程框架的顶层开始,向下逐步揭示NGINX如何处理单个进程中的多个连接,并进一步探讨其工作机制。

1、场景设置 — NGINX进程模型

为了更好地理解这种设计模式,我们需要明白NGINX是如何运行的。NGINX拥有一个主线程,用来处理配置文件的读取、端口的绑定等特权操作,以及一组工作进程、辅助进程。

在这个四核服务器中,主线程创建了四个工作进程和一组缓存辅助进程(cache helper processes),后者用来管理硬盘缓存。

二、为什么框架如此重要?

任何Unix应用的基础是线程或者进程-对于Linux操作系统,线程和进程几乎相同;最大的区别在于线程间是内存共享的。一个线程或者进程是一套指令集(self-contained set of instructions ),操作系统调度这些指令在单个CPU内核上运行。许多复杂应用并行地运行在多个线程或者进程,原因有二:

  • 应用可以同时使用计算机的多个CPU核
  • 线程和进程易于并行操作,比如同时处理多个连接

进程和线程消耗资源,比如对内存以及其它操作系统资源的占用、内核切换(wapped on and off the cores)(本操作叫做一次上下文切换(context switch))。如今的服务器需要同时处理成千个小的、活跃线程或者进程,一旦内存耗尽、或者过高的读写负载,这些都会导致大规模的上下文切换,性能会严重退化。

通常的设计思路是,网络应用为每个连接分派一个线程或者进程。这类框架简单易于实现,不过在同时应对成千上万个连接时难以扩展。

三、NGINX是如何运作的呢?

NGINX利用一个预测进程模型调度可用的硬件资源:

  • 主进程处理配置文件读取、端口绑定等特权操作,以及创建一小组子进程(接下来三种类型的进程)
  • 启动时缓存加载器进程加载硬盘中缓存到内存中,接着退出。对它的调度是保守的,所以资源开销较低
  • 缓存管理进程定时运行,清理来自硬盘缓存的实体到指定的大小
  • 工作进程负责所有的工作,处理网络连接、硬盘读写操作、以及上游服务器通信

NGINX推荐的配置是,一个工作进程对应一个CPU内核,确保硬件资源的有效利用,在配置文件中设置worker_processes auto:

  • worker_processes auto;

一旦NGINX服务起来,仅有工作进程在忙,每个工作进程采用非阻塞地方式处理多个连接,降低上下文切换的次数。

每个工作进程都是单线程且独立运行,负责获取新连接并进行处理。进程之间通过共享内存进行通信,诸如缓存数据,会话持续化数据(ession persistence data),以及其他共享资源。NGINX1.7.11及以后的版本,有一个可选的线程池,工作进程将阻塞操作丢给它们。更多细节,参看《Nginx 引入线程池,提升 9 倍性能》(http://blog.jobbole.com/87988/)。对于NGINX Plus用户,这些新特性会在今年的发布版7中出现。

四、NGINX内部工作进程

每个NGINX工作进程由配置文件对其进行初始化,主进程为其提供一组监听socket。

工作进程起始于socket监听事件(accept_mutex 和 kernel socket sharding),事件由新的连接进行初始化,接着这些连接被派发给某个状态机—HTTP状态机是其中最常用的一种,不过NGINX也实现了基于流的状态机、基于通信协议的状态机(SMTP, IMAP, and POP3)。

状态机是一组重要的指令集,它会告诉NGINX怎样处理每个请求。许多网络服务器拥有NGINX的状态机一样的功能—区别就在于它们的实现不同。

调度状态机

状态机就像下象棋,单个HTTP事务如同一盘棋。棋盘的一端是网络服务器—就像大师级棋手非常快地做出决定,另一端为远程客户端—网络浏览器通过相对较慢的网络访问某个站点或应用。

不过游戏规则可能非常复杂,比如网络服务可能需要和第三方、或者某个认证服务器通信,甚至服务器中的第三方模块来扩展游戏规则。

阻塞状态机

回到前面的描述,进程或者线程作为一套指令集,操作系统调度其运行在某个CPU内核上。大多数网络服务器和网络应用按照一个进程处理一个连接,或者一个线程处理一个连接的模型来玩象棋游戏;每个包含指令的进程或者线程参与游戏的整个过程。在这期间,运行在服务器上进程大多数时间被阻塞掉了,即等待某个客户端去完成下一步棋。

【1】网络服务器进程监听socket上的新连接,此游戏新连接由客户端发起。

【2】一旦获得新游戏,进入游戏环节,每一次移动都需等待客户端响应,进程就被阻塞了。

【3】一旦游戏结束,网络服务器进程就会查看客户端是否想再来一局(对应某个存活的连接)。一旦连接关闭(客户端离开或者超时),网络服务器进程就会返回监听新的游戏。

【4】记住每一个活跃的HTTP连接即每一局象棋游戏,需要象棋大师一般的特定进程或者线程参与其中。这个架构简单易于扩展第三方模型即新的规则。然而,这里存在一个极不平衡的逻辑,对于相关轻量级的HTTP连接,由单个文件描述符和少量的内存表示,此连接会映射到某个线程或进程上,而线程或者进程是一个重量级的操作系统对象。尽管编程时很方便,但浪费却是巨大的。

五、NGINX是一个真正的大师

或许你听说过同时展示游戏,一个象棋大师同时对阵十二个棋手。

NGINX工作进程也是这么玩”象棋”的,每个工作进程-一个CPU内核上的工作者-即是一个可以同时应对成千上万游戏的大师。

【1】工作进程从已连接并开始监听的套接字(socket)那里获取事件;

【2】一旦socket接收到事件,工作进程会立即处理此事件:

  • socket上的某个监听事件即客户端开启一个新的象棋游戏,而工作进程创建一个新的socket连接。
  • socket连接上的某个事件即客户端走了一步棋,工作线程做出了恰当地响应。

工作进程从来不会阻塞在网络传输上等待它的对手(客户端)回复应答。每走完一步棋后,工作进程会迅速处理其它等待的象棋游戏,或者欢迎新的游戏玩家进入。

为何比阻塞、多进程框架快呢?

NGINX良好的扩展性在于其支持一个工作线程处理成千上万个连接。每个新连接创建文件描述符,仅消耗工作进程很少一部分额外内存,额外的开销很小。进程能够一直绑定CPU(pinned to CPUs),这样上下文切换相对没有那么频繁,只有没工作时才会发生。

译者注:cpu绑定是指绑定一个或者多个进程到一个或者多个处理器上.

使用阻塞方式,即一个连接对应一个进程,每个连接需要大量的额外资源以及开销,上下文切换非常频繁。

只要恰当的系统调优,NGINX每个工作进程可以处理成千上万个并发HTTP连接,毫无差错地应对网络高峰,即同时可以玩更多的象棋游戏。

六、更新配置文件升级NGINX

进程框架拥有少量工作进程,有利配置文件甚至二进制文件更新。

更新NGINX配置是一个简单、轻量级的可靠操作。即只要运行nginx -s reload命令,就会检查磁盘上的配置文件,并给主进程发送一个SIGHUB信号。

一旦主进程接受到一个SIGHUB,它会做两件事:

  • 重载配置文件、创建一组新的工作进程,新创建的工作进程立即接受连接、处理网络通信( 采用新的配置环境)。
  • 通知旧的工作进程优雅地推出,这些工作进程停止接受新连接。一旦当前处理的HTTP请求结束,工作进程会关闭连接。一旦所有连接关闭,工作进程就会退出。

重载进程会引起一个小的CPU和内存高峰,不过从活跃连接处加载的资源相比,开销微乎其微。每一秒可以多次重载配置文件。产生诸多等待连接关闭的NGINX工作进程一般很少出问题,不过就算是有问题也可以迅速解决。

NGINX二进文件升级获得极佳的高可用性-你可以在线升级文件,而且不会丢失任何连接、服务也不会停机或中断。

译者注: on the fly 程序在运行时,工作就可以完成。

二进制文件升级进程方式类似优雅的配置文件重载;新的NGINX主进程和原有的主进程并行,分享监听socket。两个进程都处于活跃状态,处理它们各自的网络通信。你可以通知原有的主进程以及它的工作进程优雅地退出。

七、结语

NGINX内部信息图展示了NGINX的高标准功能全景图,简单解释的背后是十多年来不断创新优化,得益于此NGINX被广泛应用于各种硬件平台,并且取得了最优异的性能表现。即便是在现代,网络应用需要对安全和可靠性作出维护,NGINX也表现不凡。


愿你就像早晨八九点钟的太阳,活力十足,永远年轻。

 

热门文章

暂无图片
编程学习 ·

2 css

css的三大特性 css有三个非常重要的三个特性;层叠性 继承性 优先级 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式,层叠性 主要解决样式冲突的问题 原则 样式冲突,遵循原则上就近原则,那个样式离结构近,就执行那个样式 样式不冲突,不…
暂无图片
编程学习 ·

Hadoop集群的四个配置文件的常用属性解析

在启动hadoop集群的守护线程时,一定会加载并运行相关的class字节码文件。通过common模块和hdfs模块里的源码可以看到,它们读取了相关的配置文件。hadoop-common-2.7.3-sources.jar下的org.apache.hadoop.conf.Configuration源文件的部分源码:package org.apache.hadoop.conf…
暂无图片
编程学习 ·

「干货教程」朋友圈装X神器!超级辅助-微信跳一跳

简介这个外挂原理比较简单,通过adb驱动链接到手机,通过图片识别实现模拟用户操作,通过计算方块像素实现得到下一个方块的坐标,跳到下一个点的位置设一个随机数.**环境配置首先我们先把adb驱动给配置好右键单击此电脑高级系统设置双击Path点击浏览把adb文件夹包含进来,也可以复制…
暂无图片
编程学习 ·

纸片人算什么?教你造真“3D小姐姐”!可以动的模型

要说现在什么行业最赚钱,非游戏莫属!要说游戏中什么类型最赚钱?非3D建模莫属! 据统计,刚入行的从业人员均薪1万-1.3万,如果做到总监,行业平均年薪30万+!他们的日常就是创造游戏里各种各样的小姐姐和自己心仪的角色。 玩游戏的人都知道,第一眼吸引我们的总是游戏中精美…
暂无图片
编程学习 ·

AssemblyInfo.cs文件参数具体讲解

AssemblyInfo.cs文件参数具体讲解 原文地址:https://www.cnblogs.com/scy251147/archive/2010/10/23/1859576.html 在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否…
暂无图片
编程学习 ·

【Linux】——I/O复用之poll

1、poll的概述 在上一篇文章中,我们详细的介绍了I/O复用技术中的select使用。这篇文章我们来主要介绍一下poll. poll系统调用和select类似,也是在指定事件内轮询一定数量的文件描述符,以测试其中是否有就绪的 本质都是统一监听,如果任意一个文件描述符上有关注的事件发生。…
暂无图片
编程学习 ·

python如何写数据到csv文件中

使用csv保存数据是一种非常常见的方式,csv数据也很方便移植到excel中去经常会遇到这样的问题,我有一百行数据一百列数据,我应该怎么快速放到excel里面去,我的答案是先保存到csv中,然后再复制粘贴到excel中。代码如下import csvresults_file = open(results.csv,w, newline…
暂无图片
编程学习 ·

跟汤老师学Java笔记:文件字节输入输出流

跟汤老师学Java笔记:文件字节输入输出流 完成:第一遍 1.文件字节输入流创建和常用方法有哪些? 创建:构造参数有字符串和File对象两种 方法: 方法:fis.read() 作用:读取一个字节,返回int类型的字节值,如果读取到末尾返回-1 方法:fis.close() 作用:输入流用了操作系统…
暂无图片
编程学习 ·

6台路由器ospf+rip实验

一、环境OSPF路由协议是一种典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由域是指一个自治系统(Autonomous System),即AS,它是指一组通过统一的路由政策或路由协换路由信息的网络。在这个AS中,所有的OSPF路由器都维护一个相同的描述这个A…
暂无图片
编程学习 ·

Linux命令21天打卡

1)给文件 isTester.ini 赋予 只读权限1. 创建文件 isTester.inivi isTester.ini2. 更新文件内容为“21 day Linux Learn ,Im Idolaoxu,in shenzhen ."输入 i ,进入编辑模式,输入内容,esc进入命令模式 :wq 保存 。chmod +R isTester.ini2)给文件 isTester.ini 赋予 读…
暂无图片
编程学习 ·

[指南]-DeepFaceLab 2.0说明和教程(推荐)

DeepFaceLab 2.0指南/教程此教程机翻自:https://mrdeepfakes.com/forums/thread-guide-deepfacelab-2-0-explained-and-tutorials-recommended什么是DeepFaceLab 2.0?DeepFaceLab 2.0是利用机器学习来交换视频中人脸的工具/应用程序。1.0和2.0有什么区别?DFL 2.0有什么新功能…
暂无图片
编程学习 ·

一文聊透This

Thisthis指向当前属性所在对象。 var A = {name: 张三,describe: function () {return 姓名:+ this.name;} };var name = 李四; var f = A.describe; f() // "姓名:李四"JavaScript 语言之中,一切皆对象,运行环境也是对象,所以函数都是在某个对象之中运行,this…
暂无图片
编程学习 ·

vue 插件大全

vue 插件大全 Vue是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件特别整理了常用的vue插件,来了个大汇总,方便查找使用,便于工作和学习。很全的vue插件汇总,赶紧收藏下吧! 一、UI组件及框架element …
暂无图片
编程学习 ·

python从入门到放弃8.1选举小程序升级版v.1

马上又要12点了–-–,唉,终于完成选举小程序升级版1了。感觉很happy,但是还是有点脑热,因为,有一些内核总是装不上。。Java还没有正式启航。 一天天的,事是真的多。如果不出意外,我应该会持续升级版本,将这个程序做得越来越完善。不多说了,还是给截图。因为自己去实践才…
暂无图片
编程学习 ·

网络安全学习篇11_WEB服务器和FTP服务器

上一篇博客:DNS部署与安全目录WEB服务器FTP服务器开始一、WEB服务器WEB服务器也称为网页服务器或HTTP服务器WEB服务器使用的协议是HTTP或HTTPSHTTP协议端口号:TCP 80 HTTPS协议端口号:TCP 443WEB服务器发布软件:微软:IIS (Internet Information Services的缩写,意为互联…
暂无图片
编程学习 ·

Java面向对象编程基础练习题

编程前提: (1)熟练掌握类、对象的的概念以及对事物的抽象。 (2)熟练掌握成员、方法的概念以及构造方法的概念。 (3)熟练掌握封装性,多态性的概念 (4)理解面向对象的程序设计方法。 题目如下 (1)先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体…
暂无图片
编程学习 ·

城轨交通系统中智能化管理的作用分析

3D可视化集成系统是根据虚拟现实技术的情景在软件系统中,展现数据信息,把平时的软件业务流程在虚拟场景中完成。计划方案可运用于地铁站、轻轨站、单轨、有轨电车、磁浮等这种轨道交通系统的管理方法上。 轨道交通系统中,地铁已经中国成为大城市标准配置的交通工具,到目前为…
暂无图片
编程学习 ·

failed to determine a suitable driver class

解析:搭建基于SpringBoot ,springCloud 框架简单入门 的测试。报错如上:原因:这是因为添加了数据库组件,所以autoconfig会去读取数据源配置,而新建的项目还没有配置数据源/URL地址错误,所以会导致异常出现。 解决方案:在启动类的@EnableAutoConfiguration或@SpringBoot…
暂无图片
编程学习 ·

提升 10 倍!阿里云对象存储 OSS 可用性 SLA 技术揭秘

简介:对象存储被广泛应用于互联网应用中,当我们打开手机观看视频、收听音乐、分享图片、浏览网页、淘宝购物时,背后的数据基本都是存在对象存储中。应用使用卡、打不开就和对象存储的可用性 SLA 有关,SLA 越高,应用体验越好。本文分享阿里云在对象存储 OSS(Open Storage S…