原文地址:https://blog.csdn.net/shi1122/article/details/50411885
最近刚好有时间找了台机器压测了一下,验证一下自己的一些想法。

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

  1. nginx+tomcat keepalive验证

用jmeter进行压力测试,如:

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

[html] view plain copy
proxy_http_version 1.1;

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

[html] view plain copy
tcpdump tcp -i lo port 8081 -w tomcat.cap

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

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

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

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

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

采用bio,加keepalive,500并发req的情况下:

采用nio,500并发req的情况下:

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

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