linux nginx线程池,nginx使用线程池提升9倍性能

众所周知nginx使用异步,事件驱动方法处理连接。这意味着nginx使用一个worker进程处理多个连接和请求,而不是每一个请求有一个专门的进程或着线程处理(像传统架构的服务器那样,例如apache)。为了实现这个目的,nginx使用非阻塞模式的socket和高效的方法epoll和kqueue。

因为高负荷进程的数量少且相对不变(通常1个cpu核心配1个进程),它内存消耗少,cpu时间没有浪费在任务切换上。这种处理请求的方式的优势也因为nginx而被大家所熟知。nginx能够成功处理数百万并发请求同时扩展性非常好。

49d6a52dde3d7507df8e920f00ac5fea.png

不过异步,事件驱动方法还是有一个问题。或者像我想的那样有一个“敌人”。这个敌人的名字是:阻塞。不幸的是,许多第三方的模块使用阻塞调用,同时用户(甚至作为模块的开发者)也没意识到缺点。阻塞操作能毁掉nginx的性能,需要不惜一切代价避免阻塞。

甚至当前nginx的官方代码中也没有完全避免阻塞操作在所有的例子中,为了解决这个问题,新的“thread pools”机制在nginx1.7.11中被实现了。线程池是什么以及它如何使用,一会我们就讲到。

问题

首先,为了更好的理解问题,再简单介绍一下nginx的原理。

一般,nginx是一个事件handler,一个controller接收来自内核的信息关于所有连接上发生的事件和给操作系统发送命令告诉它做什么。事实上,nginx做了所有困难的工作通过组织操作系统,而操作系统只做读和写字节的常规工作。所以对于nginx来说快速响应式非常重要的。

059a2f1531b44771cabffa426273a0e7.png

事件会超时,sockets的读和写通知,发生错误的通知。nginx收到许多事件然后一个一个处理它们。因此所有事情在一个简单的循环在一个队列上通过一个线程处理。nginx从队列上取出一个消息事件然后做出反应通过写或读一个socket。在大多数情况下,这是相当快的(或许只需要几个cpu时钟去拷贝数据到内存)同时nginx继续立刻处理队列里的其他事件。

3b1e5f53f9aa69f05d76ddabcc76c85b.png

但是如果某个长和重的操作出现的时候会发生什么呢?整个事件处理循环将会被卡住等待这个操作的完成。

所以,一个阻塞的操作是指任何能够停止事件处理循环许多时间的操作。操作被阻塞有很多原因。例如,nginx可能忙于处理长时的cpu密集操作,或者需要等待访问一个资源(如一个硬盘,一个锁,一个同步方式的方法调用返回访问数据库),主要的问题是当处理这些操作的时候,nginx的worker进程不能够做其它的事情,也不能处理事件,即使有许多系统资源仍然可用,那些队列里的事件可以用这些资源来处理。

想象一个商店的销售面前排了很长的队伍,队首的人想要一个不在商店但在仓库里的东西。销售人员去库房取东西。那么整个队列会等几个小时来取这个东西,队列里的所有人都会不高兴。你能想象这些人的反应吗?队列每个人的等待时间都增加了几个小时,但是它们需要的东西就在店里,很快就能完成购买。

6eb92b7217a69809212f94eb284c8a9c.png

几乎会出现同样的事情当nginx想要读一个不在内存中缓存的大文件,需要从磁盘中读取的时候,硬盘很慢,然后队列中等待的其它请求并不一定需要访问硬盘,但他们被强制等待。结果等待时间增加,系统资源没有完全使用。

ab9c200fa79c60eb70708f7f1b5255ee.png

某些操作系统提供了异步的接口来发送文件,nginx可以使用这些接口。一个好的例子是FreeBSD。不幸的是,linux不能这样。虽然linux提供了异步接口来读文件,它有许多缺点。第一就是访问文件和缓存的对齐需求,nginx能够处理它。第二个就更糟糕一些,异步接口需要O_DIRECT标识被设置在文件描述符上,这意味着任何对文件的访问将会越过内存中的缓存,会增加磁盘的负载。所以并不是最优的在许多场景下。

为了解决这个问题,线程池在nginx1.7.11中被引进,它默认没有被加入到nginx plus中。

下面介绍一下线程池时什么和它时如何工作的。

待续。。。

原文

http://nginx.com/blog/thread-pools-boost-performance-9x/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之解决androidx.appcompat.widget.Toolbar去掉左边距

1 问题 androidx.appcompat.widget.Toolbar默认左边有间距 2 解决办法 在Toolbar下面添加如下熟悉 app:contentInsetLeft"0dp"app:contentInsetStart"0dp"app:contentInsetEnd"0dp"app:maxButtonHeight"20dp"app:titleMargin"0…

C# 配置日志记录

在 .NET Core 中,可以给配置文件使用提供程序,例如从 JSON 或 XML文件、环境变量或命令行参数中读取配置。只需要从 NuGet 包 Microsoft.ExtensionsConfiguration 中创建一个ConfigurationBuilder,并向此构建器添加提供程序。要添加 JSON 提供…

使用“using” 的 “Cursor”

很多时候,我们会写下面的这段代码: private void button1_Click(object sender, EventArgs e) {Cursor cursor Cursor.Current;this.Cursor Cursors.WaitCursor;LongTimeMethod();this.Cursor cursor; }private void LongTimeMethod() {for (int i 0…

《看聊天记录都学不会C语言?太菜了吧》(21)(必懂!题解)在现实生活中,打擂台比赛争名次竟用的是冒泡排序?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖…

ArcGIS 10.7如何获取矢量多边形所有折点的坐标(平面坐标和经纬度坐标)?

Descriptions:As shown in the figure below is a surface pattern spot, how to obtain the coordinates of each vertex (plane coordinates and latitude and longitude coordinates)? The results we want are as follows: Via data source,we get the information that…

Mahout分类算法学习之实现Naive Bayes分类示例

1.简介 (1) 贝叶斯分类器的分类原理发源于古典概率理论,是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。朴素贝叶斯分类器(Naive Bayes Classifi…

一维条形码***技术(Badbarcode)

【转】http://future-sec.com/badbarcode.html 前言在日常生活中,条形码随处可见,特别在超市,便利店,物流业,但你们扫的条形码真的安全吗?之前TK教主在PacSec介绍的条形码攻击和twitter上的demo视频太炫酷&…

ArcGIS 10.7 模型构建器Model Builder空间建模流程化作业案例----影像拼接与掩膜裁剪

Model Builder(模型构建器)是一个用来创建、编辑和管理空间分析模型的应用程序,是一种可视化的编程环境,通过对现有工具的组合完成新模型或软件的制作,为设计和实现空间处理模型(包括工具、脚本和数据)提供了一个图形化的模型框架。 本文以影像数据的拼接和掩膜裁剪为例…

Hello Playwright:(4)自动化测试

利用 Playwright 提供的 API,我们在浏览器上做的很多事情都可以自动化。例如,搜索数据、填写表单和下载文件等等。但最适合的工作,就是自动化测试 Web 应用程序。自动化测试测试是软件开发中的一项基本任务,至少,你需要…

ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法

GIS中经常会出现多部件要素的现象,为了便于检查拓扑等关系,需要将其拆分为单个的部件。例如,在用同一个图层的多个图斑去裁剪(Clip)时,或者将多个不相邻的图斑进行合并(merge)时,可能会产生多部件要素,本文演示ArcGIS10.7版本中常见的两种拆分多部件要素至单部件要素…

spring-session + redis 实现集群 session 共享

2019独角兽企业重金招聘Python工程师标准>>> 目前市面上实现session共享的方案有很多,其中比较常用的是使用Tomcat、Jetty等web服务器提供的session共享功能,以此将session内容统一存放在数据库(如mysql)或者缓存&…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(10)无底洞的循环

本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将会逐步更新。 若…

业务流水号规则生成组件

对于很多业务系统都需要生成业务流水号,如果订单号、购采单号等等;而这些业务流水号并不是简单的一个增长数值,它们很多时候都有一些不同的规则来定义,如不同类型的字母或地区拼音简写等。为了更灵活生成这些有规则的业务流水号Be…

ArcGIS中国工具(ArcGISCTools)3.2 安装教程(附安装包下载)

ArcGIS中国工具,简称CTools,集成在ArcGIS 10.x系列版本中。本文在ArcGIS10.7的基础之上,演示3.2版本安装过程,并提供下载地址共大家学习和交流。 一、安装过程

阿里云ECS,搭建MySQL5.7数据库环境

为什么80%的码农都做不了架构师?>>> 配置mysql yum源 [rootiZbp1j6oiamq7t2otpryarZ ~]# cd /data/ [rootiZbp1j6oiamq7t2otpryarZ data]# ll total 0###################################下载mysql源安装包# [rootiZbp1j6oiamq7t2otpryarZ data]# wge…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(9)集万家之长不死 python

本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将会逐步更新。 若…

【重磅】ArcGIS 10.8手把手经典图文安装教程(附安装包全套装下载,亲测可用)

ArcMap时代的最后一版软件,未来官方对ArcMap的支持将仅限于提供补丁,更新和新环境支持,换句话说ArcMap10.8.X将会是最终版本,以后不会再有ArcMap10.9了,官方建议所有人在完成工作流程后立即迁移到ArcGIS Pro。 时间真快,ArcGIS 10.7刚装完没几天,作为GISer的我,有的开始…

聊聊 C# 中的 Visitor 模式

前言 Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大。使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时应该使用这个模式及这个模式是怎么一…

AcWing 889. 满足条件的01序列(卡特兰数应用)

满足条件的01序列 假设长度为n个序列要求满足题意1的前缀0的个数不能超过1的个数 将问题抽象为从(0, 0)到(n, n) 向上走一个代表这一步对应序列中的值是1,向右走代表序列中的值是0 要想满足1的前缀0的数量大于1的数量就需要满足所有路过的途径在y x这个函数个下面…

添加ASP.NET网站资源文件夹

ASP.NET应用程序包含7个默认文件夹,分别为Bin、APP_Code、App_GlobalResources、App_LocalResources、App_WebReferences、App_Browsers和“主题”文件夹。每个文件夹都存放ASP.NET应用程序的不同类型的资源。 方法 说明Bin  包含程序所需的所有已编译程序集&#…