原创 

Netty是如何解决 JDK epoll 空轮询的 Bug 呢

分类:java    61人阅读    Damon  2023-09-17 11:21

我们抛开其他细枝末节,直接定位到事件轮询 select() 方法中的最后一部分代码,一起看下 Netty 是如何解决 epoll 空轮询的 Bug。

long time = System.nanoTime();
if (time - TimeUnit.MILLISECONDS.toNanos(timeoutMillis) >= currentTimeNanos) {
    selectCnt = 1;
} else if (SELECTOR_AUTO_REBUILD_THRESHOLD > 0 &&
        selectCnt >= SELECTOR_AUTO_REBUILD_THRESHOLD) {
    selector = selectRebuildSelector(selectCnt);
    selectCnt = 1;
    break;
}

Netty 提供了一种检测机制判断线程是否可能陷入空轮询,具体的实现方式如下:

  1. 每次执行 Select 操作之前记录当前时间 currentTimeNanos。

  2. time - TimeUnit.MILLISECONDS.toNanos(timeoutMillis) >= currentTimeNanos,如果事件轮询的持续时间大于等于 timeoutMillis,那么说明是正常的,否则表明阻塞时间并未达到预期,可能触发了空轮询的 Bug。

  3. Netty 引入了计数变量 selectCnt。在正常情况下,selectCnt 会重置,否则会对 selectCnt 自增计数。当 selectCnt 达到 SELECTOR_AUTO_REBUILD_THRESHOLD(默认512) 阈值时,会触发重建 Selector 对象。

Netty 采用这种方法巧妙地规避了 JDK Bug。异常的 Selector 中所有的 SelectionKey 会重新注册到新建的 Selector 上,重建完成之后异常的 Selector 就可以废弃了。

点击广告,支持我们为你提供更好的服务

canvas生日快乐动画特效

按钮的hover效果覆盖过渡

原子模型CSS3动画

立体空间感3d几何体破碎

残障人士服务网站HTML模板 - Medixare

three.js立体感粒子动画

功能齐全的ReactJs管理模板 - Adminto

技能培训在线学习平台网站模板 - Collab

CSS DIV画的字母Q

单页形式个人主页HTML模板 - Wedo

CSS鼠标停靠图标变大

SEO和数字营销机构HTML模板 - SEOMY

百分比加载进度SVG线条动画

CSS 3D铅笔旋转效果

环绕式按钮菜单

React实现的电子商务管理后台模板 - Dashtar

市政府和行政机构HTML5模板 - Towngov

创意代理和初创公司HTML模板 - Wan

Tailwindcss高级管理后台模板框架 - T-Wind

法律服务和律师事务所HTML5模板 - AttorCo

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务