首页 > 其他分享 >阿里面试:NIO为什么会导致CPU100%?

阿里面试:NIO为什么会导致CPU100%?

时间:2024-05-27 15:01:57浏览次数:9  
标签:NIO JDK 轮询 CPU100% CPU Selector 面试 bug

在 Java 中总共有三种 IO 类型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和 AIO(Asynchronous I/O,异步I/O),它们的区别如下:

  1. 在 JDK 1.4 之前,只有 BIO 一种模式,其开发过程相对简单,新来一个连接就会创建一个新的线程处理,但随着请求并发度的提升,BIO 很快遇到了性能瓶颈。
  2. 所以在 JDK 1.4 以后开始引入了 NIO 技术,NIO 可以在一个线程中处理多个 IO 操作,提高了资源的利用率和系统的吞吐量。
  3. 而到了 JDK 1.7 发布了 AIO 模型,它可以实现当线程发起一个 IO 操作后,可以直接返回,无需等待 IO 操作完成。操作系统会在整个 IO 操作完成后,通过回调函数通知应用程序。

1.空轮询和CPU100%

然而,随着 NIO 逐渐使用,人们却发现了 NIO 的一个经典问题,也就是臭名昭著的 Epoll(多路复用实现技术)空轮询的问题。

空轮询的问题是指,在 Linux 系统下,使用 Java 中的 NIO 时,即使 Selector(多路复用器)轮询结果为空,也没有 wakeup 或新消息要处理时,NIO 依旧会进行空轮询,导致 CPU 一直上升,最终造成 CPU 使用率 100% 的问题。

该 BUG 相关可以参见以下链接:

2.空轮询的原因

空轮询产生的原因可以在 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6670302 上找到答案,例如以下就是一个经典的 bug 复现场景:

A DESCRIPTION OF THE PROBLEM :
The NIO selector wakes up infinitely in this situation..
0. server waits for connection
1. client connects and write message
2. server accepts and register OP_READ
3. server reads message and remove OP_READ from interest op set
4. client close the connection
5. server write message (without any reading.. surely OP_READ is not set)
6. server's select wakes up infinitely with return value 0

也就说,当连接出现了 RST(强制连接关闭),因为 poll 和 epoll 对于突然中断的连接 Socket 会对返回的 eventSet 事件集合置为 POLLHUP 或者 POLLERR,eventSet 事件集合发生了变化,这就导致 Selector 会被唤醒,进而导致 CPU 100% 问题,其根本原因就是 JDK 没有处理好这种情况,比如 SelectionKey 中就没定义有异常事件的类型,导致异常无法被捕捉和处理,从而一直空轮询。

3.如何解决空轮询?

NIO 空轮询可能会导致 CPU 100% 的解决方案通常有以下两种:

  1. 升级 Java 版本:早期的 JDK 版本中(JDK 1.7 之前),这个 bug 较为常见,但后续的 JDK 更新中,Oracle 和 OpenJDK 团队已经着手解决了这一问题,确保使用最新的 Java 版本可以减少遇到此问题的风险。但网上依然有人发现即使在 JDK 1.8 中,使用原生的 NIO 依然会发生空轮询的问题,只是发生的概率变低了而已。
  2. 使用第三方库:对于无法升级 Java 版本的情况,或担心新版本的 JDK 中依然存在空轮询问题的团队可以考虑使用已经解决了此问题的第三方库,如 Netty。Netty 通过主动检测和处理空轮询情况,当检测到可能的空轮询时,会采取措施如临时增加 Selector 的等待时间,或者重建 Selector,以此来避免 CPU 资源的浪费。

课后思考

说说 Netty 解决空轮询的具体实现细节?为什么重建 Selector 可以避免空轮询呢?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:NIO,JDK,轮询,CPU100%,CPU,Selector,面试,bug
From: https://www.cnblogs.com/vipstone/p/18215514

相关文章

  • 【面试干货】猴子分桃问题
    【面试干货】猴子分桃问题1、实现思想2、代码实现......
  • 十分钟精通MinIO:minio的原理、部署、操作
    一、认识MinIOMinio是一个简单易用的云存储服务,就像是一个放在网络上的大文件柜。想象一下,你有一间放满了各种文件的房间,有时候你需要把这些文件分享给朋友或者在不同地方访问它们。Minio就是帮你做到这一点的工具,它让你可以轻松地把文件上传到互联网上,这样无论你在哪里,只要......
  • 近期一次护网蓝队面试记录分享
    近期一次护网蓝队面试记录分享前言以下为近期的一次蓝队面试记录,答案为本人回答仅作参考,错误之处,多多包涵面试过程及回答自我介绍如实回答学校经历,是否参与项目,尽量简短把你参与的项目和成功说出来就行使用过哪些设备,出现误报怎么办(在校生未使用,网上搜的,背诵就行)天眼,EDR,全......
  • 面试官:Redis 用的多?那你说说他的内存使用和优化吧
    Redis的内存使用和优化一、reids内存分析二、redis内存使用1、对象内存2、缓冲内存三、redis子进程内存消耗1、关于linux系统的写时复制机制:2、关于linux的透明大页机制THP(TransparentHugePage):3、关于linux配置:四、redis内存管理1、内存上限:maxmemory2、内存回......
  • 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
    一、写在开头  今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工作毫无问题,但现在即便你是应届生,问的考题也非常的深入和细节了,只会背八股,没有一定的代码量和......
  • Spring Cloud 面试题(五)
    1.Eureka的自我保护模式是什么?Eureka的自我保护模式是一种应对网络异常的安全保护措施,旨在防止因网络分区或其他异常情况导致服务实例被错误地注销。当EurekaServer在短时间内丢失过多的客户端心跳时,会触发自我保护机制。以下是自我保护模式的几个关键点[40][41][46]:触......
  • Spring Cloud 面试题(六)
    1.Nginx与Ribbon的区别Nginx与Ribbon都是负载均衡器,但它们在设计定位、工作方式以及使用场景上存在一些区别:定位与角色:Nginx是一个通用的反向代理服务器,主要作为服务端的负载均衡器和反向代理,位于客户端和后端服务器之间。它通常以独立的服务器程序运行,可以作为独立的......
  • Spring Cloud 面试题(四)
    1.什么是微服务架构?微服务架构是一种软件开发架构风格,它将应用程序作为一组小的服务构建,每个服务运行在其独立的进程中,并通常围绕业务功能进行组织。这些服务可以通过定义良好的轻量级机制(通常是HTTPRESTfulAPI)进行通信。每个服务是自包含的,意味着它拥有自己的业务逻辑......
  • Spring Cloud 面试题(三)
    1.什么是SpringCloudGateway?SpringCloudGateway是SpringCloud的一个项目,旨在为微服务架构提供一种简单而有效的API网关解决方案。它是基于SpringFramework5和SpringBoot2.x构建的,并且设计为一个路由层,用于将请求路由到正确的服务实例。SpringCloudGateway的......
  • 彻底火了!《AIGC 面试宝典》圈粉无数!
    2022年下半年以来,文本生成图像快速出圈,多款应用持续火爆。国外文生图代表:Midjourney、StableDiffusion、OpenAI的DALL-E:海外模型SD开源,进一步促进了国内大厂的研究热情和应用落地:随着多模态技术迭代,图像生成、视频生成、3D生成、音频生成等AIGC应用加速落地,相关岗......