NioWorker的定义

时间:2015-12-08 16:22:02

标签: java nio mina sshd

使用Apache的Mina的SSHD工作我偶然发现了NioWorkers的数量,当我尝试修复一个行为时,70%的尝试中超过1个同时传输更大的文件会失败。增加这个值似乎有所帮助,但我无法在网上找到NioWorkers实际上是什么。我查看了Oracle的 Package java.nio 文档,并强调了Google。

任何人都可以提供链接或定义他们应该是什么吗?

2 个答案:

答案 0 :(得分:2)

NIO和IO之间的第一个重要区别是IO是面向流的,其中NIO是面向缓冲区的。

IO是面向流的意味着您从流中一次读取一个或多个字节。你对读取的字节做什么取决于你。它们不会缓存在任何地方。此外,您无法在流中的数据中前后移动。如果您需要在从流中读取的数据中前后移动,则需要先将其缓存在缓冲区中。

NIO的面向缓冲区的方法略有不同。数据被读入缓冲区,稍后处理该缓冲区。您可以根据需要在缓冲区中前后移动。这使您在处理过程中具有更大的灵活性。但是,您还需要检查缓冲区是否包含完整处理所需的所有数据。并且,您需要确保在将更多数据读入缓冲区时,不要覆盖尚未处理的缓冲区中的数据。

来源:http://tutorials.jenkov.com/java-nio/nio-vs-io.html#main-differences-between-java-nio-and-io

所以我假设worker是一个将数据从网络移动到缓冲区的线程,检查数据一致性并在收到数据时通知&准备。这是我的猜测,我的目标并非完全正确。同样的问题引导了我。

答案 1 :(得分:0)

NIO2 工作线程负责处理来自 NIO2 异步套接字的原始传入数据包。一旦数据包被部分解码并发现与 SFTP 子系统相关(在本例中),它就会被传递到 sshd-SftpSubsystem-thread-xx 以进行进一步处理。

这样,NIO2 工作线程就可以处理下一个传入的数据包(这可能与某些其他通道相关 - 例如,SCP),因此不依赖于处理前一个数据包所需的时间。

我们在选择 nio-worker 线程数时应该非常小心,因为它实际上取决于流量 - 鉴于我之前的解释。此外,有时您可能会遇到上下文切换开销问题——显然,SFTP 连接越多,运行的 sshd-SftpSubsystem-thread-xx 线程就越多,从而增加内存、CPU、I/O 和上下文切换开销。< /p>