Linux调整pid max参数

故障现象

服务器无法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

参考文档

Linux调整pid max参数

上一篇:简单的php Mysql类(查询 删除 更新)


下一篇:配置rsyslog服务器收集Cisco交换机日志信息操作指引