Linux hat kein separates Limit für Threads pro Prozess, sondern nur ein Limit für die Gesamtzahl der Prozesse auf dem System (Threads sind im Wesentlichen nur Prozesse mit einem gemeinsam genutzten Adressraum unter Linux), die Sie folgendermaßen anzeigen können:
cat /proc/sys/kernel/threads-max
Voreingestellt ist die Anzahl der Speicherseiten/4. Sie können dies wie folgt erhöhen:
echo 100000 > /proc/sys/kernel/threads-max
Es gibt auch eine Begrenzung für die Anzahl der Prozesse (und damit Threads), die ein einzelner Benutzer erstellen kann, siehe ulimit/getrlimit
Einzelheiten zu diesen Beschränkungen.
Es ist FALSCH zu sagen, dass LINUX kein Limit für separate Threads pro Prozess hat.
Linux implementiert die maximale Anzahl von Threads pro Prozess indirekt!!
number of threads = total virtual memory / (stack size*1024*1024)
Somit kann die Anzahl der Threads pro Prozess erhöht werden, indem der gesamte virtuelle Speicher erhöht oder die Stapelgröße verringert wird. Eine zu starke Verringerung der Stapelgröße kann jedoch zu Codefehlern aufgrund eines Stapelüberlaufs führen, während der maximale virtuelle Speicher gleich dem Auslagerungsspeicher ist.
Prüfen Sie Ihr Gerät:
Gesamter virtueller Speicher:ulimit -v
(Standard ist unbegrenzt, daher müssen Sie den Auslagerungsspeicher erhöhen, um dies zu erhöhen)
Gesamtstapelgröße:ulimit -s
(Standard ist 8 MB)
Befehl zum Erhöhen dieser Werte:
ulimit -s newvalue
ulimit -v newvalue
*Ersetzen Sie den neuen Wert durch den Wert, den Sie als Limit setzen möchten.
Referenzen:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
In der Praxis wird die Grenze normalerweise durch den Stapelraum bestimmt. Wenn jeder Thread einen 1-MB-Stack erhält (ich kann mich nicht erinnern, ob dies die Standardeinstellung unter Linux ist), wird einem 32-Bit-System nach 3000 Threads der Adressraum ausgehen (vorausgesetzt, das letzte GB ist für den Kernel reserviert). .
Sie werden jedoch höchstwahrscheinlich eine schreckliche Leistung erleben, wenn Sie mehr als ein paar Dutzend Threads verwenden. Früher oder später erhalten Sie zu viel Overhead für Kontextwechsel, zu viel Overhead im Scheduler und so weiter. (Das Erstellen einer großen Anzahl von Threads verbraucht kaum mehr als viel Speicher. Aber viele Threads mit tatsächlicher Arbeit zu tun, wird Sie verlangsamen, da sie um die verfügbare CPU-Zeit kämpfen)
Was machen Sie, wo diese Grenze überhaupt relevant ist?