SSH远程连接命令执行没反应不报错问题解决(-bash:fork:retry:Resource temporarily unavailable.[资源暂时不可用])
人生当苦无妨,良人当归即好.——烽火戏诸侯《雪中悍刀行》
写在前面
我遇到了什么问题:
- 很老的一个系统
bug原因升级,大概五六年没有重启机器了,4A平台上面通过ssh远程连接Linux机器,偶尔连接不上 - 即使连接之后命令无法正常执行,执行了没有反应。
- 即使可以执行,执行命名报
-bash: fork: retry: Resource temporarily unavailable.(资源暂时不可用)
出现问题的原因是什么:
Linux进程数超过了设置的最大进程数。会对系统进行资源限制,所以分配给ssh进程的资源时有时无,一些命令的bash进程会被杀调,以保证系统进程不超过设置的最大进程数,无法正常执行。即下面的第一个输出要远远小与第二个和第三个输出。如果有些接近就会出现这种问题
1 | ┌──[root@liruilongs.github.io]-[/] |
我是怎样解决的
修改内核参数,调整最大进程数限制。这里修改的话需要root权限,同时需要修改两个地方。
其一:用户登录会加载pam_limit模块,pam_limit模块读取配置文件 /etc/security/limits.conf来限制用户资源的占用。可以使用ulimit的命令来查看和临时设置资源信息,也可以通过 写入/etc/security/limits.conf 来永久配置,配置文件在每次登录时会加载。可以用来设置ssh连接数,最大进程数等。
其二:Linux系统中内核kernel模块,有个全局的设置最大进程数的内核参数,需要修改这个参数,内核参数的设置方式有临时设置和永久设置两种方式,临时设置完就会刷新,重启失效。可以先临时设置后查看效果,然后永久设置。
人生当苦无妨,良人当归即好.——烽火戏诸侯《雪中悍刀行》
查看当前用户的活跃进程数
1 | ┌──[root@liruilongs.github.io]-[/] |
查看用户允许运行的最大进程数
1 | ┌──[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。 |
1 | ┌──[root@liruilongs.github.io]-[~] |
默认值
| 用户 | 描述 |
|---|---|
root 账号 |
ulimit -u 的值 默认是/proc/sys/kernel/threads-max 的值 /2,即系统线程数的一半 |
普通账号 |
ulimit -u 的值 默认是 /etc/security/limits.d/20-nproc.conf |
修改用户允许运行的最大进程数
临时修改
1 | ┌──[root@liruilongs.github.io]-[~] |
永久修改
在/etc/security/limits.conf 文件里添加如下内容
1 | * soft nproc 65535 |
| 关键字 | 描述 |
|---|---|
nproc |
是操作系统级别对每个用户创建的进程数的限制 |
nofile |
是每个进程可以打开的文件数的限制 |
soft xxx |
代表警告的设定,可以超过这个设定值,但是超过后会有警告。 |
hard xxx |
代表严格的设定,不允许超过这个设定的值。 |
1 | ┌──[root@liruilongs.github.io]-[~] |
从新通过ssh的方式登录,就会刷新 ulimit -u的值
查看Linux内核模块kernel允许的最大进程数
查看kernel.pid_max的内核参数
1 | ┌──[root@liruilongs.github.io]-[~] |
根据变量找到对应的内核参数文件位置
1 | ┌──[root@liruilongs.github.io]-[~] |
调整kernel.pid_max内核参数
临时调整内核参数
1 | ┌──[root@liruilongs.github.io]-[/proc/sys/kernel] |
永久调整kernel.pid_max内核参数
1 | ┌──[root@liruilongs.github.io]-[/] |
SSH远程连接命令执行没反应不报错问题解决(-bash:fork:retry:Resource temporarily unavailable.[资源暂时不可用])
https://liruilongs.github.io/2021/12/10/Ops_demo/SSH远程连接命令执行没反应不报错问题解决/
1.Linux网络调优之内核网络栈发包收包认知
2.Linux 性能调优之 OOM Killer 的认知与观测
3.为什么进程的物理内存占用(RSS)不停增长? 利用 BPF 跟踪、统计 Linux 缺页异常
4.如何使用 BPF 监控 Linux 用户态小内存分配:Linux 内存调优之 BPF 分析用户态小内存分配
5.Linux 内存调优之 BPF 分析用户态 mmap 大内存分配
6.如何使用 BPF 分析 Linux 内存泄漏,Linux 性能调优之 BPF 分析内核态、用户态内存泄漏
7.认识 Linux 内存构成:Linux 内存调优之页表、TLB、缺页异常、大页认知
8.Linux 内存调优之如何限制进程、系统级别内存资源

