Ich habe ein einfaches Programm geschrieben, um die maximale Anzahl von Threads zu berechnen, die ein Prozess in Linux haben kann (Centos 5). Hier ist der Code:
%Vor%Ich habe herausgefunden, dass die maximale Anzahl für Threads nur 300 ist !? Was, wenn ich mehr brauche? Ich muss erwähnen, dass pthread_create 12 als Fehlercode zurückgibt.
Danke vor
Es gibt ein Thread-Limit für linux und es kann Laufzeit geändert werden, indem das gewünschte Limit in /proc/sys/kernel/threads-max
geschrieben wird. Der Standardwert wird aus dem verfügbaren Systemspeicher berechnet. Zusätzlich zu diesem Limit gibt es noch ein weiteres Limit: /proc/sys/vm/max_map_count
, das die maximalen mmapped-Segmente begrenzt, und zumindest die letzten Kernel werden den Speicher pro Thread in mmap speichern. Es sollte sicher sein, dieses Limit sehr zu erhöhen, wenn Sie es treffen.
Die Begrenzung, die Sie treffen, ist der Mangel an virtuellem Speicher im 32-Bit-Betriebssystem. Installieren Sie ein 64-Bit-Linux, wenn Ihre Hardware es unterstützt, und alles wird gut. Ich kann problemlos 30000 Threads mit einer Stackgröße von 8 MB starten. Das System hat einen einzigen Core 2 Duo + 8 GB Systemspeicher (ich verwende 5 GB für andere Sachen zur selben Zeit) und es läuft 64 Bit Ubuntu mit Kernel 2.6.32. Beachten Sie, dass Speicher-Overcommit (/ proc / sys / vm / overcommit_memory) zulässig sein muss, da das System andernfalls mindestens 240 GB commitable memory (Summe aus realem Speicher und Auslagerungsspeicher) benötigen würde.
Wenn Sie viele Threads benötigen und kein 64-Bit-System verwenden können, müssen Sie nur die Speicherbelegung pro Thread minimieren, um den virtuellen Speicher zu erhalten. Beginnen Sie damit, so wenig Stack wie möglich anzufordern.
Aufgrund Ihrer Systemgrenzen können Sie möglicherweise nicht die Stapel aller benötigten Threads zuordnen. Sehen Sie sich /proc/sys/vm/max_map_count
an und lesen Sie diese Antwort . Ich bin mir nicht 100% sicher, dass dies dein Problem ist, weil die meisten Leute Probleme bei viel größeren Threads .
Ich hatte auch das gleiche Problem, wenn meine Anzahl von Threads einen Schwellenwert überschreitet. Es war wegen der Benutzer-Level-Grenze (Anzahl der Prozesse, die ein Benutzer zu einem Zeitpunkt ausführen kann) in /etc/security/limits.conf auf 1024 gesetzt.
Überprüfen Sie Ihre /etc/security/limits.conf und suchen Sie nach Eintrag: -
Benutzername - / soft / hard -nproc 1024
ändere es in einige größere Werte auf etwas 100k (erfordert Sudo Privilegien / root) und es sollte für Sie arbeiten.
Weitere Informationen zur Sicherheitsrichtlinie finden Sie unter Ссылка .
überprüfe die Stackgröße pro Thread mit ulimit, in meinem Fall Redhat Linux 2.6:
%Vor%Jeder Ihrer Threads erhält diese Menge an Speicher (10 MB), die für seinen Stack zugewiesen wurde. Mit einem 32bit Programm und einem maximalen Adressraum von 4GB sind das maximal 4096MB / 10MB = 409 Threads !!! Minus Programmcode, minus Heap-Space führt wahrscheinlich zu Ihrem beobachteten max. von 300 Fäden.
Sie sollten in der Lage sein, dies zu erhöhen, indem Sie eine 64-Bit-Anwendung kompilieren oder ulimit -s 8192 oder sogar ulimit -s 4096 setzen. Aber wenn das ratsam ist, ist eine andere Diskussion ...
Sie werden auch nicht mehr genügend Arbeitsspeicher haben, wenn Sie nicht die Standard-Thread-Stack-Größe verkleinern. Seine 10MB auf unserer Version von Linux.
BEARBEITEN: Fehlercode 12 = nicht genügend Arbeitsspeicher, also denke ich, dass der 1mb-Stack immer noch zu groß für dich ist. Kompiliert für 32 Bit, kann ich einen 100k Stack bekommen, um mir 30k Threads zu geben. Über 30k Threads bekomme ich Fehlercode 11, was bedeutet, dass keine Threads mehr erlaubt sind. Ein 1MB Stack gibt mir 4k Threads vor Fehlercode 12. 10MB gibt mir 427 Threads. 100MB gibt mir 42 Threads. 1 GB gibt mir 4 ... Wir haben 64 Bit OS mit 64 GB RAM. Ist Ihr Betriebssystem 32 Bit? Wenn ich für 64bit kompiliere, kann ich jede mögliche Stapelgröße verwenden und die Grenze der Threads erreichen.
Ich habe auch bemerkt, wenn ich den Profiling-Kram (Tools | Profiling) für Netbeans aktiviere und von der IDE laufe ... Ich kann nur 400 Threads bekommen. Seltsam. Netbeans stirbt auch, wenn Sie alle Threads verbrauchen.
Hier ist eine Test-App, die Sie ausführen können:
%Vor%