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 ?
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 ?
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.
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/
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 ?
@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
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.