服务器无法SSH,VNC操作命令提示:sshd[4545]: error: fork: cannot allocate memory
故障原因
当前环境有过多的进程,超过用户进程最大限制数后,可能会导致这个报错。 此时系统上内存资源可能还很充足。
故障排查和处理
(1)首先,使用pstree
命令,查询用户进程及子进程
sudo pstree -p | wc -l
也可以使用ps
命令直接查看进程数:
sudo ps -eLf |wc -l
(2)查看root和普通账户进程数限制
# 普通账户下
$ ulimit -a
...
max user processes (-u) 1024
...
# root账户下
# ulimit -a
...
max user processes (-u) 6553
...
我们可以看出普通用户最大进程数为1024,root用户的最大进程数为6553。
(3)更改pid max参数值
# 临时更改
sysctl -w kernel.pid_max=65535 或 echo 65535 > /proc/sys/kernel/pid_max
# 永久更改
echo "kernel.pid_max=65535" >> /etc/sysctl.conf
sysctl -p
(4)查看当前系统进程数
cat /proc/sys/kernel/pid_max
ulimit -a
sysctl kernel.pid_max
扩展
(1)64位系统上pid_max最大值为2^22,32位系统上最大值为32768;
(2)一个测试进程数代码:
# cat test.c
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
while(1) {
fpid=fork();
if (fpid < 0) {
printf("error in fork!\n");
break;
}
else if (fpid == 0) {
count++;
} else {
sleep(100);
return 0;
}
}
printf("count is %d\n", count);
return 0;
}
# 编译后运行
# gcc test.c; ./a.out
error in fork!
count is 172