“-bash: fork: 无法分配内存”,发现连了好多终端,然后断开了一个终端,然后这边终端可以敲命令了:
还有那么多内存。很无语,然后又开始敲命令,结果又报刚才那个问题“-bash: fork: 无法分配内存”,另外一个终端连接也出问题了:
[root@172.16.31.102 ~]# ssh 172.16.31.105
shell request failed on channel 0
网上说老版本系统的内核pid参数比较小(默认设置的是32768),验证了一下,然后我又断开一个终端,这边ps了一下:
[root@172.16.31.105 ~]# ps
PID TTY TIME CMD
32775 pts/1 00:00:00 bash
32765 pts/1 00:00:00 ps
很明显ps的pid号明显接近于内核默认pid了,立即修改内核pid,并让其生效命令如下:
echo "kernel.pid_max=64000" >>/etc/sysctl.conf
sysctl -p
生效后,终端立刻就可以直连这台机器了。
再次验证
找了另外一台机器,先多连几个终端,之后将内核pid改小最好近似于当前pid最大值,改完生效后马上问题就出来了 报 “-bash: fork: 无法分配内存” 接着内核参数。
注意:有的机器pid用的比较严重,敲好多次命令都会报“-bash: fork: 无法分配内存” 因此只能重启服务器,运气好的话多敲几次命令就可以看到。
还有种情况是系统当前的的进程数 太多太多,报-bash: fork: 无法分配内存
后来发现是因为非root用户打开的进程数太多,解决方法:
普通用户的nproc必须配置这个文件才能生效
vi /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 111111
root soft nproc unlimited
[root@db-172-16-3-150 ~]# ulimit -u
131073
[root@db-172-16-3-150 ~]# su - postgres
postgres@db-172-16-3-150-> ulimit -u
111111
普通用户用了/etc/security/limits.d/90-nproc.conf 软限制的配置, 而root用户用了/etc/security/limits.conf硬限制的配置.
如果是root打开进程数太多修改
vim /etc/security/limits.conf
添加:
* soft nproc 32000
* hard nproc 32000
有关limits.conf参数的注释
- core - 限制核心文件大小(KB)
- data - 最大数据大小(KB)
- fsize - maximum filesize(KB)
- memlock - 最大锁定内存地址空间(KB)
- nofile - 最多打开的文件
- rss - max resident set size(KB)
- stack - 最大堆栈大小(KB)
- cpu - 最大CPU时间(MIN)
- nproc - 最大进程数
- as - 地址空间限制(KB)
- maxlogins - 此用户的最大登录号
- maxsyslogins - 系统上登录的最大数量
- priority - 运行用户进程的优先级
- locks - 用户可以容纳的文件锁的最大数量
- sigpending - 待处理信号的最大数量
- msgqueue - POSIX消息队列使用的最大内存(字节)
- nice - 最大优先级允许提高到值:[-20,19]
- rtprio - 最大实时优先级
注:可能导致这种错误的有很多很多,后面若有发现继续更新。