nginx+tomcat的keepalive验证、bio/nio连接比较

最近刚好有时间找了台机器压测了一下,验证一下自己的一些想法。

很多时候我们会发现实际情况并不如我们所了解,一方面是实际情况并非完美,会受到许多环境的影响,所以结果有时与我们所学理论会相悖,更有甚者,有时在网上了解的理论本身或过时,或并不正确,所以在有机会、抑或有条件的情况,可是实验一下自己所学,这也可加深理解。

1. nginx+tomcat keepalive验证 


用jmeter进行压力测试,如:

nginx+tomcat的keepalive验证、bio/nio连接比较_第1张图片


nginx+tomcat的keepalive验证、bio/nio连接比较_第2张图片

根据网上的其中一种说法,只需在nginx中加上:

proxy_http_version 1.1;



即可实现长连接,在nginx中开启了以后,抓包 :

tcpdump tcp -i lo  port 8081 -w tomcat.cap


抓包以后用wireshark看看目标请求的head,发现有connection:close,说明连接并非长连接。


继续在upstream中加上keepalive,抓包看,还是带上了connection:close。


继续在nginx中主动加上connection:keepalive,再次抓包,终于保持连接了。


抓nginx的的包,可以看到有keepalive: 



2. bio及nio连接下进行简单的压测



采用bio,加keepalive,500并发req的情况下: 
nginx+tomcat的keepalive验证、bio/nio连接比较_第3张图片

nginx+tomcat的keepalive验证、bio/nio连接比较_第4张图片



采用nio,500并发req的情况下:
nginx+tomcat的keepalive验证、bio/nio连接比较_第5张图片

nginx+tomcat的keepalive验证、bio/nio连接比较_第6张图片



从上面的截图,可以看到结果基本跟预料的一直,bio的情况下,线程会比较多,1k多,基本比nio情况下多1k,也因此VIRT内存会占用更多,以单线程占1m,多1k线程,基本也要多占用1g左右的内存。

因此到底要用那种连接,还是要看实际情况,如果要做网络接入层,当然会用nio,不然要同时承受那么多的并发连接,哪来这么多的资源给消耗,不过估计不会有人拿它做接入层吧!



你可能感兴趣的:(tomcat)