pid max导致fork: Cannot allocate memory 的分析及解决办法

from:http://blog.csdn.net/onlyellow/article/details/51917757


事情起因是有台生产环境的服务器down了,ssh连接不上去。就在大家准备去机房检查该机器的时候,突然又可以ssh登录了。但是只有一个同事成功登录,其他人依然无法连接。在成功登录的同事终端上执行任何命令,都会报如下错误:

  1. # free  
  2. -bash: fork: Cannot allocate memory  
# free
-bash: fork: Cannot allocate memory




这就很尴尬了:啥都没法调查。
后来多试验几次,偶尔能执行成功:
  1. # free  
  2. total        used        free      shared  buff/cache   available  
  3. Mem:        7814784      340028     6688016        9488      786740     7244604  
  4. Swap:       2097148           0     2097148  
# free
total        used        free      shared  buff/cache   available
Mem:        7814784      340028     6688016        9488      786740     7244604
Swap:       2097148           0     2097148








可以看出memory还有很多,不可能是内存耗尽问题。
当时想不通是啥情况。 今天查询资料无意中发现:当环境中有过多process,超过pid max可能会导致这个报错。
于是试验了下:


1.  查询pid_max值并修改(原来值挺大,为了测试改小点)
  1. # sysctl kernel.pid_max  
  2. kernel.pid_max = 32768  
  3. # sysctl -w kernel.pid_max=500  
  4. kernel.pid_max = 500  
# sysctl kernel.pid_max
kernel.pid_max = 32768
# sysctl -w kernel.pid_max=500
kernel.pid_max = 500




2. 测试
# cat test.c 
  1. #include <unistd.h>    
  2. #include <stdio.h>     
  3. int main ()     
  4. {     
  5.     pid_t fpid; //fpid表示fork函数返回的值    
  6.     int count=0;  
  7.     while(1) {   
  8.         fpid=fork();     
  9.         if (fpid < 0) {     
  10.             printf("error in fork!\n");  
  11.             break;  
  12.         }  
  13.         else if (fpid == 0) {  
  14.             count++;  
  15.         } else {  
  16.         sleep(100);  
  17.         return 0;  
  18.         }  
  19.     }  
  20.     printf("count is %d\n", count);  
  21.     return 0;  
  22. }  
#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;
}




编译后运行
  1. # gcc test.c; ./a.out   
  2. error in fork!  
  3. count is 172  
# gcc test.c; ./a.out 
error in fork!
count is 172




3. 此时再用其他终端试图ssh该测试环境,发现无法登录。


4. 在其他已经连接该测试环境的终端(运行a.out之前就连接好)试图执行free或者其他命令,结果报错-bash: fork: Cannot allocate memory


至此可以初步得出结论:确实pid max用尽会导致fork问题。
解决办法就是修改pid max
上文提到的sysctl -w 修改只是临时修改,重启后会丢失。

永久修改方法:

  1. # echo "kernel.pid_max=99999" >> /etc/sysctl.conf  
# echo "kernel.pid_max=99999" >> /etc/sysctl.conf
  1. # sysctl -p  
# sysctl -p

P.S.

64位系统上pid_max最大值为2^22,32位系统上最大值为32768


版权声明:欢迎转载,技术分享,共同进步
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值