问题b642798223462d2b09dd0efc95121084__fallback_source1height1280mount_node_tokenOxMCdNqYHop7Nvxm3hecTZqJnPGmount_pointdocx_imagepolicyequalwidth1280Caused by: java.lang.OutOfMemoryError: unable to create new native thread这是困扰了我们一个很久的OOM问题经常在一个节点上面多服务压力上来时出现表面上是一个程序OOM但具体又是里面的一个分支 线程问题。出现的症状是不只是说一个服务是跑在同一个节点上的所有服务而且是需要创建新线程的服务都出现无法创建新线程的异常日志从节点的资源上看CPU和内存资源都还比较充足只使用到了一半。我们查看这个节点上的总线程数如下图趋势72b051f7a67a39c1e3fc66fbca277587__fallback_source1height1280mount_node_tokenG0AydTLlIoPjLzxit4Vc2sgQnCbmount_pointdocx_imagepolicyequalwidth1280经常性出现从经验上来看节点的总线程数到达32000后无不例外就有服务出现了unable to create new native thread的异常而且比较坑的是此异常对服务的/actuator/health 健康检测接口无法探测即此接口状态返回UP导致服务不会重启但服务又无法接收新请求。接下来查看节点的总线程数设置未设置之前。宿主机上执行内核级最大线程数如果不文件不存在则手动加一个cat /proc/sys/kernel/threads-max返回32768最大PID值cat /proc/sys/kernel/pid_max返回32768当前用户可创建的最大进程/线程数(nproc)ulimit -u返回32768#查看最大线程数内核参数 通常 32768sysctl kernel.pid_max返回32768cat /etc/security/limits.conf设置之后的c98553a03b6ac9d9d107f6118596495e__fallback_source1height1280mount_node_tokenLivVdZGtwoCb3Jxc4gwcFWf3n4cmount_pointdocx_imagepolicyequalwidth1280从以上几个指令查看结果来看确实是总线程数限制到了32000。解决用户可创建的最大线程数 min (max user processes, threads-max, pid_max)当然先止血先调大宿主机节点的总线程数都拉到最大655350提升系统级线程数上限当前 32768 可能不够sysctl -w kernel.threads-max655350sysctl -w kernel.pid_max655350持久化echo “kernel.threads-max 655350” /etc/sysctl.confecho “kernel.pid_max 655350” /etc/sysctl.confsysctl -p调整用户级 nproc 限制 /etc/security/limits.conf 追加root soft nofile 655350root hard nofile 655350soft nofile 655350hard nofile 655350调整系统进程数配置在/etc/sysctl.conf添加最大进程和线程数量配置kernel.pid_max655350kernel.threads-max655350执行sysctl -p加载并应用内核参数执行sysctl -a |grep threads-max和sysctl -a |grep pid_max进行验证。目前根据运维提供的资料将系统里面能改的参数都改了但……将服务启动过了不久仍然还有服务报无法创建新线程的异常。至此开始怀疑是不是配置没生效但从ulimit -a的一些指令来看都是没问题的那就唯一一条路重启大法。也许是需要将服务器重启才能生效。于是建议将服务器进行了重启结果总线程数终于能突破32000至此配置生效。当然 也要同时优化程序代码从宿主机上统计应用时发现有多个java应用线程数达到4000以上甚至到了8000多多个服务加一起总数肯定会超32000。