epoll bug简述
在NIO中通过Selector的轮询当前是否有IO事件就绪,根据JDK NIO api描述,Selector的select方法会一直阻塞,直到IO事件达到或者超时,但是在Linux平台上这里有时会出现问题,在某些场景下select方法会直接返回,即使没有超时并且也没有IO事件达到,这就是著名的epoll bug,这是一个比较严重的bug,它会导致线程陷入死循环,会让CPU飙到100%,极大地影响系统的可靠性,到目前为止,JDK都没有完全解决这个问题。
在netty如何规避
epoll bug在netty中有效的规避了这个问题,经过实践证明,epoll bug已在netty框架中解决,netty的处理方式是这样的:
记录select空转的次数,定义一个阈值,这个阈值默认是512,可以在应用层通过设置系统属性io.netty.selectorAutoRebuldThreshold传入,当空转的次数超过了这个阈值,重新构建新Selector,将老Selector上注册的Channel转移到新建的Selector上,关闭老Selector,用新的Selector代替老Selector,详细实现可以查看NioEventLoop中的selector和rebuildSelector方法。
网友评论