Número máximo de threads por processo no Linux?

245

Qual é o número máximo de threads que podem ser criados por um processo no Linux?

Como (se possível) esse valor pode ser modificado?


fonte

Respostas:

247

O Linux não possui um limite de threads separados por processo, apenas um limite para o número total de processos no sistema (os threads são essencialmente apenas processos com um espaço de endereço compartilhado no Linux) que você pode visualizar assim:

cat /proc/sys/kernel/threads-max

O padrão é o número de páginas de memória / 4. Você pode aumentar isso como:

echo 100000 > /proc/sys/kernel/threads-max

Há também um limite no número de processos (e, portanto, threads) que um único usuário pode criar, veja ulimit/getrlimitdetalhes sobre esses limites.

Robert Gamble
fonte
3
O limite em / proc / sys / vm / max_map_count também pode limitar o número de threads. Deve ser seguro aumentar muito esse limite se você o atingir.
Mikko Rantalainen
1
Robert: O Linux implementa indiretamente por limite de processo. Verifique a minha resposta para obter detalhes;)
codersofthedark
Estou tentando mudar isso no meu ubuntu 12.04 e ele não muda com o seu comando. Também tentei alterar o vi, mas recebo E667: Fsync failedquando tento salvar no vi.
Siddharth
4
@dragosrsupercool o fio máxima são calculadas usando o total de RAM, não a memória virtual
c4f4t0r
1
A quantidade de tamanho da pilha por encadeamento (o padrão no seu sistema) é mais provável que seja o limite do que qualquer outra coisa. Reduzir o tamanho da pilha por thread é uma maneira de aumentar o número total de threads (embora isso raramente seja uma boa ideia).
Randy Howard
67

É ERRADO dizer que o LINUX não possui um thread separado por limite de processo.

O Linux implementa o número máximo de threads por processo indiretamente !!

number of threads = total virtual memory / (stack size*1024*1024)

Portanto, o número de threads por processo pode ser aumentado aumentando a memória virtual total ou diminuindo o tamanho da pilha. Porém, diminuir muito o tamanho da pilha pode levar à falha do código devido ao estouro da pilha, enquanto a memória virtual máxima é igual à memória de troca.

Verifique sua máquina:

Memória virtual total: ulimit -v(o padrão é ilimitado, portanto, você precisa aumentar a memória de troca para aumentar isso)

Tamanho total da pilha: ulimit -s(o padrão é 8Mb)

Comando para aumentar estes valores:

ulimit -s newvalue

ulimit -v newvalue

* Substitua o novo valor pelo valor que você deseja colocar como limite.

Referências:

http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/

codersofthedark
fonte
11
Exceto três pequenos detalhes: 1. O Linux não faz isso, a presença de pilhas e o fato de a memória e o espaço de endereço serem de tamanho finito não têm nada a ver com isso. 2. Você deve especificar a pilha de um thread ao criá-lo, independentemente de ulimit -s. É muito bem possível (não sensível, mas possível) criar tantos threads quanto possíveis IDs de threads. No Linux de 64 bits, é ainda mais "possível" criar mais threads do que os IDs de threads (é claro que não é possível, mas no que diz respeito à pilha). 3. Reserva de pilha, consolidação e VM são coisas diferentes, especialmente com OC.
Damon
Sim, para aumentar o número de threads, você precisa aumentar a memória virtual ou diminuir o tamanho da pilha. No Raspberry Pi, não encontrei uma maneira de aumentar a memória virtual, se diminuir o tamanho da pilha do padrão de 8 MB para 1 MB. É possível obter mais de 1000 threads por processo, mas diminuir o tamanho da pilha com o comando "ulimit -s" faça isso para todos os threads. Portanto, minha solução foi usar a instância “pthread_t” “thread class” porque o pthread_t me permitiu definir o tamanho da pilha para cada thread. Finalmente, estou disponível para arquivar mais de 1000 threads por processo no Raspberry Pi cada um com 1 MB de pilha
Deulis
43

Em termos práticos, o limite é geralmente determinado pelo espaço na pilha. Se cada thread obtiver uma pilha de 1 MB (não me lembro se esse é o padrão no Linux), um sistema de 32 bits ficará sem espaço de endereço após 3000 threads (assumindo que o último gb esteja reservado ao kernel) .

No entanto, você provavelmente terá um desempenho terrível se usar mais de algumas dezenas de threads. Cedo ou tarde, você recebe muita sobrecarga de alternância de contexto, muita sobrecarga no agendador e assim por diante. (Criar um grande número de threads faz pouco mais do que consumir muita memória. Mas muitos threads com trabalho real a fazer vão atrasá-lo enquanto eles lutam pelo tempo disponível da CPU)

O que você está fazendo quando esse limite é relevante?

jalf
fonte
3
1 MB por thread para a pilha é bastante alto, muitos programas não precisam de lugar próximo a esse espaço de pilha. O desempenho será baseado no número de processos executáveis , não no número de threads existentes. Eu tenho uma máquina funcionando agora com mais de 1200 threads com uma carga de 0,40.
Robert Gamble
13
o desempenho depende do que os threads estão fazendo. você pode subir muito mais do que algumas dúzias se eles não fizerem muito e, portanto, menos troca de contexto.
Corey Goldberg
pilha está crescendo dinamicamente, apenas a página inicial é alocada imediatamente
Michael Pankov
28

100k threads adequados no linux:

ulimit -s  256
ulimit -i  120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max 

 ./100k-pthread-create-app

Atualização de 2018 de @Thomas, nos sistemas systemd:

/etc/systemd/logind.conf: UserTasksMax=100000
Vladimir Kunschikov
fonte
4
Obrigado, finalmente me permitiu romper a contagem de threads Java de 32k.
precisa
1
Não funciona para mim: $ ulimit -s 100000 $ ulimit -i 63645 $ cat / proc / sys / kernel / threads-max 127626 $ cat / proc / sys / vm / max_map_count 600000 $ cat / proc / sys / kernel / pid_max 200000 $ java -Xmx4G -Xss256k -cp. ThreadCreation ... 11542 11543 java.lang.OutOfMemoryError: não é possível criar um novo thread nativo em java.lang.Thread.start0 (método nativo) em java.lang.Thread.start (Thread.java:717) em ThreadCreation.main ( ThreadCreation.java:15)
Martin Vysny
@MartinVysny ulimit -s = tamanho da rosca em kb. então você está tentando criar threads com tamanho de pilha de 100 MB.
Vladimir Kunschikov 3/11
adicionou sua sugestão sem verificar, @ Thomas, obrigado pelo feedback de qualquer maneira.
Vladimir Kunschikov 16/01/19
2
@VladimirKunschikov Obrigado amigo, sua solução realmente funcionou, e obrigado Thomas por adicionar essa linha adicional, posso confirmar que não funcionará com essa linha.
BillHoo
14

@dragosrsupercool

O Linux não usa a memória virtual para calcular o máximo de encadeamento, mas a ram física instalada no sistema

 max_threads = totalram_pages / (8 * 8192 / 4096);

http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/

kernel / fork.c

/* The default maximum number of threads is set to a safe
 * value: the thread structures can take up at most half
 * of memory.
 */
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

Portanto, o thread max é diferente entre todos os sistemas, porque o ram instalado pode ser de tamanhos diferentes, sei que o Linux não precisa aumentar a memória virtual, porque em 32 bits temos 3 GB para espaço do usuário e 1 GB para o kernel, em 64 bits, temos 128 TB de memória virtual, que acontecem no Solaris. Se você deseja aumentar a memória virtual, precisa adicionar espaço de troca.

c4f4t0r
fonte
11

Para recuperá-lo:

cat /proc/sys/kernel/threads-max

Para configurá-lo:

echo 123456789 > /proc/sys/kernel/threads-max

123456789 = # de threads

Vincent Van Den Berghe
fonte
Recebo permissão negada ao tentar escrever, mesmo com root.
21718 Kim
Bem, já faz quase uma década desde que isso foi publicado. Eu não sou-se atualizado sobre o estado atual das coisas, mas muitas podem ter mudado (e provavelmente tem) ...
Vincent Van Den Berghe
problema com perm-negar pode ser append ( >) parte perde o sudo: tryecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
dwanderson 19/01
10

Limite de contagem de threads:

$ cat /proc/sys/kernel/threads-max 

Como é calculado:

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

e: o tamanho da página x86_64 (PAGE_SIZE) é 4K; Como todas as outras arquiteturas, o x86_64 possui uma pilha de kernel para cada encadeamento ativo. Essas pilhas de encadeamento são THREAD_SIZE (2 * PAGE_SIZE) grandes;

para mempages:

cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';

na verdade, o número não está relacionado à limitação do tamanho da pilha de memória de threads (ulimit -s ).

PS: a limitação da pilha de memória de threads é 10M na minha VM rhel e, para a memória 1.5G, essa VM pode pagar apenas 150 threads?

Albert Kong
fonte
5

Para quem está vendo isso agora, em sistemas systemd (no meu caso, especificamente no Ubuntu 16.04), existe outro limite imposto pelo parâmetro cgroup pids.max.

Isso é definido como 12.288 por padrão e pode ser substituído em /etc/systemd/logind.conf

Outros conselhos ainda se aplicam, incluindo pids_max, threads-max, max_maps_count, ulimits etc.

Trent Lloyd
fonte
5

verifique o tamanho da pilha por thread com ulimit, no meu caso Redhat Linux 2.6:

    ulimit -a
...
    stack size              (kbytes, -s) 10240

Cada um de seus threads receberá essa quantidade de memória (10 MB) atribuída à sua pilha. Com um programa de 32 bits e um espaço de endereço máximo de 4 GB, isto é, no máximo, apenas 4096MB / 10MB = 409 threads !!! Menos código de programa, menos heap-space provavelmente levará a um máximo observado. de 300 fios.

Você deve conseguir aumentar isso compilando e executando em 64 bits ou configurando ulimit -s 8192 ou mesmo ulimit -s 4096. Mas se isso for recomendável, é outra discussão ...

Axel Podehl
fonte
4

Provavelmente não deveria importar. Você obterá um desempenho muito melhor projetando seu algoritmo para usar um número fixo de threads (por exemplo, 4 ou 8 se você tiver 4 ou 8 processadores). Você pode fazer isso com filas de trabalho, E / S assíncronas ou algo como libevent.

twk
fonte
3
O objetivo do multithreading não é apenas o desempenho. Por exemplo, você está ouvindo 10 portas com um sistema de bloqueio no processador de 4 núcleos. Neste exemplo, não há significado 4.
obayhan 20/04
3

Use nbio biblioteca de E / S sem bloqueio ou qualquer outra coisa, se precisar de mais threads para fazer chamadas de E / S que bloqueiam

wefeqfw
fonte
2

Depende do seu sistema, basta escrever um programa de amostra [criando processos em um loop] e verificar usando ps axo pid, ppid, rss, vsz, nlwp, cmd. Quando ele não pode mais criar threads, verifique nlwp count [nlwp é o número de threads] voila, você obteve sua resposta à prova de idiotas em vez de ler os livros

resultados
fonte
1

Para definir permanentemente,

vim /etc/sysctl.conf

e adicione

kernel.threads-max = "value"
Matteo Zocca
fonte
0

Podemos ver o número máximo de threads definidos no seguinte arquivo no linux

cat / proc / sys / kernel / threads-max

(OU)

sysctl -a | grep threads-max

KrishnaKumar Madagani
fonte
0

Você pode ver o valor atual com o seguinte comando: cat / proc / sys / kernel / threads-max

Você também pode definir o valor como

eco 100500> / proc / sys / kernel / threads-max

O valor que você definir seria verificado nas páginas de RAM disponíveis. Se as estruturas de encadeamentos ocuparem mais de 1/8) das páginas de RAM disponíveis, o encadeamento máximo será reduzido de acordo.

Arif
fonte
0

Sim, para aumentar o número de threads, você precisa aumentar a memória virtual ou diminuir o tamanho da pilha. No Raspberry Pi, não encontrei uma maneira de aumentar a memória virtual, se diminuir o tamanho da pilha do padrão de 8 MB para 1 MB. É possível obter mais de 1000 threads por processo, mas diminuir o tamanho da pilha com o comando "ulimit -s" faça isso para todos os threads. Portanto, minha solução foi usar a instância “pthread_t” “thread class” porque o pthread_t me permitiu definir o tamanho da pilha para cada thread. Por fim, estou disponível para arquivar mais de 1000 threads por processo no Raspberry Pi, cada um com 1 MB de pilha.

Deulis
fonte