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
相关推荐
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-http-flv-module 是由 nginx 开发社区创建的一个第三方模块,用于在 Nginx 上实现 HTTP 直播(HTTP Live Streaming,HLS)和FLV格式的视频流。FLV(Flash Video)是 Adobe Flash 平台广泛使用的视频格式,...
Nginx-RTMP是Nginx的一个扩展模块,由Adobe Systems开发,用于支持Real-Time Messaging Protocol (RTMP)。RTMP是一种协议,常用于在线流媒体传输,如视频直播服务。Nginx-RTMP模块允许Nginx接收来自Flash Player或...
1、最新版 nginx-http-flv-module(windows可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动
在windows 7 64位 环境下使用nginx的nginx-http-flv-module搭建flv视频流播放所有的安装包,参考:https://blog.csdn.net/qq_33071429/article/details/102628008
本资源提供的是一款针对Windows平台的Nginx,其中已经集成了`nginx-http-flv-module`模块,这个模块主要用于支持HTTP实时流(HTTP Live Streaming, HLS)和Flash视频流(Flash Video, FLV)。现在我们将深入探讨这一...
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-1.21.6 ======================== 在网上查找半天都只有教程,没有可免费下载的版本,深知没有积分遍地找资源的痛苦,无奈之下只好自己按照教程一步一个坑编译出来的,供大家免费下载使用。(无毒放心使用...
3. **nginx-http-flv-module**: 这是Nginx的一个第三方模块,由社区开发,用于支持HTTP FLV直播。它提供了处理RTMP流并将它们转化为适应HTTP的FLV流的能力,让客户端可以无插件播放。 4. **编译过程**: 在Windows上...
在给定的压缩包文件中,"使用必看.txt"可能包含了编译和使用过程中的注意事项,而"nginx-rtmp.zip"可能是包含了RTMP模块的源代码,这在搭建流媒体服务器时也会用到,因为HTTP FLV Module通常与RTMP模块结合使用,为...
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route (a)客户端首次发起访问请求,nginx接收后,发现...
**Nginx 1.23.2 麒麟版 for AArch64 知识点详解** Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,广泛应用于互联网服务,以其高效的并发处理能力和低内存消耗而闻名。在"nginx1.23.2-麒麟-aarch64"这个...
而nginx-rtmp-module则是一个额外的Nginx模块,它增加了对Real-Time Messaging Protocol (RTMP)的支持,使Nginx能够作为RTMP服务器接收并分发直播流。 1. **HTTP FLV 模块详解** HTTP FLV模块使得Nginx可以处理FLV...
此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...
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 ...
【标题】"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服务器的软件包,特别地,它包含了Nginx的1.19.3版本,并且已经集成了`nginx-http-flv-module`模块。这个模块是用于支持HTTP FLV(Flash ...
解压之后安装如下: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 Web服务器与HTTP FLV模块结合,以实现高效的实时流媒体服务。Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,而HTTP FLV模块则允许它支持Flash ...
资源说明: 1. 采用nginx最新版编译,包含最新的nginx-http-flv-module,以及基础...1. 将压缩包解压到D:\nginx-1.19.3目录下 2. 使用cmd命令打开DOS,并切换到D:\nginx-1.19.3 3. 使用nginxservice.exe install安装