282 votes

Nombre maximum de threads par processus sous Linux ?

Quel est le nombre maximum de threads qui peuvent être créés par un processus sous Linux ?

Comment (si possible) cette valeur peut-elle être modifiée ?

282voto

Robert Gamble Points 41984

Linux n'a pas de limite séparée pour les threads par processus, juste une limite sur le nombre total de processus sur le système (les threads sont essentiellement des processus avec un espace d'adresse partagé sous Linux) que vous pouvez visualiser comme ceci :

cat /proc/sys/kernel/threads-max

La valeur par défaut est le nombre de pages de mémoire/4. Vous pouvez l'augmenter comme :

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

Il existe également une limite au nombre de processus (et donc de threads) qu'un seul utilisateur peut créer, cf. ulimit/getrlimit pour les détails concernant ces limites.

71voto

dragosrsupercool Points 1541

Il est FAUX de dire que LINUX n'a pas une limite de threads séparés par processus.

Linux implémente indirectement le nombre maximum de threads par processus ! !!

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

Ainsi, le nombre de threads par processus peut être augmenté en augmentant la mémoire virtuelle totale ou en diminuant la taille de la pile. Mais, si l'on diminue trop la taille de la pile, le code risque d'échouer en raison d'un débordement de la pile, alors que la mémoire virtuelle maximale est égale à la mémoire d'échange.

Vérifiez votre machine :

Mémoire virtuelle totale : ulimit -v (la valeur par défaut est illimitée, vous devez donc augmenter la mémoire d'échange pour l'augmenter)

Taille totale de la pile : ulimit -s (par défaut, 8Mb)

pour augmenter ces valeurs :

ulimit -s newvalue

ulimit -v newvalue

*Remplacez la nouvelle valeur par la valeur que vous voulez mettre comme limite.

Références :

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

45voto

jalf Points 142628

En termes pratiques, la limite est généralement déterminée par l'espace de la pile. Si chaque thread dispose d'une pile de 1MB (je ne me souviens pas si c'est la valeur par défaut sous Linux), alors un système 32 bits sera à court d'espace d'adressage après 3000 threads (en supposant que le dernier gb soit réservé au noyau).

Cependant, les performances seront très probablement mauvaises si vous utilisez plus de quelques dizaines de threads. Tôt ou tard, vous aurez trop de frais de changement de contexte, trop de frais dans l'ordonnanceur, etc. (La création d'un grand nombre de threads ne fait que consommer beaucoup de mémoire. Mais un grand nombre de threads avec des travail à faire va vous ralentir car ils se battent pour le temps CPU disponible)

Que faites-vous pour que cette limite soit pertinente ?

15voto

c4f4t0r Points 270

@dragosrsupercool

Linux n'utilise pas la mémoire virtuelle pour calculer le nombre maximum de threads, mais la mémoire physique installée sur le système.

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

http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/ kernel/fork.c * Le nombre maximum de threads par défaut est fixé à une valeur sûre. * valeur sûre : les structures des threads peuvent occuper au maximum la moitié * moitié de la mémoire. */ max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE) ;

donc le thread max est différent entre chaque système, parce que la ram installée peut être de différentes tailles, je sais que linux n'a pas besoin d'augmenter la mémoire virtuelle, parce que sur 32 bit nous avons 3GB pour l'espace utilisateur et 1 GB pour le kernel, sur 64 bit nous avons 128 TB de mémoire virtuelle, cela arrive sur solaris, si vous voulez augmenter la mémoire virtuelle vous devez ajouter de l'espace swap

14voto

Pour le récupérer :

cat /proc/sys/kernel/threads-max

Pour le régler :

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

123456789 = nombre de fils

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X