前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >报错 解决-bash: fork: retry: Resource temporarily unavailable

报错 解决-bash: fork: retry: Resource temporarily unavailable

作者头像
MickyInvQ
发布2020-09-27 10:40:21
3.2K0
发布2020-09-27 10:40:21
举报
文章被收录于专栏:InvQ的专栏
报错

在curl 一个 spring boot 应用接口的时候,出现这个情况,看着启动ok,但是出现如下提示

在这里插入图片描述
在这里插入图片描述

错误表达的意思是: 程序创建的线程数量已达到上限值 使用ulimit

系统设置–ulimit 语  法:ulimit [-aHS][-c <core文件上 限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数 目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数 目>][-v <虚拟内存大小>]

补充说明:ulimit为shell内建指令,可用来控制shell执行程序的资源。

参  数: -a  显示目前资源限制的设定。 -c <core文件上限>  设定core文件的最大值,单位为区块。 -d <数据节区大小>  程序数据节区的最大值,单位为KB。 -f <文件大小>  shell所能建立的最大文件,单位为区块。 -H  设定资源的硬性限制,也就是管理员所设下的限制。 -m <内存大小>  指定可使用内存的上限,单位为KB。 -n <文件数目>  单个进程可以打开文件句柄的数量 -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。 -s <堆叠大小>  指定堆叠的上限,单位为KB。 -S  设定资源的弹性限制。 -t <CPU时间>  指定CPU使用时间的上限,单位为秒。 -u <程序数目>  用户最多可开启的程序数目。 -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

代码语言:javascript
复制
ulimit -a
代码语言:javascript
复制
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128354
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

查看当前用户数:

代码语言:javascript
复制
top
代码语言:javascript
复制
w

只有三个

代码语言:javascript
复制
 3 users

查看当前进程数:

代码语言:javascript
复制
 ps -ef | wc -l

964(当时忘了看是都是什么进程,下次再次遇到会统计)

查看当前

代码语言:javascript
复制
lsof | wc -l

额,这个机器上没装losf命令

代码语言:javascript
复制
-bash: lsof: command not found
影响

已经影响到了java 程序

代码语言:javascript
复制
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: unable to create new native thread

JVM向操作系统申请创建新的 native thread(原生线程)时, 就有可能会碰到 java.lang.OutOfMemoryError: Unable to create new native thread 错误. 如果底层操作系统创建新的 native thread 失败, JVM就会抛出相应的OutOfMemoryError. 原生线程的数量受到具体环境的限制, 通过一些测试用例可以找出这些限制, 请参考下文的示例. 但总体来说, 导致 java.lang.OutOfMemoryError: Unable to create new native thread 错误的场景大多经历以下这些阶段:

  • Java程序向JVM请求创建一个新的Java线程;
  • JVM本地代码(native code)代理该请求, 尝试创建一个操作系统级别的 native thread(原生线程);
  • 操作系统尝试创建一个新的native thread, 需要同时分配一些内存给该线程;
  • 如果操作系统的虚拟内存已耗尽, 或者是受到32位进程的地址空间限制(约2-4GB), OS就会拒绝本地内存分配;
  • JVM抛出 java.lang.OutOfMemoryError: Unable to create new native thread 错误。
解决方法

系统其它普通用户最多进程默认是1024个,而root用户是 unlimited(不受限制)

这边之前使用的是非root 用户,所以最大进程数是1024,而每分钟进程数目都会变化,如果增大到1024则不能再处理任何linux命令。

所以使用root用户登录(运维操作),修改/etc/security/limits.d/90-nproc.conf文件中的值

在这里插入图片描述
在这里插入图片描述

soft指的是当前系统生效的设置值,软限制也可以理解为警告值。 hard指的是系统中所能设定的最大值。soft的限制不能比hard限制高(即小于等于)

再次查看

代码语言:javascript
复制
ulimit -a
代码语言:javascript
复制
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128354
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 10240
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
注意

如果无限制的增加句柄数,会导致服务器在fd(文件描述符)的维护和切换上小号过多的精力,从而降低应用的吞吐量

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 报错
  • 影响
  • 解决方法
  • 注意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档