假设您使用(阻塞) BIO连接器,如下所示:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000" redirectPort="8443" maxConnections="1000" maxThreads="200" />
你做了201个并发连接,最后一个连接发生了什么?
如果您建立了1001个并发连接,那么最后一个连接会发生什么情况?
接下来,让我们使用(非阻塞) NIO连接器protocol="org.apache.coyote.http11.Http11NioProtocol"。
如果我们建立201和1001并发连接,会有什么不同吗?
据我所知,NIO和NIO2之间没有行为差异,只有实现不同,这是真的吗?
当没有APR/本机连接器可用时,Tomcat 8在默认协议设置下使用什么连接器protocol="HTTP/1.1"?
-编辑-编辑
我做了一个这样的小servlet:
Thread.sleep(2000);
response.getWriter().write("ok");设置这些设置connectionTimeout="20000" maxConnections="10" maxThreads="2"并发出50个并发请求。所有这些都将被接受,然后一次执行2(执行线程完成时)。即使是connectionTimeout="20000"和maxConnections="10",也没有请求超时或出现错误。
protocol="org.apache.coyote.http11.Http11NioProtocol"和protocol="org.apache.coyote.http11.Http11Protocol"完全一样。我想,当您有Keep-Alive连接时,差别就会显现出来。BIO将在整个连接期间阻塞一个线程,NIO将在每次请求后释放该线程。
正如Dennis所指出的,当我测试相同的场景(但添加了参数acceptCount="15" )时,只有在那时大多数请求才返回org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8080 refused。
注意,如果我设置了这个maxConnections="100" acceptCount="15",那么所有50个连接都被接受了。
发布于 2016-03-17 13:53:45
下面是配置参数:Apache 8配置参考,基本上是Executor,标准实现中的队列默认长度是: acceptCount=100
Max连接是总共接受多少个连接(在队列中和正在处理中)。联系被拒绝了,我想是基于先达成的任何东西。
NIO不受请求处理器线程的限制。
这是好的摘要/比较
https://stackoverflow.com/questions/36061897
复制相似问题