O que é um limite para o número de encadeamentos?

2

Eu queria saber quantos processos eu posso criar na minha máquina (x64 com 8GB de memória RAM e rodando o Ubuntu). Por isso, criei um processo mestre simples que criava continuamente processos filhos e que os processos filhos estavam apenas dormindo o tempo todo. Acabei com apenas 11-12k processos. Então mudei processos para threads e obtive exatamente o mesmo resultado. Meu pid_max está definido como 32768, todos os limites por usuário estão desabilitados. O uso de memória física é apenas alguns bytes. Você poderia me dizer o que impede o sistema de criar novos threads nesse ponto?

p.s. aqui está o meu código-fonte para o teste de multiprocessamento escrito em C

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int count = 0;
    while (1) {
        pid = fork();
        if (pid == -1) {
            printf("total: %d\n", count);
            return 0;
        }
        if (pid == 0) {
            while (1) sleep(10);
        }
        count++;
    }
}
    
por Andriy Maletsky 07.02.2017 / 23:07

1 resposta

3

Acho que você atingiu um número de limites de processos ou um limite de memória.

Quando eu tento seu programa no meu computador e alcanço o estado pid == -1 , fork() retorna o erro EAGAIN , com a mensagem de erro: Resource temporarily unavailable . Como usuário normal , posso criar aproximadamente 15k processos.

Existem vários motivos pelos quais isso pode acontecer EAGAIN , detalhado em man 2 fork :

  • memória insuficiente,
  • atingindo um limite como RLIMIT_NPROC,
  • especificações específicas do agendador de prazos.

No meu caso, acho que eu só toquei no RLIMIT_NPROC limit, também conhecido como ulimit -u normalmente. O melhor é exibir este limite dentro do programa, assim você tem o valor real, não os limites da sua concha.

#include <sys/time.h>
#include <sys/resource.h>

int main() {
    struct rlimit rlim;
    getrlimit(RLIMIT_NPROC, &rlim);
    printf("RLIMIT_NPROC soft: %d, hard: %d\n", rlim.rlim_cur, rlim.rlim_max);

Quais rendimentos:

RLIMIT_NPROC soft: 15608, hard: 15608
total: 15242

O que parece razoável, já que tenho outros processos em execução, incluindo um navegador da web.

Agora, como root , os limites realmente não se aplicam mais e eu poderia fork() muito mais: eu criei mais de 30k processos, perto dos meus 32k pid_max .

Agora, se eu pegar o PID do meu usuário normal ( echo $$ ) e como root em outro shell, eu faço: prlimit --pid $SHELLPID --nproc=30000 e então lançar o seu programa neste shell, eu posso criar quase 30k processos:

RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678

Finalmente: você também deve considerar o uso da memória, porque no meu sistema, eu usei muito de RAM e troquei para criar todos esses processos, e talvez tenha sido o limite você bateu. Verifique com free .

    
por 08.02.2017 / 01:14