SSH远程连接命令执行没反应不报错问题解决(-bash: fork: retry: Resource temporarily unavailable.[资源暂时不可用])

本文主要是介绍SSH远程连接命令执行没反应不报错问题解决(-bash: fork: retry: Resource temporarily unavailable.[资源暂时不可用]),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面


我遇到了什么问题:

  • 很老的一个系统bug原因升级,大概五六年没有重启机器了,4A平台上面通过ssh远程连接Linux机器,偶尔连接不上
  • 即使连接之后命令无法正常执行,执行了没有反应。
  • 即使可以执行,执行命名报-bash: fork: retry: Resource temporarily unavailable.(资源暂时不可用)

出现问题的原因是什么:

Linux进程数超过了设置的最大进程数。会对系统进行资源限制,所以分配给ssh进程的资源时有时无,一些命令的bash进程会被杀调,以保证系统进程不超过设置的最大进程数,无法正常执行。即下面的第一个输出要远远小与第二个和第三个输出。如果有些接近就会出现这种问题

┌──[root@liruilongs.github.io]-[/]
└─$ ps -eLf | wc -l  # 当前进程数
221
┌──[root@liruilongs.github.io]-[/]
└─$ ulimit  -u  # 用户的最大进程数
15665
┌──[root@liruilongs.github.io]-[/]
└─$ sysctl kernel.pid_max # 内核设置的最大进程数
kernel.pid_max = 150000
┌──[root@liruilongs.github.io]-[/]
└─$

我是怎样解决的

修改内核参数,调整最大进程数限制。这里修改的话需要root权限,同时需要修改两个地方。

其一:用户登录会加载pam_limit模块,pam_limit模块读取配置文件 /etc/security/limits.conf来限制用户资源的占用。可以使用ulimit的命令来查看和临时设置资源信息,也可以通过 写入/etc/security/limits.conf来永久配置,配置文件在每次登录时会加载。可以用来设置ssh连接数,最大进程数等。

其二:Linux系统中内核kernel模块,有个全局的设置最大进程数的内核参数,需要修改这个参数,内核参数的设置方式有临时设置和永久设置两种方式,临时设置完就会刷新,重启失效。可以先临时设置后查看效果,然后永久设置。

人生当苦无妨,良人当归即好.——烽火戏诸侯《雪中悍刀行》


查看当前用户的活跃进程数

┌──[root@liruilongs.github.io]-[/]
└─$ ps -eLf | wc -l  # 当前进程数
221

查看用户允许运行的最大进程数

┌──[root@liruilongs.github.io]-[~]
└─$ ulimit  -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15665
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15665
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited  # 无限大
┌──[root@liruilongs.github.io]-[~]
└─$

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

语法:

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

参数:
-a显示目前资源限制的设定。
-c<core文件上限>  设定core文件的最大值,单位为区块。
-d<数据节区大小>  程序数据节区的最大值,单位为KB。
-f<文件大小>  shell所能建立的最大文件,单位为区块。
-H设定资源的硬性限制,也就是管理员所设下的限制。
-m<内存大小>  指定可使用内存的上限,单位为KB。
-n<文件数目>  指定同一时间最多可开启的文件数。
-p<缓冲区大小>  指定管道缓冲区的大小,单位512字节。
-s<堆栈大小>  指定堆栈的上限,单位为KB。
-S设定资源的弹性限制。
-t<CPU时间>  指定CPU使用时间的上限,单位为秒。
-u<进程数目>  用户最多可开启的进程数目。
-v<虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。
┌──[root@liruilongs.github.io]-[~]
└─$ ulimit  -u
15665
默认值
用户描述
root 账号ulimit -u的值 默认是/proc/sys/kernel/threads-max的值/2,即系统线程数的一半
普通账号ulimit -u的值 默认是 /etc/security/limits.d/20-nproc.conf

修改用户允许运行的最大进程数

临时修改
┌──[root@liruilongs.github.io]-[~]
└─$ ulimit  -u 75535
┌──[root@liruilongs.github.io]-[~]
└─$ ulimit  -u
75535
┌──[root@liruilongs.github.io]-[~]
└─$
永久修改

/etc/security/limits.conf 文件里添加如下内容

* soft nproc 65535      * hard nproc 65535    
关键字描述
nproc是操作系统级别对每个用户创建的进程数的限制
nofile是每个进程可以打开的文件数的限制
soft xxx代表警告的设定,可以超过这个设定值,但是超过后会有警告。
hard xxx代表严格的设定,不允许超过这个设定的值。
┌──[root@liruilongs.github.io]-[~]
└─$  echo "* soft nproc 65535"  >> /etc/security/limits.conf
┌──[root@liruilongs.github.io]-[~]
└─$ echo "* hard nproc 65535"  >> /etc/security/limits.conf
┌──[root@liruilongs.github.io]-[~]
└─$ cat /etc/security/limits.conf  | grep nproc
#        - nproc - max number of processes
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
* soft nproc 65535
* hard nproc 65535
┌──[root@liruilongs.github.io]-[~]
└─$

从新通过ssh的方式登录,就会刷新 ulimit -u的值

查看Linux内核模块kernel允许的最大进程数

查看kernel.pid_max的内核参数

┌──[root@liruilongs.github.io]-[~]
└─$ sysctl -a | grep pid_max  #查看pid的内核参数
kernel.pid_max = 131072
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.br-0e0cdf9c70b0.stable_secret"
sysctl: reading key "net.ipv6.conf.br-4b3da203747c.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.ens32.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
┌──[root@liruilongs.github.io]-[/]
└─$ sysctl kernel.pid_max
kernel.pid_max = 131072

根据变量找到对应的内核参数文件位置

┌──[root@liruilongs.github.io]-[~]
└─$ cd /proc/sys/kernel/;cat pid_max
131072

调整kernel.pid_max内核参数

临时调整内核参数
┌──[root@liruilongs.github.io]-[/proc/sys/kernel]
└─$ echo 150000 > pid_max
┌──[root@liruilongs.github.io]-[/proc/sys/kernel]
└─$ cat pid_max  # 临时调整内核参数
150000
永久调整kernel.pid_max内核参数
┌──[root@liruilongs.github.io]-[/]
└─$ echo "kernel.pid_max = 150000" >> /etc/sysctl.conf # 永久调整
┌──[root@liruilongs.github.io]-[/]
└─$ cat /etc/sysctl.conf | grep kernel
kernel.pid_max = 150000
┌──[root@liruilongs.github.io]-[/]
└─$ sysctl -p
net.ipv4.ip_forward = 1
vm.swappiness = 20
kernel.pid_max = 150000
┌──[root@liruilongs.github.io]-[/]
└─$

这篇关于SSH远程连接命令执行没反应不报错问题解决(-bash: fork: retry: Resource temporarily unavailable.[资源暂时不可用])的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/304443

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo