Netty是如何解决epoll CPU占用100%问题的

Netty源码分析 - Netty中如何解决select空轮询导致cpu使用率升至100%的bug 1、 BUG出现的原因: 若Selector的轮询结果为空,也没有wakeup或新消息处理,则发生N多次空轮询,使得CPU使用率100% 2、Netty中的解决思路: 对Selector()方法中的阻塞定时 select(timeMIllinois)操作的 次数进行统计,每完成一次select操作进行一次计数,若在循环周期内 发生N次空轮询,如果N值大于BUG阈值(默认为512),就进行空轮询BU... 阅读详情

Netty 如何解决 epoll 100% CPU 问题

在 Netty 中,epoll 100% CPU 问题(也称为 epoll bug)是 Linux 系统中使用 Java NIO 的 Selector(基于 epoll)时可能遇到的一种已知问题。该问题会导致 Selector.select() 方法在某些情况下不断返回,导致 CPU 使用率飙升至 100%,严重影响性能。Netty 通过一系列优化和修复机制解决了这一问题,特别是在 NioEventLoop 和 NioEventLoopGroup 中。


1. epoll 100% CPU 问题的背景

1.1 问题描述
  • 现象:在 Linux 系统中,使用 Java NIO 的 Selector.select() 或 Selector.select(timeout) 方法可能导致 CPU 使用率达到 100%。这是因为 select() 方法在某些情况下会立即返回(即使没有 I/O 事件),导致线程进入空循环,持续调用 select()。
  • 影响:性能下降,服务器响应变慢,甚至无法处理正常请求。
  • 典型场景:
    • 高并发网络应用中,Selector 管理大量 SelectionKey。
    • 某些连接异常(如客户端断开或网络抖动)触发问题。
  • Java NIO 相关:此问题源于 JDK 的 epoll 实现(Linux 上的 NIO 使用 epoll),尤其在早期 JDK 版本(如 JDK 6 和部分 JDK 7)中较为常见。
1.2 问题原因
  • epoll 空轮询:epoll_wait(底层系统调用)可能在某些条件下(如文件描述符状态异常)立即返回,导致 Selector.select() 不阻塞,进入空轮询。
  • 常见触发条件:
    • 客户端异常断开连接,未正确关闭 Socket。
    • 网络抖动或文件描述符泄漏。
    • JDK 的 epoll 实现缺陷(在较旧版本中)。
  • 结果:NioEventLoop 的主循环(run() 方法)不断调用 select(),导致 CPU 占用过高。

2. Netty 的解决方案

Netty 通过在 NioEventLoop 中实现一系列优化和防御机制,有效解决了 epoll 100% CPU 问题。以下是具体的解决方法,结合源码分析:

2.1 检测空轮询并重建 Selector

Netty 通过检测 Selector.select() 的空轮询行为,并在必要时重建 Selector 来解决问题。这是 Netty 的核心防御机制。

源码分析(NioEventLoop.java 中的 run 方法):

protected void run() {
    for (;;) {
        try {
            switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {
                case SelectStrategy.CONTINUE:
                    continue;
                case SelectStrategy.BUSY_WAIT:
                    // fall-through to SELECT since the busy-wait is not supported with NIO
                case SelectStrategy.SELECT:
                    select(wakenUp.getAndSet(false));
                    if (wakenUp.get()) {
                        selector.wakeup();
                    }
                    // fall through
                default:
            }
            // ... 处理 I/O 事件和任务 ...
        } catch (Throwable t) {
            handleLoopException(t);
        }
    }
}

private void select(boolean oldWakenUp) {
    Selector selector = this.selector;
    try {
        int selectCnt = 0;
        long currentTimeNanos = System.nanoTime();
        long selectDeadLineNanos = currentTimeNanos + delayNanos(currentTimeNanos);

        for (;;) {
            long timeoutMillis = (selectDeadLineNanos - currentTimeNanos + 500000L) / 1000000L;
            if (timeoutMillis <= 0) {
                if (selectCnt == 0) {
                    selector.selectNow();
                    selectCnt = 1;
                }
                break;
            }

            if (hasTasks() && wakenUp.compareAndSet(false, true)) {
                selector.selectNow();
                selectCnt = 1;
                break;
            }

            int selectedKeys = selector.select(timeoutMillis);
            selectCnt++;

            if (selectedKeys != 0 || oldWakenUp || wakenUp.get() || hasTasks() || hasScheduledTasks()) {
                selectCnt = 0;
                break;
            }

            // 检测空轮询
            if (selectCnt > SELECTOR_AUTO_REBUILD_THRESHOLD) {
                // 空轮询次数超过阈值,重建 Selector
                logger.warn("Selector.select() returned prematurely {} times in a row; rebuilding Selector {}.",
                            selectCnt, selector);
                rebuildSelector();
                selector = this.selector;
                selector.selectNow();
                selectCnt = 1;
                break;
            }

            currentTimeNanos = System.nanoTime();
        }
        // ... 处理 I/O 事件 ...
    } catch (CancelledKeyException e) {
        // 无需处理
    }
}

关键逻辑:

  • 空轮询检测:
    • selectCnt 计数器记录 selector.select(timeout) 的调用次数。
    • 如果 select() 返回 0(无事件)且没有任务(hasTasks() 和 hasScheduledTasks() 为 false),selectCnt 递增。
    • 当 selectCnt 超过阈值(SELECTOR_AUTO_REBUILD_THRESHOLD,默认 512),认为发生了空轮询问题。
  • 重建 Selector:
    • 调用 rebuildSelector() 创建新 Selector,将现有 Channel 的 SelectionKey 重新注册到新 Selector。
    • 重置 selectCnt,恢复正常循环。

源码分析(rebuildSelector 方法):

public void rebuildSelector() {
    final Selector oldSelector = selector;
    final SelectorTuple newSelectorTuple;

    if (oldSelector == null) {
        return;
    }

    try {
        newSelectorTuple = openSelector();
    } catch (Exception e) {
        logger.warn("Failed to create a new Selector.", e);
        return;
    }

    int nChannels = 0;
    for (SelectionKey key : oldSelector.keys()) {
        Object a = key.attachment();
        try {
            if (!key.isValid() || key.channel().keyFor(newSelectorTuple.unwrappedSelector) != null) {
                continue;
            }

            int interestOps = key.interestOps();
            key.cancel();
            SelectionKey newKey = key.channel().register(newSelectorTuple.unwrappedSelector, interestOps, a);
            if (a instanceof AbstractNioChannel) {
                ((AbstractNioChannel) a).selectionKey = newKey;
            }
            nChannels++;
        } catch (Exception e) {
            logger.warn("Failed to re-register a Channel to the new Selector.", e);
            if (a instanceof AbstractNioChannel) {
                AbstractNioChannel ch = (AbstractNioChannel) a;
                ch.unsafe().close(ch.unsafe().voidPromise());
            }
        }
    }

    selector = newSelectorTuple.wrappedSelector;
    unwrappedSelector = newSelectorTuple.unwrappedSelector;

    try {
        oldSelector.close();
    } catch (Throwable t) {
        logger.warn("Failed to close the old Selector.", t);
    }
    logger.info("Migrated " + nChannels + " channel(s) to the new Selector.");
}

关键逻辑:

  • 创建新 Selector(openSelector())。
  • 遍历旧 Selector 的 SelectionKey,重新注册到新 Selector。
  • 更新 Channel 的 SelectionKey 引用,关闭旧 Selector。

作用:

  • 重建 Selector 解决了 epoll 空轮询问题,因为问题通常与特定 Selector 的状态相关。
  • 重新注册 Channel 确保 I/O 事件继续正常处理。
2.2 动态调整 select 策略

Netty 使用 SelectStrategy 和 SelectStrategyFactory 动态调整 Selector.select 的行为,减少空轮询的可能性。

源码分析(run 方法中的 selectStrategy):

switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {
    case SelectStrategy.CONTINUE:
        continue;
    case SelectStrategy.BUSY_WAIT:
        // fall-through to SELECT
    case SelectStrategy.SELECT:
        select(wakenUp.getAndSet(false));
        // ...
    default:
}

关键逻辑:

  • selectStrategy.calculateStrategy 根据是否有任务(hasTasks())决定是否调用 selectNow()(非阻塞)或 select(timeout)(阻塞)。
  • 如果有任务或事件,优先使用 selectNow() 快速检查,减少阻塞时间。
  • 避免不必要的 select 调用,降低 CPU 占用。
2.3 自适应超时

Netty 在 select 方法中动态计算超时时间,减少空轮询的持续时间。

源码分析(select 方法中的超时计算):

long currentTimeNanos = System.nanoTime();
long selectDeadLineNanos = currentTimeNanos + delayNanos(currentTimeNanos);
long timeoutMillis = (selectDeadLineNanos - currentTimeNanos + 500000L) / 1000000L;

关键逻辑:

  • 使用 delayNanos 计算下一次任务的延迟时间,动态调整 select 的超时时间。
  • 如果 timeoutMillis <= 0,调用 selectNow(),避免空轮询。

3. 其他优化措施

  • 配置阈值:

    • 系统属性 io.netty.selectorAutoRebuildThreshold(默认 512)控制空轮询检测阈值,可根据需求调整。
    • 示例:-Dio.netty.selectorAutoRebuildThreshold=256 降低阈值,提前重建 Selector。
  • JDK 版本兼容:

    • Netty 的机制弥补了早期 JDK(如 JDK 6 和部分 JDK 7)中 epoll 的缺陷。
    • 在较新 JDK(如 JDK 8+)中,epoll 问题已部分缓解,但 Netty 的防御机制仍有效。
  • 日志记录:

    • Netty 在检测到空轮询或重建 Selector 时记录警告日志,便于调试。
    • 示例:Selector.select() returned prematurely 512 times in a row; rebuilding Selector.

4. 总结

  • epoll 100% CPU 问题:
    • 由 Java NIO 的 Selector.select() 空轮询引起,通常源于 epoll_wait 的异常返回。
  • Netty 的解决方案:
    • 空轮询检测:通过 selectCnt 计数器检测连续空轮询,超过阈值(默认 512)触发 rebuildSelector。
    • 重建 Selector:创建新 Selector,重新注册 Channel,解决 epoll 问题。
    • 动态 select 策略:根据任务状态选择 selectNow 或 select(timeout),减少不必要调用。
    • 自适应超时:动态调整 select 超时时间,降低空轮询影响。
    • 异常处理:捕获 CancelledKeyException 等,保持循环稳定。
  • 在 NioEventLoopGroup 中的作用:
    • 管理多个 NioEventLoop,分配任务和 Channel。
    • NioEventLoop 的 run 方法实现空轮询检测和修复。
Netty EventLoopGroup 详解:Nio、Epoll、Poll 、KQueue和IoUring Netty 是一个高性能的网络通信框架,它使用 EventLoopGroup 来处理 I/O 事件。不同的 EventLoopGroup 实现针对不同的操作系统和应用场景优化性能。和,并提供了详细的代码示例和注释。 阅读详情

相关推荐

Netty : 臭名昭著的JDK的NIO bug(空轮询bug)

1.美图 2.概述 在搞这个问题的时候 Netty:Netty不断打开文件的BUG 一直找不到原因,然后偶然想了一下是不是netty的空轮询bug,后来查了一下真的是,第一感觉居然是,我草,我草,好兴奋,太他妈刺激了,我居然遇到了传说中的bug,哈哈哈哈,容我笑一会。 在 李林峰的<Netty权威指南>,第2.6.1章写到不使用JDK原生NIO框架的原因是JDK存在epoll bu...

九师兄 5030

netty系列之:epoll传输协议详解

在前面的章节中,我们讲解了kqueue的使用和原理,接下来我们再看一下epoll的使用。两者都是更加高级的IO方式,都需要借助native的方法实现,不同的是Kqueue用在mac系统中,而epoll用在liunx系统中。 epoll的详细使用 epoll的使用也很简单,我们还是以常用的聊天室为例来讲解epoll的使用。 对于server端来说需要创建bossGroup和workerGroup,在NIO中这两个group是NIOEventLoopGroup,在epoll中则需要使用EpollEvent

m0_69860228的博客 2164

合金理论自动化工具包(Alloy-Theoretic Automated Toolkit:ATAT)的安装

合金理论自动化工具包(ATAT)是一个通用名称,指的是合金理论工具的集合,它包含了不同的代码工具,具体如下: 1)根据第一性原理(映射和映射)构造集群扩展的代码。簇展开是一种非常紧凑和有效的表达式,给出取代合金的能量作为其构型的函数(即原子的类型位于晶格的哪个位置)。 2)为了计算合金的热力学性质,从聚类展开开始,对晶格模型进行蒙特卡洛模拟(emc2和memc2)的代码。 3)执行晶格动力学计算的代码(fitfc, fitsvsl, svsl) 4)使用简单的物理或半经验模型计算电子和磁自由能贡献

qq_33400046的博客 1万+

深入理解Netty底层基础、中断、NIO、epoll~~~~

高性能网络通信IO是如何实现的?Netty底层IO机制是啥?响应式线程模型是什么东西?BIO、NIO、Epoll都是写什么牛马;一次网络通信底层都经历了什么?这篇文章通通告诉你!

m0_52255061的博客 1121

Qt C++实现HTTP/HTTPS服务器与客户端:从Socket到协议解析全流程

HTTP协议作为Web通信的基础,定义了客户端与服务器之间基于文本的请求-响应模型。其工作原理是通过TCP连接传输结构化的报文,实现资源获取与数据交换。在C++开发中,掌握HTTP协议底层实现具有重要技术价值,能够帮助开发者构建高性能、可深度定制的网络应用,尤其适用于嵌入式设备管理、桌面应用后端等场景。本文聚焦于使用Qt框架的QTcpSocket和QSslSocket组件,从Socket层面手动实现完整的HTTP/HTTPS通信栈,涵盖协议解析、流式处理、路由分发等核心环节,并深入探讨了HTTPS证书验证、

weixin_31292729的博客 329

保姆级教程:在Android车机上从零配置USB Gadget,搞定CarPlay有线连接

本文详细介绍了在Android车机上从零配置USB Gadget以实现CarPlay有线连接的完整实践指南。涵盖内核驱动开发、Android系统配置及用户空间通信架构,帮助开发者深入理解USB子系统和iAP2协议栈,实现稳定可靠的CarPlay有线连接功能。

weixin_30621711的博客 472

Netty中如何解决select空轮询导致cpu使用率升至100%的bug

1、 BUG出现的原因: 若Selector的轮询结果为空,也没有wakeup或新消息处理,则发生N多次空轮询,使得CPU使用率100% 2、Netty中的解决思路: 对Selector()方法中的阻塞定时 select(timeMIllinois)操作的 次数进行统计,每完成一次select操作进行一次计数,若在循环周期内 发生N次空轮询,如果N值大于BUG阈值(默认为512),就进行空...

Kevan的博客 3943

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3941

Selector空轮询

JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单可以参见以下链接内容。 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719 https://bugs.java.com/bugdat

zhengchao1991的博客 2279

保姆级教程:Halcon 3D点云匹配与差异分析避坑指南(从采样到可视化)

本文提供了一份详细的Halcon 3D点云匹配与差异分析实战指南,涵盖从模型准备到可视化的全流程。重点解析了STL文件读取单位误区、点云采样密度优化、表面模型创建技巧以及差异分析的专业手法,帮助用户避开常见陷阱,提升工业检测效率与精度。

weixin_33728268的博客 402

nRF52811墨水屏时钟DIY:从全刷到局刷的实战改造指南(附完整代码)

本文详细介绍了如何将基于nRF52811的墨水屏时钟从耗电的全屏刷新模式改造为高效的局部刷新模式。通过剖析全刷与局刷的原理差异,提供了从工程架构、驱动层适配到应用层逻辑重构的完整实战指南,并附上关键代码示例。改造后,设备功耗显著降低,续航大幅提升,同时解决了视觉闪烁问题,是DIY低功耗墨水屏应用的实用参考。

weixin_29194693的博客 351

Netty学习之旅------图说Netty线程模型,mysql索引面试题索引失效

private void select(boolean oldWakenUp) throws IOException { Selector selector = this.selector; try { int selectCnt = 0; long currentTimeNanos = System.nanoTime(); long selectDeadLineNanos = currentTimeNanos + delayNanos(currentTimeNanos); for (;???? { lon

m0_64867896的博客 148

(P2)PALM软件的基本使用流程

上一篇介绍了PALM在Ubuntu系统上的下载安装及安装后的目录文件结构,这一篇以自带的案例介绍软件的基本操作流程。(请转至example_cbl项目) 输入 声明:官网均有各个变量的说明,以下代码来自软件自带案例 palm的最小输入文件是p3d文件,以下是example_cbl_p3d的详细说明。(文件语言格式Fortran,请自行先学习下语言的基本语法。笔者也是新学者,有非常多的问题,很多参数也不能准确的说出是什么意思,还请不吝赐教,谢谢!!!) !几点说明 !1、该运行文件基本由三大块组成:1)in

ysqzhatian的博客 3259

java nio空轮循_【Java NIO空轮询bug和Netty中的解决方法】

1、问题提出https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6670302简单来说:epoll机制是Linux下一种高效的IO复用方式,相较于select和poll机制来说。其高效的原因是将基于事件的fd放到内核中来完成,在内核中基于红黑树+链表数据结构来实现,链表存放有事件发生的fd集合,然后在调用epoll_wait时返回给应用程序,由...

weixin_42169674的博客 713

3D高斯压缩黑科技开源!1GB场景压到42MB,Web3D迎来“WebP时刻”——SOG格式深度解析

Web3D迎来革命性突破!PlayCanvas开源全新3D高斯泼溅压缩格式SOG,将1GB场景压缩至仅42MB,体积缩小95%,加载速度提升10倍+。SOG通过将3D数据编码为WebP纹理+元数据,实现GPU零拷贝实时渲染,完美兼容WebGL/WebGPU。实测显示,4百万高斯点的场景在手机上1.5秒内完成加载,内存占用降低83%。这一技术突破为电商展示、虚拟旅游、工业设计等领域带来新机遇,开发者可通过开源工具链快速集成。SOG被誉为"3D界的WebP",有望成为下一代3D互联网的基础设

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 862

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

nio epoll空轮询bug与netty的解决方案

epoll空轮询

weixin_40857858的博客 585

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

<span class=“js_title_inner“>生产事故:Undertow容器的xnio线程引发CPU100%的方案验证后续(二)</span>

1. 系统对高并发、高性能的要求不高。通过在启动参数加如下参数,不走epoll模式。2. 切换web容器:undertow切换成tomcat+netty模式。最终把undertow 更换成 tomcat 就正常了。故此,方式1的配置是无效的,已废弃。字数 161,阅读大约需 1 分钟。

Java技术干货 429

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

一个被IT搞的 2509

【空轮询克星】Netty如何根治JDK NIO的CPU 100% Bug?高性能背后的稳定性设计

想象大厦的电梯控制系统:fill:#333;color:#333;color:#333;fill:none;正常情况:电梯请求控制系统调度电梯空轮询Bug:虚假请求疯狂空转JDK NIO空轮询现象本应在有事件时返回但Bug会导致无事件时立即返回0结果:CPU疯狂空转飙升至100%!真实灾难案例某交易所系统半夜CPU 100%,导致早盘无法开市,损失超$2亿!

全栈开发工程师 1547

Netty源码解析-Netty解决Nio epoll bug

前言: Netty作为一个优秀的NIO框架,不仅仅是对JDK NIO的使用进行封装,使其更易用,而且对其一些原生BUG也进行了修复。其中epoll cpu 100%的一个bug的修复更是经典。 1.bug产生的场景 常规使用NIO ServerSocket来接收连接的方式如下: Selector selector = Selector.open(); while (true) { int count = selector.select(); Set<SelectionKe

恐龙弟旺仔的博客 1888

Netty 源码解密:如何用 512 次空转检测破解 JDK NIO 的 epoll 死循环 Bug?

/ 正常情况:无事件时应阻塞// 空轮询 Bug 触发时:selector.select() 立即返回 0// 这里会无限循环打印,CPU 飙到 100%System.out.println("空轮询!");continue;// 处理就绪事件...问题现象本应在无 I/O 事件时阻塞,等待事件到来Bug 触发时,select() 会立即返回 0,但没有任何就绪事件线程陷入无限循环,CPU 占用率瞬间飙升至 100%参数值效果过小(如 16)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2199

Netty的epoll空轮询bug解决

【Netty基础】Netty的高性能及NIO的epoll空轮询bug Selector BUG出现的原因: 若Selector的轮询结果为空,也没有wakeup或新消息处理,则会一直空轮询,占用CPU,导致CPU使用率100%, Netty的解决办法: 1、对Selector的select操作周期进行统计,每完成一次空的select操作进行一次计数, 2、若在某个周期内达到了N次的空轮询,则会触发epoll死循环bug。 3、将问题Selector上注册的Channel转移到新建的Selector上; 4

Hanyinh的博客 1567

Netty Epoll空轮询Bug解析与解决方案

在网络编程中,Epoll是Linux系统高效的I/O多路复用机制,通过epoll_create、epoll_ctl和epoll_wait三个系统调用实现高并发连接处理。其核心原理是事件驱动模型,避免了传统select/poll的线性扫描开销。但在实际工程应用中,JDK对Epoll的封装存在缺陷,可能导致虚假唤醒问题,表现为CPU空转100%。Netty框架通过引入死亡计数器机制,在检测到异常空轮询时自动重建Selector,有效解决了这一底层问题。该方案在推送服务、即时通讯等高并发场景中尤为重要,既保证了系

weixin_33883104的博客 224

java nio空轮循_java NIO的空轮询bug 以及Netty的解决办法

这个bug是指 java的NIO在linux下selector.select()时,本来如果轮询的结果为空并且不调用wakeup的方法的话,这个selector.select()应该是一直阻塞的,但是java却会打破阻塞,继续执行,导致程序无限空转,造成CPU使用率100% 这个bug只出现在linux系统下,因为linux下NIO底层使用的是epoll来实现的,而java的epoll实现存在bu...

weixin_39980347的博客 442

Netty巧妙的规避了JDK在linux中NIO的epoll的空轮询Bug

一、NIO的空轮询bug描述 JDK1.5开始引入了epoll基于事件响应机制来优化NIO。相较于select和poll机制来说,epoll机制将事件处理交给了操作系统内核(操作系统硬中断)来处理,优化了elect和poll模型的无效遍历问题。 但是JDK中epoll的实现却是有漏洞的,其中最有名的就是NIO空轮询bug(该bug只存在于Linux,因为Linux中NIO底层是使用epoll实现的,而Windows不是)。 理论上无客户端连接时Selector.select() 方法会阻塞,但空轮询b.

HD243608836的博客 1903

Netty常见问题

为什么选择Netty 原生的NIO有JDK epoll空轮询bug bug描述 对于突然中断的Socket连接,jdk底层的对epoll的实现可能出现bug,这个bug表现为selector.select()不会阻塞,而是直接返回,此时是并没有事件发生的。因此select()的返回值会为0,那么while循环就会一直循环执行,最终可能导致cpu占用率达到100% Netty如何解决这个问...

用月光取暖的博客 770
上一篇: Netty中FastThreadLocal解读
下一篇: Netty中NioEventLoop源码解析
Jooou
博客等级 码龄9年 226粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值