Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有并发慢速TCP客户端连接的tomcat Java NIO_Java_Http_Tomcat_Servlets_Tcp - Fatal编程技术网

具有并发慢速TCP客户端连接的tomcat Java NIO

具有并发慢速TCP客户端连接的tomcat Java NIO,java,http,tomcat,servlets,tcp,Java,Http,Tomcat,Servlets,Tcp,我的未启动状态 无NIO时: 对于每个keepAlive连接,服务器继续阻止线程 使用NIO时: 此连接器有两个轮询器线程,用于在数据(新HTTP请求)可用时调用工作线程,同时保持所有连接用户的连接处于活动状态 现在: 如果我有一个简单的servlet,它向客户端(浏览器)返回一个100KB的字符串 如果连接1 KB的客户端连接,则接收字符串大约需要100秒。 那么java线程是否会被阻塞大约100秒 TCP缓冲区、JavaOutputStream或Writer或其他缓冲区如何影响线程阻塞时间

我的未启动状态

无NIO时:
对于每个keepAlive连接,服务器继续阻止线程

使用NIO时:
此连接器有两个轮询器线程,用于在数据(新HTTP请求)可用时调用工作线程,同时保持所有连接用户的连接处于活动状态

现在: 如果我有一个简单的servlet,它向客户端(浏览器)返回一个100KB的字符串

如果连接1 KB的客户端连接,则接收字符串大约需要100秒。
那么java线程是否会被阻塞大约100秒

TCP缓冲区、Java
OutputStream
Writer
或其他缓冲区如何影响线程阻塞时间

PS:在centos 7和oracle JDK 1.7中使用apache-tomcat-8.0.24

编辑:如前所述,线程确实会被阻塞,缓冲区可以减少线程阻塞时间。。如何使用这些缓冲区来减少tomcat/OS的线程阻塞时间

如何在生产环境中检测tomcat是否由于连接到它的许多慢连接客户端而缺少线程

那么java线程是否会被阻塞大约100秒

TCP缓冲区、Java OutputStream或Writer或其他缓冲区如何影响线程阻塞时间


如果缓冲区足够大,足以容纳发送的数据,发送线程将不会阻塞。

您能告诉我如何通过增加这些不同类型的缓冲来减少线程阻塞时间的tomcat/OS参考资料吗?我不同意@EJP的第二句话:缓冲区只有在操作系统级别时才会有帮助。OutputStream或Writer类中的缓冲区不会有帮助,因为一旦Tomcat尝试刷新所有未完成的数据,它们仍然会阻塞。与其开始修补缓冲区,不如将请求超时减少到可接受的水平。如果一个用户占用线程太长时间而导致饥饿,那么及时为这些用户杀死线程将解决您的问题。无论您的问题是由用户引起的,还是您正在提供的文件太大,操作系统方面可能不会有什么优化。仔细查看服务器的配置。@Codo我的第二句话是正确的。我没有说任何关于缓冲区“帮助”的内容,从阻塞的角度来看,您所说的缓冲区没有区别。一旦所有缓冲区都满了,发送就会阻塞。关于NIO的讨论没有意义。在Tomcat容器中,您无法选择切换IO技术。您必须使用Tomcat提供的同步编写器实例。但我同意,许多缓慢的连接可能是一个严重的现实问题。您希望有多少并发连接?100? 1000? 10000? 100000?@Codo我们在具有尖峰负载行为的站点上工作。突然,500个客户端可以连接。这可能会转换为500*(4个来自浏览器的TCP连接)=2000。。是的,许多线程可能会很慢。对于2000个并行连接,最实用的解决方案是将Tomat工作线程的数量增加到2000个(甚至更多)。今天的服务器应该可以轻松处理这么多线程。不过,您可能需要为Tomcat分配足够的内存。如果你说的是100000个连接,那就不一样了。另一个选择——如果你的响应不包含任何用户或会话特定数据,因此是可缓存的——是将nginx作为缓存放在Tomcat前面。nginx可以选择立即使用整个响应,并以给定的慢速将其转发给客户端。如果您的响应不可缓存,nginx甚至可以工作。看一看。
....
String HunderdKBString = "reallylongstring"
PrintWriter out = response.getWriter();
out.println(HunderdKBString);
....