OutOfMemoryError unable to create new native thread

news/2025/2/24 7:32:28

现象

生产环境大量的报OutOfMemoryError: unable to create new native thread

Caused by: java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start0(Native Method) [na:1.8.0_291]
	at java.lang.Thread.start(Thread.java:717) [na:1.8.0_291]
	at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:957) [na:1.8.0_291]
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1378) [na:1.8.0_291]
	at com.alibaba.nacos.shaded.io.grpc.internal.DnsNameResolver.resolve(DnsNameResolver.java:349) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.DnsNameResolver.refresh(DnsNameResolver.java:197) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.ManagedChannelImpl.refreshNameResolution(ManagedChannelImpl.java:456) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.ManagedChannelImpl.refreshAndResetNameResolution(ManagedChannelImpl.java:450) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.ManagedChannelImpl.handleInternalSubchannelState(ManagedChannelImpl.java:896) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.ManagedChannelImpl.access$5000(ManagedChannelImpl.java:106) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.ManagedChannelImpl$SubchannelImpl$1ManagedInternalSubchannelCallback.onStateChange(ManagedChannelImpl.java:1465) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.InternalSubchannel.gotoState(InternalSubchannel.java:326) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.InternalSubchannel.gotoNonErrorState(InternalSubchannel.java:316) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.InternalSubchannel.access$300(InternalSubchannel.java:65) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.InternalSubchannel$TransportListener$2.run(InternalSubchannel.java:544) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.internal.InternalSubchannel$TransportListener.transportShutdown(InternalSubchannel.java:535) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.grpc.netty.ClientTransportLifecycleManager.notifyShutdown(ClientTransportLifecycleManager.java:53) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler.onConnectionError(NettyClientHandler.java:485) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler.onError(Http2ConnectionHandler.java:641) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler$FrameDecoder.decode(Http2ConnectionHandler.java:380) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:438) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1421) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[nacos-client-2.0.4.jar!/:na]
	at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[nacos-client-2.0.4.jar!/:na]
	... 1 common frames omitted

排查过程

容器的request和limits都是4GB,用arthas查看进程内存,内存充足的

[arthas@1]$ memory 
Memory                                                                                    used                         total                         max                           usage                         
heap                                                                                      705M                         3399M                         3641M                         19.37%                        
ps_eden_space                                                                             458M                         660M                          1333M                         34.35%                        
ps_survivor_space                                                                         8M                           8M                            8M                            95.77%                        
ps_old_gen                                                                                238M                         2731M                         2731M                         8.75%                         
nonheap                                                                                   270M                         285M                          -1                            94.65%                        
code_cache                                                                                101M                         102M                          240M                          42.15%                        
metaspace                                                                                 151M                         164M                          -1                            92.47%                        
compressed_class_space                                                                    17M                          19M                           1024M                         1.70%                         
direct                                                                                    277K                         277K                          -                             100.00%                       
mapped           

查看线程数量

[arthas@1]$ thread
Threads Total: 288, NEW: 0, RUNNABLE: 57, BLOCKED: 0, WAITING: 82, TIMED_WAITING: 137, TERMINATED: 0, Internal threads: 12 

查看pid_max和threads-max 等影响线程创建的参数

[root@eis-module-system-pro-5b669cc4cf-dg4kh kernel]# pwd
/proc/sys/kernel
[root@eis-module-system-pro-5b669cc4cf-dg4kh kernel]# more pid_max 
98304
[root@eis-module-system-pro-5b669cc4cf-dg4kh kernel]# more threads-max 
12377471

容器里面查,各种尝试下来都没有问题。直到有个同事提醒我,是不是线程数量超过了物理机的限制。我觉得很有道理,物理机上的容器用的是宿主机的资源,我们一个物理机上200多个pod。所有的容器的线程的总和超过物理机的限制是有可能的。于是等下一次告警的时候,找运维登上物理机排查。

总线程数:
在这里插入图片描述

物理机的线程数限制
在这里插入图片描述
运维在执行命令的时候,会概率性的出现 fork: cannot allocate memeory的现象,可以从侧面佐证线程数量确实不够了(free 看内存是够用的)。运维把这个参数调大之后,就不再报OOM了。
过了一会儿,运维排查到,有个应用一个实例会创建6万+线程。这个应用一共6个实例,6个实例所在的物理机的其他业务都受到了影响。

总结

在这里插入图片描述

容器不同于虚拟机,他是没有操作系统内核空间的。所有的容器是公用物理机操作系统的资源的。当所有容器使用的线程数量的和大于物理机的线程的限制,创建新的线程就会失败。


http://www.niftyadmin.cn/n/5864086.html

相关文章

w803|联盛德|WM IoT SDK2.X测试|window11|TOML 文件|外设|TFT_LCD|测试任务|(5):TFT_LCD_LVGL示例

TFT_LCD_LVGL 功能概述 此应用程序是使用 WM IoT SDK 进行 LVGL 功能的示例。它演示了如何初始化 TFT LCD 设备,并创建 LVGL DEMO Task 进行 LVGL 模块的初始化,并展示 LVGL 原生的不同 Demo 场景, 例如: Widgets, Music Player, Benchmark…

跟着 Lua 5.1 官方参考文档学习 Lua (8)

文章目录 4 – The Auxiliary Library4.1 – Functions and Types字符串缓冲区luaL_BufferluaL_buffinitluaL_addcharluaL_addstringluaL_addlstringluaL_addvalueluaL_prepbufferluaL_addsizeluaL_pushresult例子:luaL_Buffer 的使用 函数参数检查luaL_argchecklua…

SQL ①-数据库 || MySQL

这里是Themberfue 数据库 ✨进入到目前的学习阶段中,数据库相信大家并不陌生,但是如果要说出概念的话那可能还是有点困难的,这里我就简单罗列出数据的一些相关概念,虽然这部分内容只是理论知识,但是非常重要。 &…

AI探索笔记:浅谈人工智能算法分类

人工智能算法分类 这是一张经典的图片,基本概况了人工智能算法的现状。这张图片通过三个同心圆展示了人工智能、机器学习和深度学习之间的包含关系,其中人工智能是最广泛的范畴,机器学习是其子集,专注于数据驱动的算法改进&#…

C++关键字之mutable

1.介绍 在C中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的…

QT闲记-状态栏,模态对话框,非模态对话框

1、创建状态栏 跟菜单栏一样,如果是继承于QMainWindow类,那么可以获取窗口的状态栏,否则就要创建一个状态栏。通过statusBar()获取窗口的状态栏。 2、添加组件 通常添加Label 来显示相关信息,当然也可以添加其他的组件。通过addWidget()添加组件 3、设置状态栏样式 …

Spark内存并行计算框架

spark核心概念 spark集群架构 spark集群安装部署 spark-shell的使用 通过IDEA开发spark程序 1. Spark是什么 Apache Spark™ is a unified analytics engine for large-scale data processingspark是针对于大规模数据处理的统一分析引擎 spark是在Hadoop基础上的改进&…

论文笔记(七十二)Reward Centering(四)

Reward Centering(四) 文章概括摘要附录A 伪代码 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.09999…