Compreendendo as diferenças entre pid_max, ulimit -u e thread_max

Compreendendo as diferenças entre pid_max, ulimit -u e thread_max

Estou tentando entender os processos do Linux. Estou confuso sobre os respectivos termos pid_maxe .ulimit -uthread_max

Qual é exatamente a diferença entre esses termos? Alguém pode esclarecer as diferenças?

Responder1

Desculpe, a resposta aceita é uma informação ruim em várias frentes.

/proc/sys/kernel/pid_maxnão tem nada a ver com o número máximo de processos que podem ser executados a qualquer momento. É, na verdade, o IDENTIFICADOR numérico máximo de PROCESSO que pode ser atribuído pelo kernel.

No kernel Linux, um processo e um thread são a mesma coisa. Eles são tratados da mesma maneira pelo kernel. Ambos ocupam um slot na estrutura de dados task_struct. Um thread, pela terminologia comum, é no Linux um processo que compartilha recursos com outro processo (eles também compartilharão um ID de grupo de threads). Um thread no kernel do Linux é em grande parte uma construção conceitual no que diz respeito ao escalonador.

Agora que você entende que o kernel em grande parte não diferencia entre um thread e um processo, deve fazer mais sentido que /proc/sys/kernel/threads-maxseja na verdade o número máximo de elementos contidos na estrutura de dados task_struct. Qual é a estrutura de dados que contém a lista de processos, ou como podem ser chamados, tarefas.

ulimit é, como o nome indica, um limite por usuário. O -usinalizador é definido como “O número máximo de processos disponíveis para um único usuário”. Um elemento de task_struct contém o uid do usuário que criou a tarefa. Uma contagem por uid é mantida e incrementada/decrementada toda vez que uma tarefa é adicionada/removida de task_struct. Portanto, ulimit -uindica o número máximo de elementos (processos) que um determinado usuário pode ter em task_struct a qualquer momento.

Espero que isso esclareça as coisas.

Responder2

Vamos entender a diferença entre um processo e um thread. Conformeesselink,

A diferença típica é que threads (do mesmo processo) são executados em um espaço de memória compartilhada, enquanto os processos são executados em espaços de memória separados.

Agora, temos o pid_maxparâmetro que pode ser determinado conforme abaixo.

cat /proc/sys/kernel/pid_max

Então o comando acima retorna32.768o que significa que posso executar32.768processos simultaneamente em meu sistema que podem ser executados em espaços de memória separados.

Agora, temos o threads-maxparâmetro que pode ser determinado conforme abaixo.

cat /proc/sys/kernel/threads-max

O comando acima me retorna a saída como126406o que significa que posso ter126406threads em um espaço de memória compartilhada.

Agora, vamos pegar o terceiro parâmetro ulimit -uque indica o total de processos que um usuário pode ter em um determinado momento. O comando acima me retorna a saída como63203. Isso significa que para todos os processos que um usuário criou em um determinado momento, o usuário pode ter63203processos em execução.

Caso hipotético

Portanto, supondo que haja 2 processos sendo executados simultaneamente por 2 usuários e cada processo esteja consumindo muito memória, ambos os processos usarão efetivamente o63203limite de usuários nos processos. Então, se for esse o caso, os 2 usuários terão efetivamente esgotado todo o126406 threads-maxtamanho.

Agora, preciso determinar quantos processos um usuário pode executar a qualquer momento. Isso pode ser determinado a partir do arquivo /etc/security/limits.conf. Portanto, existem basicamente 2 configurações neste arquivo, conforme explicado acimaaqui.

Alimite suaveé como umavisoelimite rígidoé umlimite máximo real. Por exemplo, seguir evitará que qualquer pessoa do grupo de alunos tenha mais de 50 processos, e um aviso será dado em 30 processos.

@student        hard    nproc           50
@student        soft    nproc           30

Os limites rígidos são mantidos pelo kernel enquanto os limites flexíveis são aplicados pelo shell.

informação relacionada