您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

性能提升9倍的 nginx 线程池,你了解多少?

时间:2020-07-01 15:08:22  来源:  作者:

相对于Apache的同步IO模型,Nginx由于采用了NIO的缘故,性能上碾压前者。Nginx是轻量级的,占用的系统资源更少,天然支持高并发。

今天我们就简单的讨论一下nginx的线程模型。注意不是进程模型哦。

nginx的IO模型,大家应该都有所了解。简单而言,就是一个master进程和多个worker进程(进程数由配置决定);master进程负责accept请求并队列化,最后转发给worker进程并由其进行请求处理和响应的整个过程。

nginx是以多进程模式运行的。nginx在1.7.11版本提供了多线程特性(multi-threading),不过这个多线程仅用在aio模型中对本地文件的操作上,出发点就是以非阻塞模式,来提高文件IO的效率和并发能力。

所以这个多线程,并不是nginx通过多线程的方式处理proxy request(这部分是通过epoll模式),而是用来处理本地的一些静态文件。

这里涉及到几个基本指令:sendfile、aio和directio,它们均与本地文件的操作有关,接下来我们分别看看它的意义。

sendfile

这个指令与系统函数sendfile()具有相同的语义,sendfile的目的就是提高本地文件通过socket发送的效率。官方的博客介绍了如何利用nginx 线程池aio,实现9倍的性能。

它还有一个比较好记的名称,叫做零拷贝。那与传统的文件读取然后发送到网络上,有什么区别呢?

磁盘、网络驱动器、内存是三种不同的传输介质,如果从本地读取一个文件并通过socket发送出去,通常情况下是进过如下几个步骤:

  • 1)磁盘驱动器从根据CPU的调度,从磁盘读取一定长度(chunk)的字节数据
  • 2)字节数据copy到内核内存中
  • 3)将内核内存中的数据copy到进程工作区内存
  • 4)进程通过socket将数据copy到网络驱动器缓存, 并通过相应的传输协议发送出去。

可以看到,数据的发送过程涉及到多次copy,这受限于计算机系统的设计问题。

sendfile的主要出发点,就是要减少数据的copy以提高发送效率,sendfile是linux系统级的调用,socket可以通过DMA(直接内存访问)方式直接访问文件数据,并通过传输协议发送,减少了2次数据copy(磁盘到内核,内核到工作区)。

sendfile_max_chunk参数用于限定每次sendfile()调用发送的最大数据尺寸,如果不限制大小的话,将会独占整个worker进程,默认为“无限制”。这也太霸道了。

对于nginx而言,代理静态本地的静态文件资源(通常是小文件)将是非常高效的,建议对一些静态文件比如html、图片等,开启此参数。

location /video {
    sendfile on;
    sendfile_max_chunk 128k;
    aio on;
}

directio

这个指令用于开启对O_DIRECT标记(BSD,linux)的使用,对应directio()这个系统调用。

此参数是针对大文件而设定的,sendfile针对的是小文件。通过directio可以指定限定的尺寸大小,对于超过此size的文件,将会使用directio(而不再使用sendfile)。

根据directio的设计初衷,它具备sendfile的基本原理,只是不使用内核cache,而是直接使用DMA,而且使用之后内存cache(页对齐部分)也将被释放。

因此directio通常适用于大文件读取,而且通常读取频率很低。因为对于高频的读取,它并不能提高效率(因为它不会重用cache,而是每次都DMA)。由于存在性能权衡问题,此参数默认为off。

location /video {
    sendfile on;
    directio 8m;
    aio on;
}

aio

谈到aio模型,其实语义也基本相同,就是异步文件IO,nginx默认关闭此特性,它需要在高版本的linux平台上才支持(2.6.22+)。

在linux上,directio只能读取基于512字节边界对齐的blocks,文件结束的那些未对齐的block将使用阻塞模式读取。

同样,如果文件在开头没有对齐,整个文件都将阻塞式读取。这里所谓的对齐,就是文件数据在内存页中的cache情况。

当aio和sendfile都开启时,将会对那些size大于directio设定值的文件使用aio机制:即当小于directio设定值的文件将直接使用sendfile(aio不参与)。

aio,简单而言,就是使用多线程异步模式读取较大的文件,以提高IO效率,但是事实上可能并没有任何提高。因为大文件的读取,并不能使用cache、而且本身也是耗时的,即使是多线程,对于request的等待时间也是无法预估的,特别是并发请求较高的时候。但是aio能够提高IO的并发能力,这个是确定的。

默认情况下,多线程模式是关闭的,我们需要通过--with-threads配置来开启,此特性尽在支持epoll、kqueue的平台上兼容。对于线程池的设置,我们可以通过thread_pool来声明,并在aio指令中指定。

我们的配置文件近一步丰富了一些。

thread_pool default_pool threads=16;##main上下文
...
location /video {
    sendfile on;
    sendfile_max_chunk 128k;
    directio 8M;
    aio threads=default_pool;
}

当线程池中所有的线程都处于busy状态,那么新的task请求将会加入到等待队列。我们可以在thread_pool中使用max_queue参数来指定队列的大小,默认队列大小为65536,当队列已满后续的请求将会抛出error。

END

nginx官方宣称使用多线程模式,在aio读取文件场景下,性能有9倍的提升,但我还是对这个测试具有一定怀疑态度。

多线程 + aio在一定程度的确可以提高文件IO的读取性能,但是对于大文件而言,这似乎并没有想象的那么优秀。这受制于linux平台底层的本身特性,除非nginx自己对文件cache做了额外的操作。

到目前为止,xjjdog仍有以下建议(供参考):

  • 1)对于小文件的静态代理,我们应该开启sendfile,这对性能的提升是显著的。
  • 2)对于大文件读取(低频),我们可以尝试开启aio、directio,在提升并发能力的前提下,关注request的实际响应效率;既然官方推荐这么用,我们可以报以尝试的态度。
  • 3)对于高频大文件读取,aio、directio的性能或许提升并不显著,但应该不会降低性能。


Tags:nginx 线程池   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
相对于Apache的同步IO模型,Nginx由于采用了NIO的缘故,性能上碾压前者。Nginx是轻量级的,占用的系统资源更少,天然支持高并发。今天我们就简单的讨论一下nginx的线程模型。注意不...【详细内容】
2020-07-01  Tags: nginx 线程池  点击:(48)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(9)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条