Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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
Java 服务器处理1000个并发文件上载/下载的nio或io?_Java_Io_Scalability_Nio - Fatal编程技术网

Java 服务器处理1000个并发文件上载/下载的nio或io?

Java 服务器处理1000个并发文件上载/下载的nio或io?,java,io,scalability,nio,Java,Io,Scalability,Nio,所以人们都说NIO比IO更快,而且扩展性更好。对于处理1000个并发GET/put的服务器来说,情况会一样吗 每个型号的简单线程最大限度地利用多个核心。NIO在这方面的地位如何 有没有办法将这两种方法结合起来?如果有,任何关于细节的链接都会更好。除了@Kumar发布的链接,我发现这一个很有用(几周前正在做这项研究): 有关更多详细的统计信息,请参见相关幻灯片。他支持java.io方法。当然,与所有事情一样,这取决于用例。十年前,NIO的伸缩性比IO好得多,这主要是因为可以有效使用的线程数量相对较

所以人们都说NIO比IO更快,而且扩展性更好。对于处理1000个并发GET/put的服务器来说,情况会一样吗

每个型号的简单线程最大限度地利用多个核心。NIO在这方面的地位如何


有没有办法将这两种方法结合起来?如果有,任何关于细节的链接都会更好。

除了@Kumar发布的链接,我发现这一个很有用(几周前正在做这项研究):


有关更多详细的统计信息,请参见相关幻灯片。他支持java.io方法。当然,与所有事情一样,这取决于用例。

十年前,NIO的伸缩性比IO好得多,这主要是因为可以有效使用的线程数量相对较少。Linux系统上的esp。e、 几百根线。今天的临界点要高得多,例如大约10000。如果您需要100000个连接,那么使用NIO是一个好主意。但是,如果您只有几千个,您可能会发现其他问题,如磁盘或网络性能,则更为关键


我几乎总是使用NIO,每个阻塞连接有一个线程。事实上,Java 7中NIO2之前的默认行为是阻塞套接字和文件。顺便说一句,NIO2使用线程池来支持其“异步”IO

一直以来,非常遗憾的是,大多数头对头测试都有糟糕的nio代码。从非常好的方面来看,使用nio(以及非windows,windows模拟它)可以获得transferTo的好处,但IO无法做到这一点。@bestsss transferTo()是一个神话。没有内核使用,甚至没有任何JNI代码。请看一下实现。这和你自己编写的代码一样。@EJP,现在你错了,看看源代码——我已经做到了,我可以说我知道NIO impl。包括本机代码非常好。提示:Linux和Solaris确实正确地支持它。Windows没有(SendFile不接受fd,而是路径名)。@bestsss我确实查看了源代码。在src/{solaris,windows}/***.java,JDK 1.6,我的最新版本中没有实现
transferTo()
。Linux源代码未分发。src/share/classes包含我上面描述的实现。@EJP,好吧,另一个提示:native/solaris/sun/nio/ch/FileChannelImpl.c
Java\u sun\u nio\u ch\u FileChannelImpl\u transferTo0(JNIEnv*env,jobject this,jint srcFD,jlong position,jlong count,jint dstFD)
注意,linux和solaris共享相同的本机代码(一些#IFDEF在这里和那里…]impl的相关部分
偏移=(off_t)position;n=sendfile(dstFD、srcFD和offset,(size_t)count);
线程太多会影响延迟,因为您实际上依赖操作系统来执行读/写优先级。对于吞吐量/大容量传输来说,这并不那么重要。对于实时类似的东西(游戏、市场数据、VoIP等)获得延迟峰值确实是不可取的。@bestsss让操作系统根据可能多个CPU中的优先级来调度线程,这比让应用程序在选定的键集周围循环,而在单个线程中没有优先级,因此可能在单个CPU中更糟糕吗?@EJP,你为什么认为应该使用probabl是否使用单个CPU?例如:在每个选择器的键数超过64个的Windows上,效率不高(waitForMultipleObjects最多使用64个套接字)。linux中的所有线程的优先级都是相同的,即被忽略。如果要为数千个连接提供服务,则使用一个线程是最简单的方法。@bestsss单线程围绕选定的键集循环如何不使用单个CPU?我发现,使用选择器而不是阻塞线程可以更有效地执行任务大量连接。然而,随着软件/硬件的改进,“大型”的数量越来越多。选择器+NIO的可取点可能非常高,以至于简单性比性能更重要(通常是这样)我通常更喜欢NIO+阻塞线程,这是一个没有得到应有的使用的选项。