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?

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.


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/


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?


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

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.


11

Para recuperá-lo:

cat /proc/sys/kernel/threads-max

Para configurá-lo:

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

123456789 = # de threads


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?


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.


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 ...


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.


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


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


1

Para definir permanentemente,

vim /etc/sysctl.conf

e adicione

kernel.threads-max = "value"

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


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.


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.

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.