首页 Java-NIO-epoll-空转问题-+-Netty-解决方法

Java-NIO-epoll-空转问题-+-Netty-解决方法

举报
开通vip

Java-NIO-epoll-空转问题-+-Netty-解决方法  JavaNIOepoll空转问题+Netty解决方法  .在JavaNIO编程实践中,很多人都会选择Netty作为基础框架,而不是直接用JDK原生的NIOAPI。因为JDK原生的NIO框架内容过于繁杂、学习成本高、补齐可靠性的工作量和难度都很大、还有一些bug。其中一个著名的bug就是epollSelector空转问题。 相关Bug单《JDK-6670302:(se)NIOselectorwakesupwith0selectedkeysinfinitely[lnx2.4]》《JDK-6403933:(se)Se...

Java-NIO-epoll-空转问题-+-Netty-解决方法
  JavaNIOepoll空转问题+Netty解决方法  .在JavaNIO编程实践中,很多人都会选择Netty作为基础框架,而不是直接用JDK原生的NIOAPI。因为JDK原生的NIO框架 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 过于繁杂、学习成本高、补齐可靠性的工作量和难度都很大、还有一些bug。其中一个著名的bug就是epollSelector空转问题。 相关Bug单《JDK-6670302:(se)NIOselectorwakesupwith0selectedkeysinfinitely[lnx2.4]》《JDK-6403933:(se)Selectordoesn'tblockonSelector.select(timeout)(lnx)》《JDK-2147719:(se)Selectordoesn'tblockonSelector.select(timeout)(lnx)》 问题 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 象示例代码(仅做示例,未考虑异常处理):Java代码 while (true) {    selector.select();      Iterator it = selector.selectedKeys().iterator();    while (it.hasNext()) {      SelectionKey key = (SelectionKey) it.next();      int ops = key.interestOps();        if (0 != (ops & SelectionKey.OP_ACCEPT)) {        // 处理新连接      }        if (0 != (ops & SelectionKey.OP_READ)) {        // 读取消息      }        it.remove();    }  }   在使用JDKNIO框架时我们通常会采用上述模式的代码来处理客户端请求。执行Selector.select()方法时会一直阻塞,直到有channel就绪。但是在实践中,可能:没有channel就绪,该方法也会返回。(违反原来的阻塞行为 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 )因为没有channel就绪,所以内部的while循环不会执行。继而不断执行外部的while(true)循环。上述步骤不断重复就形成空转轮询,CPU占用率达到100%,无法执行其它任务,最终程序崩溃。 问题原因在部分Linux内核中,在poll或epoll一个已连接的socket,且请求事件掩码为0的情况下,如果连接被突然中断,那么poll/epoll会被唤醒,相应事件标识为POLLHUP(或POLLERR)。继而Selector被唤醒,且interestset为0,没有相应的Channel,select()返回值也是0。JDK-6403933写道Thisisanissuewithpoll(andepoll)onLinux.Ifafiledescriptorforaconnectedsocketispolledwitharequesteventmaskof0,andiftheconnectionisabruptlyterminated(RST)thenthepollwakesupwiththePOLLHUP(andmaybePOLLERR)bitsetinthereturnedeventset.TheimplicationofthisbehaviouristhatSelectorwillwakeupandastheinterestsetfortheSocketChannelis0itmeanstherearen'tanyselectedeventsandtheselectmethodreturns0. Netty的解决方法Netty的解决方式是重建一个新的Selector,替代原来出错的Selector。大致方法如下:在一个select周期中,统计空select操作的次数。当空select操作次数累计到阈值时,就认为触发了epoll空转bug。然后重建Selector:新建一个Selector;将原Selector上的Channel注册到新Selector;关闭原Selector。上述判定阈值默认为512。可通过JVM系统变量设置(io.netty.selectorAutoRebuildThreshold)。可在NioEventLoop类中查看相关代码。  思考可能因为此问题的根源在于底层Linux内核行为的不一致,所以Java官方一开始将其抛给了操作系统实现方,导致该bug存在了很久。也许Java官方相关决策者认为,此类bug最恰当的修复方案应该在底层操作系统,而不是由上层Java去糊一层,因为JDK有自己的设计原则,并不是无脑做得越多越好。其实这种分层分治的思维方式是非常令人欣赏的。很多优秀产品的缔造者内心都秉持这个原则。如,RobotFramework的负责人PekkaKlärck认为IronPython处理全角空格的不同方式应该由IronPython实现者去修改,而不是让RobotFramework在上面糊一层:《Supportfor'IDEOGRAPHICSPACE'(U+3000)intestdataonIronPython》反观很多产品经理,毫无原则,只会做附庸,客户说啥就是啥,领导说啥就是啥,自己也没有足够的知识和经验储备,尽出些拙劣的程序,根本不能称为产品。真的是“人人都是产品经理”。  -全文完-
本文档为【Java-NIO-epoll-空转问题-+-Netty-解决方法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
永兴文档
暂无简介~
格式:doc
大小:67KB
软件:Word
页数:9
分类:互联网
上传时间:2023-06-19
浏览量:7