Nginx:论高并发,在座各位都是渣渣 原创 JAVA少女 2019-01-03 16:26:50 ©著作权 文章标签 Nginx 编程 高并发 架构 程序员 文章分类 Java 后端开发 ©著作权归作者所有:来自51CTO博客作者JAVA少女的原创作品,请联系作者获取转载授权,否则将追究法律责任 NGINX 在网络应用中表现超群,在于其独特的设计。许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接。NGINX 内部信息图从进程框架的顶层开始,向下逐步揭示NGINX如何处理单个进程中的多个连接,并进一步探讨其工作机制。场景设置 — 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内核上。大多数网络服务器和网络应用按照一个进程处理一个连接,或者一个线程处理一个连接的模型来玩象棋游戏;每个包含指令的进程或者线程参与游戏的整个过程。在这期间,运行在服务器上进程大多数时间被阻塞掉了,即等待某个客户端去完成下一步棋。网络服务器进程监听socket上的新连接,此游戏新连接由客户端发起。一旦获得新游戏,进入游戏环节,每一次移动都需等待客户端响应,进程就被阻塞了。一旦游戏结束,网络服务器进程就会查看客户端是否想再来一局(对应某个存活的连接)。一旦连接关闭(客户端离开或者超时),网络服务器进程就会返回监听新的游戏。记住每一个活跃的HTTP连接即每一局象棋游戏,需要象棋大师一般的特定进程或者线程参与其中。这个架构简单易于扩展第三方模型即新的规则。然而,这里存在一个极不平衡的逻辑,对于相关轻量级的HTTP连接,由单个文件描述符和少量的内存表示,此连接会映射到某个线程或进程上,而线程或者进程是一个重量级的操作系统对象。尽管编程时很方便,但浪费却是巨大的。NGINX是一个真正的大师或许你听说过同时展示游戏,一个象棋大师同时对阵十二个棋手。NGINX工作进程也是这么玩”象棋”的,每个工作进程-一个CPU内核上的工作者-即是一个可以同时应对成千上万游戏的大师。工作进程从已连接并开始监听的套接字(socket)那里获取事件;一旦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也表现不凡。 赞 收藏 评论 分享 举报 上一篇:深入浅出,了解 Spring 框架和 Spring Boot 的历史 下一篇:高可用Redis服务架构分析与搭建 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 hbase 高并发分析 随着大数据时代的到来,HBase作为一种高可靠、高性能、面向列、可伸缩的分布式存储系统,广泛应用于大数据领域。在实际应用中,HBase经常需要处理高并发的读写请求,因此对其高并发性能的分析和优化显得尤为重要。本文将深入探讨HBase的高并发机制、性能瓶颈以及优化策略,并结合实际代码示例进行说明。HBase高并发机制HBase的高并发机制主要依赖于其底层的分布式架构和存储设计。HBase通过将数据分 数据 高并发 性能瓶颈 开启linux高并发TCP #修改/etc/security/limits.conf文件对用户打开文件数的软限制和硬限制:soft nofile 65535hard nofile 65535 #修改/etc/pam.d/login文件,在文件中添加如下行:session required /lib/security/pam_limits.so #32位系统session required /lib64/ 重启 打开文件 html 【软考高项范文】论信息系统项目工作绩效域 引言信息系统项目管理的有效性与项目最终的成功密切相关,其中项目工作绩效域作为评价和指导项目运行的核心框架,涵盖了诸如项目过程管理、项目制约因素管理、工作过程与能力聚焦、沟通与干系人参与管理、实物资源管理、采购管理、变更管理以及持续学习与改进等多个方面。本文旨在深入剖析这些绩效要点,并探讨在信息系统项目实施过程中哪些绩效域更应当成为项目管理的重点关注对象。第一部分:项目工作绩效域的绩效要点项目过程 项目经理 优先级 资源管理 Nginx:论高并发,在座各位都是渣渣 NGINX内部信息图展示了NGINX的高标准功能全景图,简单解释的背后是十多年来不断创新优化,得益于此NGINX被广泛应用于各种硬件平台,并且取得了最优异的性能表现。即便是在现代,网络应用需要对安全和可靠性作出维护,NGINX也表现不凡。 nginx 配置文件 客户端 状态机 服务器 大家好,我系渣渣辉 第一篇,2021了,祝大家**! u3d 还真有这么渣渣的公司.... 又到了金三银四的季节,一波又一波的求职大潮疯涌而至!从2018年年底开始,各类「缩招」、「优化」、「cai 员」的消息也是不断出现,这个消息让一些找工作的人颇感到了压力。其实,这并不是一件坏事!年底了,要慎重,这是一个不太好的信号…特别是2019年应届毕业生人数高达860万,就连互联网行业的招聘需求也在下降,据数据统计,互联网行业在第三季度的招聘量和去年相比竟然下降了51%。由此可见,就业... 职场 学渣软考高项 学渣软考高项:挑战与机遇并存在信息技术迅猛发展的今天,软件行业作为其中的重要支柱,一直备受瞩目。而在这个行业中,软件水平考试(软考)则是衡量从业人员专业能力的重要标准之一。对于许多学渣来说,软考高级项目(高项)似乎是一个遥不可及的目标。然而,只要我们有决心、有毅力,学渣也能在软考高项中取得好成绩。首先,我们要正视自己的不足。作为学渣,可能在基础知识、学习能力等方面存在一定的欠缺。但这并不意 职业发展 信息技术 软件开发 GraphQL是什么"渣渣"?它想干掉RESTful GraphQL简介GraphQL是一种新的API标准,它提供了一种比REST更有效、更强大和更灵活的替代方案。它是由Facebook开发并开源的,现在由来自世界各地的公司和个人组成的大型社区维护。GraphQL本质上是一种基于api的查询语言,现在大多数应用程序都需要从服务器中获取数据,这些数据存储可能存储在数据库中,API的职责是提供与应用程序需求相匹配的存储数据的接口。它是数据库无关的,而且可 GraphQL RESTful 一个前端渣渣的成功逆袭!! 有方法的逆袭才是成功的逆袭一般人我不告诉他!!! 经验分享 首发!撸了谷歌大神写的Spring源码笔记后,感觉之前读的都是渣渣 Spring让我们可以更快,更轻松,更安全地进行Java编程。Spring对速度,简单性和生产率的关注使其成为世界上最受欢迎的Java框架。像阿里巴巴,亚马逊,谷歌,微软等在内的所有科技巨头对Spring都有很大的贡献,因此Spring经常在大厂面试的时候被问到,下面我选了几道关于pring源码的面试题,看大家能不能回答出来:IOC源码主要流程bean相互依赖注入问题为什么要使用springSpr Spring源码 一个前端渣渣的node开发体验 前言因为最近打算自己搭建一个自己的博客系统,用来记录日常的学习和提升一下写作水平,所以能就打算自己搭建一下前后端项目。在网上找了下,也没有找到合适(现成)的项目,所以就打算自己动手来搭建一下。这篇文章主要描述如何搭建一个node的API接口服务。技术栈简述网上的node框架也挺多的,用的较多的有egg,express,koa等框架,框架间各有利弊,最后均衡下来,还是决定使用可拓展性比较强的koa2 java Windows 技术篇 - 杜比驱动安装,解决电脑渣渣音效! 我的电脑是华硕zx50j,公放时声音小的一匹,而且还有细微斯拉斯拉的声音…,有的人的声卡驱动比较好,所以感觉杜比音质也差点吧,但是对于我这种渣到一定程度的,感觉杜比还不错呢!喜欢的可以试一试! Dobly 重启 驱动程序 驱动安装 声卡驱动 就这样,我成为了一个半吊子渣渣 原创 lightcity 光城 2020-06-18大家好,我是光城,简单描述一下如何成为半吊子渣渣的。本科非计算机,出于存粹电脑的兴趣,自学java开发,学习了安卓开发,期间学习AE、Vegas、Pr、final cut等,随后玩了玩了前端,做了一些外包,再然后就是写Python脚本、写爬虫、做过大数据、玩过Flink、Hadoop、Hive、Phoniex等等,在过去一年多的时间里从无到有学习 c++ 【程序源代码】你得承认是个“技术渣渣” 正文 | 内容01—最近培训java基础开发,因为要准备课件,我在网上粟了粟相关的计算机经典书箱。可能是搜索引擎看我这么牛摆的,直接给我推荐了如下这三本书书。结果出于该死的好奇心和我十年编程得到的勇气和自信。我真地点击打开看了看这三本书,结果彻底懵逼了,有一种不好感觉就是个“渣渣”,难道我是一名“渣渣”,一名技术的小学生吗?这此刻的感觉就是这张图!我不服啊,我要继续看下去!我不服啊,我要读书!但事 java 渣渣手残党再DIY装机,翻车车祸现场惨烈! 渣渣手残党再DIY装机,以为是小试牛刀,熟能生巧,毕竟本渣渣也是业余打螺丝种子选手,专业拧螺丝多年,结果再 启动方式 固态硬盘 系统安装 通过损人的方式利己,跟渣渣有什么两样? 做个人吧 高考 女神和我哭诉说被渣男欺负了,用Python吊打渣男方案,渣男你就受着吧! 片段一事情的由来,前面几天我的朋友被一个渣男欺负了他一直在找我哭诉,说他有多渣我为朋友气不过来,打算用点特殊手法搞搞渣男,于是把想法告诉我朋友,一致达成目标就这样吊打渣男行动开始~片段二通过在网上努力的寻找,收集到这些恶搞的代码总共有三个方案给朋友看时, python 编程语言 网络 程序员 Python基础入门 渣渣手残党DIY装机必备软件工具教程推荐! 工欲善其事,必先利其器!不会拧螺丝的代码渣肯定是跟不上时代的,面试造火箭,上班打螺丝!以下为本渣渣,手残党DIY装机必备软件工具的推荐,一家之言,仅供参考,毕竟本渣渣也只是打螺丝候选种子选手,仅有微薄的DIY装机经验,相信只要肯学习,每个人都有成为专业打螺丝种子选手的可能。系统下载 微软官网系统下载网址:https://www.microsoft.com/zh-cn/software-downlo ide 系统下载 官网 学霸装学渣 这是一个关于“学霸装学渣的”故事作为一个学分绩点只有1.08挂科数量高达八门的“学渣”西南石油大学计算机科学学院软件工程2014级的学生何颖用自己的努力“逆袭”考上北大 他曾经沉迷游戏、逃课、因为睡觉不去考试,恣意的浪费着自己的青春他认为:“大学就是一个可以随便逃课打游戏,肆意谈恋爱,无人管束的地方。”这些的后果导致了他累计挂科8门,平均学分绩点只有1.08这样的成绩别说学位证了,毕业可 性能 测试培训 自动化 不光搞笑!论技术,在座都是辣鸡!深入体会俄罗斯***! 俄罗斯,远东大陆上最神奇的国度。战斗民族不但能徒手撕狗熊、醉卧冰雪地,更有传说中能影响世界格局的***专家。俄罗斯是世界上第一个有***文化的,在这里***是一份很好的职业 。 大到有***从一个商业网站盗取了超过100万张信用卡号, 美国大选、法国大选、德国大选、曝光奥运选手用药、***纳斯达克、2015年股灾等等事件都与其有着脱不开的关系。小到第一版Windows XP、泄露守望 java