Linux調整pid max參數

故障現象

服務器沒法SSH,VNC操做命令提示:sshd[4545]: error: fork: cannot allocate memorypython

故障緣由

當前環境有過多的進程,超過用戶進程最大限制數後,可能會致使這個報錯。 此時系統上內存資源可能還很充足。bash

故障排查和處理

(1)首先,使用pstree命令,查詢用戶進程及子進程服務器

sudo pstree -p | wc -l

也能夠使用ps命令直接查看進程數:ssh

sudo ps -eLf |wc -l

(2)查看root和普通帳戶進程數限制ide

# 普通帳戶下
$ 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;.net

(2)一個測試進程數代碼:code

# 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

參考文檔

相關文章
相關標籤/搜索