写点什么

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

作者:山河已无恙
  • 2022 年 2 月 14 日
  • 本文字数:2800 字

    阅读完需:约 9 分钟

写在前面


我遇到了什么问题:

  • 很老的一个系统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  -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 15665max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 15665virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited  # 无限大┌──[root@liruilongs.github.io]-[~]└─$
复制代码

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

语法:

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


┌──[root@liruilongs.github.io]-[~]└─$ ulimit  -u15665
复制代码
默认值


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

临时修改

┌──[root@liruilongs.github.io]-[~]└─$ ulimit  -u 75535┌──[root@liruilongs.github.io]-[~]└─$ ulimit  -u75535┌──[root@liruilongs.github.io]-[~]└─$
复制代码

永久修改

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

* soft nproc 65535      
* hard nproc 65535    
复制代码



┌──[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 = 131072sysctl: 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_maxkernel.pid_max = 131072
复制代码

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

┌──[root@liruilongs.github.io]-[~]└─$ cd /proc/sys/kernel/;cat pid_max131072
复制代码

调整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 kernelkernel.pid_max = 150000┌──[root@liruilongs.github.io]-[/]└─$ sysctl -pnet.ipv4.ip_forward = 1vm.swappiness = 20kernel.pid_max = 150000┌──[root@liruilongs.github.io]-[/]└─$
复制代码


发布于: 2022 年 02 月 14 日阅读数: 2
用户头像

CSDN博客专家,华为云云享专家,RHCE/CKA认证 2022.01.04 加入

Java 后端一枚,技术不高,前端、Shell、Python 也可以写一点.纯种屌丝,不热爱生活,热爱学习,热爱工作,喜欢一直忙,不闲着。喜欢篆刻,喜欢吃好吃的,喜欢吃饱了晒太阳。

评论

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