AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
一天里会抛出几个这样的错误,但发现服务还在正常的运行。
java.io.IOException: 指定的网络名不再可用。
at sun.nio.ch.Iocp.translateErrorToIOException(Unknown Source)
at sun.nio.ch.Iocp.access$700(Unknown Source)
at sun.nio.ch.Iocp$EventHandlerTask.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
在本地用ab进行并发测试的时候,比如: ab -n 2000 -c 200 -k http://xxx/....
当还没有运行完的时候,按Ctrl + C,服务端程序也会抛出这个异常。
说明,有可能是在发起TCP(这个可能性大一些)或关闭TCP的时候,握手没有完成。
由于在windows上,底层用Iocp实现,通过网上搜索:iocp 指定的网络名不再可用,知道了这个错误的iocp错误码:64,然后搜索:iocp 错误 64,找到几篇比较有价值的文章,下面是摘抄的一部分重点:
来源:http://topic.csdn.net/u/20080606/11/cdaaccab-e4b0-4e67-9194-8107a019a1e9.html
我们使用完成端口模式编写了一个提供下载的服务器,然后编写了一个测试程序模拟100个客户端来从服务器下载文件,测试程序是通过开启100个线程,以每个线程当作一个客户端来下载文件的,但是测试过程中出现了以下问题:
经过在多台机器上的测试,只有少数机器出现以下问题,其中最显著的机器网速是10mbps的。
在成功连接后,文件传输过程中,服务器工作者线程的GetQueuedCompletionStatus处出现了64错误(ERROR_NETNAME_DELETED),但是客户端没有退出也没有任何错误输出,把客户端线程数减少到10个时就不会出现这个问题。
哪位朋友知道这种问题的原因,请帮忙分析一下吧,谢谢大家了!(如果是不能解决的问题,也得有合理的解释,不然没法和客户解释)
回复1:
ERROR_NETNAME_DELETED(64 #错误)在我的测试中是在 client 非正常关闭 TCP 通道时会出现,即关闭的 4 次握手没有正常完成时出现。如果很好的(graceful)完成关闭,比如c/s双方shutdown等, GetQueuedCompletionStatus会成功,会pNumberOfBytes = 0
但是很多时候 TCP 通道会非正常关闭,这很正常,所以出现 ERROR_NETNAME_DELETED 也没有什么可怕的。
回复2:
这个错误,我也碰到过,分析得到的结论主要还是因为IOCP满负载工作,特别是有众多的未决IO的时候,可能某一个客户端在长时间内得不到影响就会由内核因超时而断掉。建议在这个时候,使用NetStat 查看一下相关的连接状态。
回复3:
我再描述一下测试发现的问题的一点规律吧。
在网速100mbps的机子上基本不出现该问题,基本上总是网速为10mbps的机子出现这个问题。还有就是在10mbps的机子上测试发现,模拟100个至少有20个左右出现问题,随着模拟数降低,出现问题的个数也会减少,减少到20个时,测试10次中只有一次出现了一个该问题,减少到10个时,在测试中没出现过该问题。
还有就是请大家注意一下,服务器出现64错误时:
1.客户端使用非阻塞型套接字时,客户端有超时输出
2.客户端使用阻塞型套接字时,客户端没有相应的输出
由此我认为服务器出现64错误时客户端并没有退出,而是阻塞住了。
回复4:
问题基本已经确定,应该是由于客户端的处理速度太慢,缓冲区总是满的,导致服务器认为对方结束了连接。
我是这样确定问题的,现在贴出来希望能给大家一些帮助:
由于iocp的不可控,不方便跟踪,于是服务器端我们采用普通模式,即接到一个连接就开一个线程来处理。然后跟踪调试服务器端,而客户端采用写log的方式来跟踪,最后确定出64错误的连接在服务器端是出现在文件传输过程中的send处,而服务器出64错误的时候,客户端是阻塞在recv处的(我测试时使用的是阻塞型套接字)。
之后就采用降低服务器发送速度的方式(比如在send前Sleep一下)测试一下,经过多次验证,发现只要服务器发送的速度在客户端的可承受范围内的时候(比如客户端开50个线程的时候服务器Sleep(50),开100个现成的时候就得多Sleep一会),就不会再出现这个问题。
2012-06-27
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用的更多相关文章
- hbase异常:java.io.IOException: Unable to determine ZooKeeper ensemble
项目中用到hbase,有时候可能会报一些异常,比如java.io.IOException: Unable to determine ZooKeeper ensemble 等等,当出现这个问题时,根据个 ...
- POI 导入导出时异常[java.io.IOException: Broken pipe]
使用用POI导出文件时抛出异常java.io.IOException: Broken pipe ERROR: 'java.io.IOException: Broken pipe' org.apache ...
- tomcat 启动 证书异常java.io.IOException: Alias name [cas] does not identify a key entry
在搭建CAS server的过程中,Tomcat开启https,配置秘钥证书,证书是通过keytool生成的 <Connector port=" protocol="org. ...
- 找不到文件异常java.io.IOException: Resource [classpath:shiro.ini] could not be found.
情景 tomcat启东时,老是报错,在classpath下找不到配置文件,但是配置文件已经放在resource目录下了 解决方案 出现该异常的原因,是因为新建的conf文件夹,识别不了,因为没有设置成 ...
- Hadoop与HBase中遇到的问题(续)java.io.IOException: Non-increasing Bloom keys异常
在使用Bulkload向HBase导入数据中, 自己编写Map与使用KeyValueSortReducer生成HFile时, 出现了以下的异常: java.io.IOException: Non-in ...
- windows 中使用hbase 异常:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
平时一般是在windows环境下进行开发,在windows 环境下操作hbase可能会出现异常(java.io.IOException: Could not locate executable nul ...
- org.apache.hadoop.ipc.RemoteException(java.io.IOException)
昨晚突然之间mr跑步起来了 jps查看 进程都在的,但是在reduce任务跑了85%的时候会抛异常 异常情况如下: 2016-09-21 21:32:28,538 INFO [org.apache.h ...
- Shrio | java.io.IOException: Resource [classpath:shiro.ini] could not be found
案例 今天项目启动时一直报异常,看了错误日志发现是shrio文件找不到引起的,异常: java.io.IOException: Resource [classpath:shiro.ini] could ...
- Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出 package com.test; import org.apach ...
随机推荐
- springmvc接收json注意事项
在以前使用SpringMvc框架时,在接受json数据时碰到了一些奇怪的问题.这里记录下来,方便以后查阅. 1. data 里写json对象 , 即该json数据没有被单(双)引号包住 ...
- Python基础(条件判断和循环) if elif else for while break continue;
条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age >= ...
- vue-cli 3.0 图片路径问题(何时使用 public 文件夹)
1. 图片放入public文件夹下时 参考:https://cli.vuejs.org/zh/guide/html-and-static-assets.html#public-%E6%96%87%E4 ...
- nvm管理不同版本的node和npm
写在前面 nvm(nodejs version manager)是nodejs的管理工具,如果你需要快速更新node版本,并且不覆盖之前的版本:或者想要在不同的node版本之间进行切换:使用nvm来安 ...
- 虚拟机console基础环境部署——安全加固
1. 概述 安全是一个重要的课题.广义上可以总结为: 主机安全 网络安全 信息安全 数据安全 虽然console已经是最小化安装,但是这并不能说明console就已经安全了.之前的博客对console ...
- 新手向:从不同的角度来详细分析Redis
最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...
- Codejam Qualification Round 2019
本渣清明节 闲里偷忙 做了一下codejam 水平不出意外的在投稿之后一落千丈 后两题的hidden test竟然都挂了 A. Foregone Solution 水题,稍微判断一下特殊情况(比如10 ...
- VRP基础及操作
VRP基础及操作 前言 通用路由平台VRP(Versatile Routing Platform)是华为公司数据通信产品的通用操作系统平台,它以IP业务为核心,采用组件化的体系结构,在实现丰富功能特性 ...
- mybatis mapper使用记录
insert://插入一条数据//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)//优先使用传入的参数值,参数值空时,才会使用序列.UUID,自动增长int i ...
- 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...