
Estou tentando entender os processos do Linux. Estou confuso sobre os respectivos termos pid_max
e .ulimit -u
thread_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_max
nã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-max
seja 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 -u
sinalizador é 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 -u
indica 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_max
parâ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-max
parâ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 -u
que 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-max
tamanho.
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.