12
votes

Changer la limite du nombre maximum de Pthreads par une application

est-il possible d'un moyen de modifier la limite sur le nombre de pthreads qu'un processus peut créer? Actuellement sur mon système Linux, je peux créer environ 380 threads, mais je veux augmenter cela pour dire tant que la mémoire est disponible.


6 commentaires

Intéressant ... Avez-vous envisagé certaines des implications d'une telle conception du système? Un seul point d'échec (SPOF) vient à l'esprit.


Je ne suis pas expert, mais je parierais qu'avoir beaucoup plus de 380 threads submergera votre processeur avec des commutateurs de contexte. La commutation de contexte pour un thread est inférieure à celle d'un processus séparé, mais vous devez toujours enregistrer le compteur de programme et enregistrer le fichier et peut-être d'autres choses que j'oublie. Combien de threads pensez-vous avoir besoin? Je suggérerais de profiler votre application pour déterminer le surcharge de fil pour 10 threads par rapport à 100 threads, puis essayez d'extrapoler sur votre nombre de threads cible. Vous constaterez peut-être que cela finit par ne pas valoir l'effort. Ou peut-être que je suis juste tort ...


Je ne l'utiliserai pas pratiquement n'importe où ... mais j'en ai besoin de quelques expériences?


Pages SETRLIMIT () Man ( Linux.die.net/man/2/Strlimit ) Dites: "RLIMIT_NPROC: Nombre maximal de threads pouvant être créés pour le vrai ID utilisateur du processus d'appel." Sur appelant getrlimit (rlimit_nproc, & rlim); i Obtenir les limites de ressources suivantes: actuel = 4294967295 max = 4294967295


Rlimit_nproc donne le nombre maximum de threads par utilisateur.


Avez-vous réussi à résoudre ce problème?


4 Réponses :


1
votes

Regardez sur ceci:

Nombre maximum de threads par processus de Linux?

et jetez un coup d'œil à cela car cela pourrait se rapporter à votre question:

Servir un client avec chaque fil serveur


5 commentaires

CAT / PROC / SYS / KERNEL / FILS-MAX Affiche 16384 . Mais je ne peux pas créer plus de 380 pthreads. J'ai même essayé de mettre une fonction vierge comme un corps des fils.


Après 380 threads, je reçois eagain comme valeur de retour de pthread_create () , qui selon pthread_create () la page de manuel est "Le système manquait nécessaire Ressources pour créer un autre fil ou la limite imposée par le système sur le nombre total de threads dans un processus {pthread_threads_max} serait dépassé. "


Testez-vous une application 32 bits? Si oui, avez-vous vérifié que lorsque vous créez un fil de 381, vous avez assez d'espace pour la pile du nouveau fil?


Ou il pourrait y avoir une limite sur la taille de la mémoire virtuelle pour un processus. Vous pouvez voir les limites en cours d'exécution ulimit -a


La limite de taille de la mémoire virtuelle est Unlimited



2
votes

Votre problème est que vous n'avez pas appelé pthread_detach sur les threads en question. Cela indique à Pthread que les ressources associées à chaque thread seront libérées lorsque le thread se termine. Vous devez appeler soit pthread_join ou pthread_release sur tous les threads pour libérer les ressources de thread. Cela signifie que vous devez également appeler pthread_detach dans vos gestionnaires ou fuites d'annulation de pthread_join.


0 commentaires

6
votes

Réduire la taille de la pile de l'utilisateur ' ulimit -s 1024 code>';

default: 8MB 
reduced: 1MB 


0 commentaires

3
votes
cat /proc/sys/kernel/threads-max
may work in Linux but not other UNIX systems. I thought the right way is Maximum number of threads per process - sysconf(_SC_THREAD_THREADS_MAX) failingwhich works on some UNIX systems (like HPUX) but not on Solaris or Linux...

0 commentaires