Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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 NIO非阻塞读取返回超时(linux内核问题?)_Java_Linux_Kernel_Nio_Nonblocking - Fatal编程技术网

Java NIO非阻塞读取返回超时(linux内核问题?)

Java NIO非阻塞读取返回超时(linux内核问题?),java,linux,kernel,nio,nonblocking,Java,Linux,Kernel,Nio,Nonblocking,我遇到了如下所述的类似问题: 我有一个用JavaNIO实现的应用程序。它跟踪一组套接字,当它们准备好读取时,我的应用程序将在循环中读取(为了简洁起见,删除了代码和一些逻辑): 但在第一次读取()时,我很少收到超时异常: 我深入研究了jdk源代码,read0函数只调用套接字句柄上的read()。如果read()返回-1且errno==ETIMEDOUT,则引发“连接超时”异常 我们不使用soSetTimeout()或tcp keepalive选项。由于我只在客户端集群上看到了这一点,所以我无法复制

我遇到了如下所述的类似问题:

我有一个用JavaNIO实现的应用程序。它跟踪一组套接字,当它们准备好读取时,我的应用程序将在循环中读取(为了简洁起见,删除了代码和一些逻辑):

但在第一次读取()时,我很少收到超时异常:

我深入研究了jdk源代码,read0函数只调用套接字句柄上的read()。如果read()返回-1且errno==ETIMEDOUT,则引发“连接超时”异常

我们不使用soSetTimeout()或tcp keepalive选项。由于我只在客户端集群上看到了这一点,所以我无法复制它(我也没有netstat或其他工具的输出)

我想知道linux内核在什么情况下以非阻塞读取()返回ETIMEDOUT?这是一个bug还是一个特性

有关出现此问题的机器的更多信息:

Linux slave1 2.6.18-164.e15 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
CentOS 5.4
谢谢 克里斯

编辑: 根据我的日志文件(和程序流),套接字是在服务器接受传入连接时创建的。然后,至少有一个来自该套接字的recv成功,但两次服务器写入失败。然后我在阅读时发现了一个例外。 日志文件没有太多信息-因此,到目前为止,我无法100%确定我的分析。我已经在套接字例程中添加了很多调试输出,现在我为下一次做了更好的准备


感谢所有有用的评论

您的客户端尝试连接,但未收到响应,最终超时


EJP,谢谢您的更正。

您正在阅读一个尚未正确完成的连接。可能您在非阻塞模式下进行了连接,但您没有收到
OP_connect
事件;您尚未调用
finishConnect()
;或者它没有返回
true

不,它没有返回。这表示连接一开始从未完成。“从未完成”表示未连接?那不是真的。连接是开放的,收到了数据。@cruppstahl我觉得很难相信。我建议你没有准确地观察你的症状。这是可能的-我只有日志文件用于分析。谢谢你的建议,我会调查的。是否有可能OP_CONNECT丢失了,但select()已经声明套接字是可读的?@cruppstahl Readability在CONNECT之后才有意义。是的,我知道,但看看我的代码,就是这样。NIO选择器返回“Readable”,因此会调用read(),这会超时。我假设(但未验证)选择器使用select()。我将对此进行调查。@cruppstahl您是否(1)注册了OP_CONNECT,其他什么都没有(2)获取该事件(3)调用finishConnect()(4)finishConnect()返回true(5)注册OP_READ?@EJP-我注意到,根据日志文件,服务器向客户端发送响应时两次失败。然后它捕获了超时异常。对我来说,这意味着套接字工作正常(至少读取成功),这意味着它也连接正常,select()表示套接字已准备好读取。然而,日志实际上并不包含太多信息。我增加了调试输出,如果错误再次出现,那么我应该有更多信息。谢谢你的帮助!
    java.io.IOException: Connection timed out
    at sun.nio.ch.FileDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:202)
    at sun.nio.ch.IOUtil.read(IOUtil.java:175)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)
Linux slave1 2.6.18-164.e15 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
CentOS 5.4