Vejo pids acima de 400.000 por que isso? Isso indica que algo está errado?


13

Hoje, apenas notei que meus IDs de processo são muito altos, entre os 400.000 (ou seja, 449624). Quando eu corro ps -ef | more, é quando eu percebo. Isso é normal ou isso indica um problema? Caso contrário, os scripts estão funcionando bem.

Estou usando o Redhat 7.3 x64 bit.

Outra coisa que notei é que também temos o Redhat 7.2 e os pids não são tão altos, apenas no sistema operacional mais recente. Por que isso seria? Isso significa que é relacionado ao sistema operacional e normal?

Eu não tenho isso kernel_pid_maxna minha sysctl.conf. Eu corri gato /proc/sys/kernel/pid_maxe vejo 458752.


Você não tem kernel_pid_maxno seu sysctl.confporque deveria ser kernel.pid_max.
JRFerguson

Grandes IDs de processo significam que você iniciou muitos processos desde que a máquina foi inicializada. Cada vez que um processo é iniciado, o kernel atribui o próximo ID de processo disponível maior que o usado mais recentemente, rolando quando você atinge o máximo.
chepner

Respostas:


19

Na inicialização, o kernel ajusta o padrão, pid_maxdependendo do número de CPUs disponíveis. Quando o número é baixo, o 32768 usual é selecionado. Caso contrário, o cálculo é feito da seguinte maneira (mostrando aqui um kernel 3.10 para ser semelhante ao RHEL, mas, além de algumas variações, é o mesmo para qualquer kernel Linux recente):

include/linux/threads.h:

/ *
 * Isso controla o pid máximo padrão alocado para um processo
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 é o valor usual usado em sistemas com menos de 32 threads de CPU disponíveis.

e depois:

#define PIDS_PER_CPU_DEFAULT 1024

Esses valores são usados ​​em kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

e depois :

    / * bump padrão e mínimo pid_max com base no número de cpus * /
    pid_max = min (pid_max_max, max_t (int, pid_max,
                PIDS_PER_CPU_DEFAULT * num_possible_cpus ()));
    pid_max_min = max_t (int, pid_max_min,
                PIDS_PER_CPU_MIN * num_possible_cpus ());
    pr_info ("pid_max: padrão:% u mínimo:% u \ n", pid_max, pid_max_min);

Portanto, no OP, isso significa um total de 458752/1024 = 448 threads simultâneos disponíveis: bastante. O outro sistema provavelmente não possui tantas CPUs / núcleos / threads, etc., portanto, possui um padrão mais baixo pid_max.


1
exemplo: O SuperServer 7089P-TR4T possui 224 núcleos, portanto 448 threads.
AB

16

A partir da procdocumentação :

Em plataformas de 32 bits, 32768 é o valor máximo para pid_max. Em sistemas de 64 bits, pid_max pode ser definido com qualquer valor de até 2 ^ 22 (PID_MAX_LIMIT, aproximadamente 4 milhões).

Você pode ver o com cat /proc/sys/kernel/pid_max. Você também pode consultar isso com sysctl.

sudo sysctl -a | grep kernel.pid_max

Ou:

sysctl -n kernel.pid_max

Modifique /etc/sysctl.confpara alterar o valor permanentemente e recarregar com sysctl -p.


7

Um ID do processo pode ser qualquer valor representado pelo pid_ttipo, que é específico ao seu sistema operacional. Na prática, geralmente é um número inteiro assinado de 32 bits, o que significa que o ID máximo do processo seria 2147483647 ou aproximadamente 5000 vezes maior que os IDs do processo que você está observando.

A documentação do GNU diz:

Tipo de Dados: pid_t

O pid_ttipo de dados é um tipo inteiro assinado que é capaz de representar um ID do processo. Na biblioteca GNU C, este é um int.

Na prática, o kernel normalmente aplicará um limite superior que é menor que isso. Em um sistema Linux, isso é controlado por /proc/sys/kernel/pid_max, o padrão é 32768. Se o seu sistema é Linux, você pode verificar esse arquivo para ver qual é o limite atual.

O limite pode ser diferente em diferentes sistemas operacionais; por exemplo, parece que no macOS PID_MAXestá codificado como 99999 .


3
O Linux tem APIs fundamentais porque os pids não podem preencher um espaço de 31 bits; os 2 bits principais (além do bit de sinal) são reservados para fins especiais nas interfaces robustas de futex e PI futex. Isso deixa apenas 29 bits, para um espaço pid de 512M.
R .. GitHub Pare de ajudar o gelo

1
@R .: Claro, isso é verdade para o Linux. Mas quando escrevi esta resposta, a pergunta não especificou o Linux e, portanto, dei uma resposta para qualquer Unix. Até onde eu sei, não há nada no padrão POSIX que exija um tamanho específico para pids; parece desnecessário agora, mas eu poderia imaginar um sistema futuro pid_tcom tamanho de 64 bits.
Daniel Pryden 13/02/19

Na verdade, isso é tudo verdade.
R .. GitHub Pare de ajudar o gelo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.