maximale Anzahl an Threads
-
Hallo,
ich will viele (ca 1000) kleinere (ein paar kB) Dateien downloaden. Dazu nutze ich curl und starte für jeden Download ein Thread. Wenn ich ca 50 Threads (oder weniger) gleichzeitig ausführe, läuft alles wunderbar.
Wenn ich die Anzahl an Threads erhöhe, oder gar alles auf einmal runterlade, werden zwar die Threads alle ausgeführt, einige Dateien runtergeladen, das Programm stürzt dann aber ab, bevor alle Threads beendet worden.Wenn alle Threads aktiv sind, wird etwa 500MB RAM reserviert (ich frage mich, was curl da alles so im Hintergrund macht, alle Dateien zusammen sind vllt 5MB groß). Am Arbeitsspeicher kann es also nicht liegen, da ist noch eine Menge frei.
Sollte man grundsätzlich nur eine begrenzte Anzahl an Threads starten, oder habt ihr eine Idee, warum es zu dem Absturz kommen kann?
-
Ulf schrieb:
Sollte man grundsätzlich nur eine begrenzte Anzahl an Threads starten
Ja.
-
1 Thread ~ 1 MB
Viel hilft viel gilt bei Threads nicht.
Bei etwa 50 sollte Schluß sein. Wenn Du Dich fragst, wie man z.B. trotzdem 1000 Clients bei einem Server bedient -> Asynchron.Lies Dich in das Thema ein
-
Ok, ich danke euch.
Wovon hängt es denn ab, wieviele Threads erstellt werden können? Von der CPU, oder OS?
-
Die Hardware limitiert. A.) Kann der RAM ausgehen und b.) kann das OS an den ganzen Kontext-Switches ersticken und ewig freezen.
-
Versuch lieber eine optimale Threadzahl zu finden. Es kann durchaus sein, dass du mit 50 Threads deutlich langsamer bist als mit deutlich weniger Threads! Einfach weil die ein deutlich größeren Overhead hast.
-
rüdiger schrieb:
Versuch lieber eine optimale Threadzahl zu finden. Es kann durchaus sein, dass du mit 50 Threads deutlich langsamer bist als mit deutlich weniger Threads! Einfach weil die ein deutlich größeren Overhead hast.
Optimale Threadzahl = Anzahl der logischen CPUs.
-
Ethon schrieb:
rüdiger schrieb:
Versuch lieber eine optimale Threadzahl zu finden. Es kann durchaus sein, dass du mit 50 Threads deutlich langsamer bist als mit deutlich weniger Threads! Einfach weil die ein deutlich größeren Overhead hast.
Optimale Threadzahl = Anzahl der logischen CPUs.
Das kann man so allgemein nicht sagen. Wenn die lange auf I/O warten, dann können mehr Threads sinnvoll sein. Wenn der Rechner mit anderen Programmen ausgelastet ist, dann können auch weniger sinnvoll sein. Aber "Anzahl der logischen CPUs/Kerne" ist mal ein guter Startpunkt.
-
Naja, für I/O gibts asynchrones IO, was man bei mehreren Verbindungen auch machen sollte.
-
Hallo,
Wie man es richtig macht wurde schon gesagt,
richtig viele Threads machen hier keinen Sinn,
weil die Threads nur auf IO warten würden ...Vermutlich liegt das Performance Optimum schon bei zwei oder drei Threads,
unabhängig von der Anzahl CPUs.habt ihr eine Idee, warum es zu dem Absturz kommen kann?
Ich meine es dürfte am virtuellen Speicher liegen.
Typischerweise bekommt jeder Thread initial einen virtuellen Stackframe von 8MB.ulimit -aS
gibt das Softlimit an
ulimit -aH
gibt das Hardlimit an
Davon werden nur die ersten 4KB real verwendet.
Wenn man mal von max. 4 GB virtuellem Speicher ausgeht:
4096 MB / 8 MB = 512Bei einem 32 Bit OS ist so bei 512 Threads in einem Prozess Ende.
Ganz ehrlich finde ich auch gut soBlöd ist es aber trotzdem, wenn einem der virtuelle Speicher ausgeht,
obwohl noch genug realer Speicher vorhanden ist ...Tip:
Wenn man das ULimit 'stack size' (SoftLimit) runter setzt z.B. auf 512 KB
tut nicht spürbar weh, reduziert aber signifikant den 'Verbrauch' an virtuellem Speicher mit den daraus resultierenden positiven Effekten.Gruß Frank