`

NGINX开发杀手锏-线程池

阅读更多

       nginx以高性能著称,在其内部运转的过程中,没有任何阻塞操作(极端情况还是存在),跟外部的通讯(比如fastcgi)以完全异步的方式进行。在线程池引入之前,我们已经觉得这足够完美。但是线程池的出现,让nginx在性能方面上了一个新的高度。本文将通过一个例子展现这个杀手锏。

 

1、需求:

 

我们想让nginx直接跟mysql通讯,你可以选择drizzle,这是异步的方式。本文我们为展现线程池带来的好处,用阻塞的方式与mysql进行通讯,所以选择libmysqlclient这个长久且稳定的库来操作mysql。

 

2、建立环境:

nginx:192.168.1.100

mysql:192.168.1.101

wrk1:192.168.1.102

wrk2:192.168.1.103


a、编译测试模块

> ./configure --with-threads --add-module=/xxx/nginx-http-mysql-module && make

b、配置

server {

    listen       80 ;

    #以下是mysql连接信息,请自行调整

    mysql_host      192.168.100.101;

    mysql_user      ***;

    mysql_pass      ***;

    mysql_db        ***;

    mysql_query     "select * from car";

    location /mwb {

        mysql_with_block;

    }

    location /mwt {

        mysql_with_thread;

    }

}

模块下载地址:nginx-http-mysql-module.tar.gz

3、测试

我选择wrk这个测试工具来进行压测。为了让测试更加接近真实,我选择两台客户端机器,第一台不断的制造压测,第二台用普通的方式进行测试。之所以这样是因为如果nginx服务器因为libmysqlclient阻塞了,第二台的qps的就很少。如果ngx服务器不会因为libmysqlclient阻塞,那第二台的qps会表现不错。

a、访问阻塞压测:

wrk1: > wrk -t12 -c400 -d100s http://192.168.1.100/mwb      

wrk2: > wrk -t12 -c400 -d30s http://192.168.1.100/mwb

nginx服务器

top - 23:18:23 up  3:24,  4 users,  load average: 0.19, 0.17, 0.11

Tasks: 100 total,   2 running,  95 sleeping,   3 stopped,   0 zombie

Cpu(s):  1.1%us, 45.9%sy,  0.0%ni, 41.8%id,  0.0%wa,  2.6%hi,  8.6%si,  0.0%st

Mem:   1922432k total,   677352k used,  1245080k free,    87704k buffers

Swap:  4128760k total,        0k used,  4128760k free,   386840k cached

 

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                       

21931 nobody    20   0  433m 3876 1444 R 55.9  0.2   0:50.05 nginx   


wrk1机器

Running 2m test @ http://192.168.100.134/mwb

  12 threads and 400 connections

  Thread Stats   Avg      Stdev     Max   +/- Stdev

    Latency   376.91ms  288.22ms   1.98s    65.05%

    Req/Sec    41.80     68.62   707.00     92.33%

  44629 requests in 1.67m, 8.81MB read

  Socket errors: connect 0, read 25, write 17, timeout 1629

  Non-2xx or 3xx responses: 11546

Requests/sec:    445.90

Transfer/sec:     90.11KB


wrk2机器

Running 30s test @ http://192.168.100.134/mwb

  12 threads and 400 connections

  Thread Stats   Avg      Stdev     Max   +/- Stdev

    Latency     0.00us    0.00us   0.00us    -nan%

    Req/Sec     0.00      0.00     0.00      -nan%

  0 requests in 30.02s, 0.00B read

Requests/sec:      0.00

Transfer/sec:       0.00B


b、访问线程池压测:

wrk1: > wrk -t12 -c400 -d100s http://192.168.1.100/mwt      

wrk2: > wrk -t12 -c400 -d30s http://192.168.1.100/mwt

nginx服务器

top - 23:24:56 up  3:30,  5 users,  load average: 3.00, 0.75, 0.31

Tasks:  99 total,   2 running,  95 sleeping,   2 stopped,   0 zombie

Cpu(s):  0.7%us, 93.4%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.7%hi,  5.3%si,  0.0%st

Mem:   1922432k total,   687728k used,  1234704k free,    88016k buffers

Swap:  4128760k total,        0k used,  4128760k free,   391292k cached

 

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                       

22010 nobody    20   0  882m 5564 1452 R 96.5  0.3   0:28.20 nginx  


wrk1机器

[root@localhost ~]# wrk -t12 -c400 -d100s http://192.168.100.134/mwt

Running 2m test @ http://192.168.100.134/mwt

  12 threads and 400 connections

  Thread Stats   Avg      Stdev     Max   +/- Stdev

    Latency   455.77ms  388.01ms   2.00s    80.91%

    Req/Sec    61.15     53.08   310.00     69.47%

  51479 requests in 1.67m, 9.17MB read

  Socket errors: connect 0, read 15, write 0, timeout 1249

  Non-2xx or 3xx responses: 8037

Requests/sec:    514.30

Transfer/sec:     93.80KB


wrk2机器

[root@localhost ~]# wrk -t12 -c400 -d30s http://192.168.100.134/mwt

Running 30s test @ http://192.168.100.134/mwt

  12 threads and 400 connections

  Thread Stats   Avg      Stdev     Max   +/- Stdev

    Latency   734.96ms  177.00ms   2.00s    87.92%

    Req/Sec    47.40     50.75   310.00     83.23%

  10943 requests in 30.09s, 1.79MB read

  Socket errors: connect 0, read 8, write 0, timeout 513

  Non-2xx or 3xx responses: 862

Requests/sec:    363.63

Transfer/sec:     60.91KB


测试总结:

开启线程池后,nginx的cpu得到更充分利用,第二台机器没有因为第一台的不断访问而受到处理阻碍,跟我们预期的一样,性能得到可观的提升。

4、解释

nginx引入线程池后本质上解决了什么呢?主线程不会被阻塞。它将阻塞的操作转移到了其它的线程,但又能得到回调通知的处理。所以在处理并发的能力上很接近异步的方式。可以说,这让nginx开发业务模块有了更多的选择,毕竟阻塞式的库比异步的容易实现,而且开源的也更丰富。相信不久以后,会有更多的nginx模块冒出来,拭目以待吧。需要说明的是,线程池是为了解决‘阻塞’,如果您的应用没有这个问题,引入线程池反而增加了不必要的开销。

5、线程池是如何实现的

 

如果想了解线程池的分析,在ngx内部如何实现,以及如何开发基于线程池的模块。阅读 nginx源码分析之线程池

推荐阅读:NGINX使用线程池提升性能9x倍

 

 

转自:http://nglua.com/articles/12.html

 

分享到:
评论
1 楼 shi3689476 2017-05-27  
你好,模块下载地址还能提供一下吗?

相关推荐

    nginx-sticky-module-1.25.zip

    nginx sticky是nginx的module,可以实现基于cookie的负载均衡。 下载后,在编译安装nginx时,用--add-module... ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=../nginx-sticky-module-1.25 --without-...

    nginx带nginx-http-flv模块windows编译版rtmp

    Nginx-RTMP是Nginx的一个扩展模块,由Adobe Systems开发,用于支持Real-Time Messaging Protocol (RTMP)。RTMP是一种协议,常用于在线流媒体传输,如视频直播服务。Nginx-RTMP模块允许Nginx接收来自Flash Player或...

    nginx-http-flv-module(windows & nginx1.19.3 & http-flv-module1.2.7).zip

    1、最新版 nginx-http-flv-module(windows可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动

    nginx + nginx-http-flv-module-1.2.9

    nginx-http-flv-module 是由 nginx 开发社区创建的一个第三方模块,用于在 Nginx 上实现 HTTP 直播(HTTP Live Streaming,HLS)和FLV格式的视频流。FLV(Flash Video)是 Adobe Flash 平台广泛使用的视频格式,...

    win环境使用nginx的nginx-http-flv-module.zip

    在windows 7 64位 环境下使用nginx的nginx-http-flv-module搭建flv视频流播放所有的安装包,参考:https://blog.csdn.net/qq_33071429/article/details/102628008

    添加nginx-http-flv-module模块并重新编译后的nginx(windows版)

    本资源提供的是一款针对Windows平台的Nginx,其中已经集成了`nginx-http-flv-module`模块,这个模块主要用于支持HTTP实时流(HTTP Live Streaming, HLS)和Flash视频流(Flash Video, FLV)。现在我们将深入探讨这一...

    nginx-http-flv-module(linux & nginx1.19.3 & http-flv-module1.2.7).zip.zip

    1、最新版 nginx-http-flv-module(linux可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动 4、sbin/nginx -c conf/nginx.conf

    nginx-http-flv-module(windows版)

    --> nginx-1.21.6 ======================== 在网上查找半天都只有教程,没有可免费下载的版本,深知没有积分遍地找资源的痛苦,无奈之下只好自己按照教程一步一个坑编译出来的,供大家免费下载使用。(无毒放心使用...

    nginx1.23.2-麒麟-aarch64

    **Nginx 1.23.2 麒麟版 for AArch64 知识点详解** Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,广泛应用于互联网服务,以其高效的并发处理能力和低内存消耗而闻名。在"nginx1.23.2-麒麟-aarch64"这个...

    windows下编译nginx-http-flv-moudle

    3. **nginx-http-flv-module**: 这是Nginx的一个第三方模块,由社区开发,用于支持HTTP FLV直播。它提供了处理RTMP流并将它们转化为适应HTTP的FLV流的能力,让客户端可以无插件播放。 4. **编译过程**: 在Windows上...

    windows平台nginx编译nginx-http-flv-module

    在给定的压缩包文件中,"使用必看.txt"可能包含了编译和使用过程中的注意事项,而"nginx-rtmp.zip"可能是包含了RTMP模块的源代码,这在搭建流媒体服务器时也会用到,因为HTTP FLV Module通常与RTMP模块结合使用,为...

    nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

    Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route (a)客户端首次发起访问请求,nginx接收后,发现...

    nginx-http-flv-module-1.2.10(包含nginx-rtmp-module)

    而nginx-rtmp-module则是一个额外的Nginx模块,它增加了对Real-Time Messaging Protocol (RTMP)的支持,使Nginx能够作为RTMP服务器接收并分发直播流。 1. **HTTP FLV 模块详解** HTTP FLV模块使得Nginx可以处理FLV...

    nginx-upstream-jvm-route 和 nginx 对应版本,亲测可用

    此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...

    nginx1.16.1+nginx-upload-module-2.3.0.zip

    【标题】"nginx1.16.1+nginx-upload-module-2.3.0.zip" 涉及的核心知识点是 Nginx 和一个特定的模块 —— nginx-upload-module。Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于高并发场景,其轻量级...

    nginx-1.19.3_nginx-http-flv-module.rar

    标题中的"nginx-1.19.3_nginx-http-flv-module.rar"表明这是一个关于Nginx服务器的软件包,特别地,它包含了Nginx的1.19.3版本,并且已经集成了`nginx-http-flv-module`模块。这个模块是用于支持HTTP FLV(Flash ...

    nginx上传下载之nginx-upload-module-2.3.0

    cp -r ../nginx-upload-module-2.3.0 nginx-1.21.x/ cd nginx-1.21.x/ ./configure --add-module=../nginx-upload-module-2.3.0 \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-pcre make ...

    nginx-module-vts-0.1.18.tar.gz

    解压之后安装如下:mv nginx-module-vts-0.1.18 /usr/local/ yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel cd /usr/local/nginx/nginx-1.13.7 ./configure --add-module=/...

    NGINX集成nginx-http-flv

    【标题】"NGINX集成nginx-http-flv" 涉及的核心技术是将Nginx Web服务器与HTTP FLV模块结合,以实现高效的实时流媒体服务。Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,而HTTP FLV模块则允许它支持Flash ...

    nginx-1.19.3-http-flv.zip

    资源说明: 1. 采用nginx最新版编译,包含最新的nginx-http-flv-module,以及基础...1. 将压缩包解压到D:\nginx-1.19.3目录下 2. 使用cmd命令打开DOS,并切换到D:\nginx-1.19.3 3. 使用nginxservice.exe install安装

Global site tag (gtag.js) - Google Analytics