Green Threads mit Java
Hallo, weiß jemand, wie man ein aktuelles Java (Sun J2SDK 1.4.2) unter Linux auf Green Threads umschalten kann? Hintergrund: Mit Programmen, die sehr viele Threads erzeugen (um die 300) kommt Linux 2.4 nicht klar. In der Java-Doku habe ich nichts gefunden. Auch die Manualpage java(1) liefert nicht wirklich Informationen dazu. Danke! Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Alles, das erfunden werden kann, ist erfunden worden. -- C. H. Duell, Beauftragter des US-Patentamts (1899)
Bernhard Walle schrieb:
weiß jemand, wie man ein aktuelles Java (Sun J2SDK 1.4.2) unter Linux auf Green Threads umschalten kann? Hintergrund: Mit Programmen, die sehr viele Threads erzeugen (um die 300) kommt Linux 2.4 nicht klar.
In der Java-Doku habe ich nichts gefunden. Auch die Manualpage java(1) liefert nicht wirklich Informationen dazu.
IIRC gibt es mit den neueren Sun J2SDKs keine green threads mehr. In der aktuellen SDK-Dokumentation steht nichts mehr darüber. Leider kann ich im Web auch keine Stelle finden wo steht, seit wann die Dinger abgeschafft wurden. Es wundert mich allerdings, daß Linux mit 300 Threads Probleme hat. Für eine Single-User-Anwendung sind 300 sicherlich zu viele, nicht aber für Server-Anwendungen. -- Viele Grüße, Alex
Moin moin, Am Thursday 20 November 2003 23:15 schrieb Alexander Veit:
Bernhard Walle schrieb:
weiß jemand, wie man ein aktuelles Java (Sun J2SDK 1.4.2) unter Linux auf Green Threads umschalten kann? Hintergrund: Mit Programmen, die sehr viele Threads erzeugen (um die 300) kommt Linux 2.4 nicht klar.
Ich habe hier das gleiche Problem, nach 216 Threads fliegt die JVM buchstäblich auseinander *g* Java ist SUCKS! java -server bringt für mein Programm nichts. Auch die Optionen -Xmx & Co. taugen nicht viel. (man Speichernutzung, etc) [...]
Es wundert mich allerdings, daß Linux mit 300 Threads Probleme
Linux hat bestimmt keine Probleme, habe gerade 5000 threads von c++ aus losrattern lassen. Das läuft alles IMHO einwandfrei ... Kann sein, das ich da natürlich einen BUG zu 100% ausprogrammiert habe *g* Aber funktioniert irgendwie... Ciao Andre
On Fri, 21 Nov 2003 at 06:39 (+0100), Andre Heine wrote:
Am Thursday 20 November 2003 23:15 schrieb Alexander Veit:
Bernhard Walle schrieb:
weiß jemand, wie man ein aktuelles Java (Sun J2SDK 1.4.2) unter Linux auf Green Threads umschalten kann? Hintergrund: Mit Programmen, die sehr viele Threads erzeugen (um die 300) kommt Linux 2.4 nicht klar.
Ich habe hier das gleiche Problem, nach 216 Threads fliegt die JVM buchstäblich auseinander *g*
Java ist SUCKS!
java -server bringt für mein Programm nichts. Auch die Optionen -Xmx & Co. taugen nicht viel. (man Speichernutzung, etc)
[...]
Es wundert mich allerdings, daß Linux mit 300 Threads Probleme
Linux hat bestimmt keine Probleme, habe gerade 5000 threads von c++ aus losrattern lassen. Das läuft alles IMHO einwandfrei ...
Kann sein, das ich da natürlich einen BUG zu 100% ausprogrammiert habe *g*
Ich hab's jetzt nochmal mit meiner jetzigen Linuxinstallation mit SuSE 9.0 probiert, hier schaffe ich über 1000 Thread sowohl von C++ als auch mit Java. Das Problem hatte ein Kollege auf einem älteren Rechner mit SuSE 7.2, Kernel 2.4.4. Ich hatte auf meiner Debian-Installation allerdings auch ab 200 Thread Probleme. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Die Arbeit ist ein Segen, der wie ein Fluch aussieht. -- Paul Auster
Hallo, Am Friday 21 November 2003 16:27 schrieb Bernhard Walle: [...]
Ich hab's jetzt nochmal mit meiner jetzigen Linuxinstallation mit SuSE 9.0 probiert, hier schaffe ich über 1000 Thread sowohl von C++ als auch mit Java.
Das Problem hatte ein Kollege auf einem älteren Rechner mit SuSE 7.2, Kernel 2.4.4. Ich hatte auf meiner Debian-Installation allerdings auch ab 200 Thread Probleme.
Ich finde das etwas komisch, warum macht C++ keine Zicken, aber Java. Du beschreibst, das Java auf 'ner SuSE 9.0 korrekt funktioniert. Mit welchem SDK arbeitest Du dort? Oder könnte das vielleicht eine Einstellung des Kernels sein? Der ist bei mir selber kompiliert ... Ciao Andre
Hallo Andre, On Fri, 21 Nov 2003 at 18:29 (+0100), Andre Heine wrote:
Am Friday 21 November 2003 16:27 schrieb Bernhard Walle:
[...]
Ich hab's jetzt nochmal mit meiner jetzigen Linuxinstallation mit SuSE 9.0 probiert, hier schaffe ich über 1000 Thread sowohl von C++ als auch mit Java.
Das Problem hatte ein Kollege auf einem älteren Rechner mit SuSE 7.2, Kernel 2.4.4. Ich hatte auf meiner Debian-Installation allerdings auch ab 200 Thread Probleme.
Ich finde das etwas komisch, warum macht C++ keine Zicken, aber Java. Du beschreibst, das Java auf 'ner SuSE 9.0 korrekt funktioniert. Mit welchem SDK arbeitest Du dort?
java version "1.4.2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28) Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
Oder könnte das vielleicht eine Einstellung des Kernels sein? Der ist bei mir selber kompiliert ...
Kann sein. Ich verwende den SuSE-Kernel bisher ohne Probleme. Mein Debian-Kernel (der, der nicht funktionierte) war selber kompiliert. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ I couldn't give [Bill Gates] advice in business and he couldn't give me advice in technology. -- Linus Benedict Torvalds
Am Friday 21 November 2003 18:46 schrieb Bernhard Walle:
On Fri, 21 Nov 2003 at 18:29 (+0100), Andre Heine wrote:
Am Friday 21 November 2003 16:27 schrieb Bernhard Walle: java version "1.4.2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28) Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
Jo, die Version habe ich mir auch gerade installiert. Wieder probiert nix! Der Fehler liegt wonaders... So, nun habe ich heraus gefunden, das scheinbar die Resourcen von KDE3 begrenzt werden! Von der konsole läuft mein kleiner Server nicht mit 400 Threads ... "kdm stoppen" (mit strg-alt-f1 dito) und schon kann java 400 Threads bis etwa 911 Threads dann ist mit der jetzigen Konfiguration schluss. IMHO hätte das auch mit der java1.4.1_01 funktionieren müssen. Normal finde ich das allerdings nicht ;)) CIao Andre
On Fri, 21 Nov 2003 at 21:56 (+0100), Andre Heine wrote:
Am Friday 21 November 2003 18:46 schrieb Bernhard Walle:
On Fri, 21 Nov 2003 at 18:29 (+0100), Andre Heine wrote:
Am Friday 21 November 2003 16:27 schrieb Bernhard Walle: java version "1.4.2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28) Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
Jo, die Version habe ich mir auch gerade installiert.
Wieder probiert nix!
Der Fehler liegt wonaders...
So, nun habe ich heraus gefunden, das scheinbar die Resourcen von KDE3 begrenzt werden! Von der konsole läuft mein kleiner Server nicht mit 400 Threads ...
"kdm stoppen" (mit strg-alt-f1 dito) und schon kann java 400 Threads bis etwa 911 Threads dann ist mit der jetzigen Konfiguration schluss.
IMHO hätte das auch mit der java1.4.1_01 funktionieren müssen.
Normal finde ich das allerdings nicht ;))
Doch. Unter Linux werden Threads auf Prozesse abgebildet. Somit wird die Anzahl der möglichen Threads durch KDE Prozesse verkleinert. Linux 2.6 soll diese Einschränkung nicht haben. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Mit dem Geist ist es wie mit dem Magen: Man kann ihm nur Dinge zumuten, die er verdauen kann." -- Winston Churchill
Bernhard Walle
Normal finde ich das allerdings nicht ;))
Doch. Unter Linux werden Threads auf Prozesse abgebildet. Somit wird die Anzahl der möglichen Threads durch KDE Prozesse verkleinert.
Ihr solltet einfach mal bedenken, dass Threads/Prozesse feste Resourcen benötigen, z.B. (AFAIR) 2 MB Stack pro Thread, unabhängig davon, wie der Kernel Threads verwaltet. Philipp
On Sat, 22 Nov 2003 at 09:40 (+0100), Philipp Thomas wrote:
Bernhard Walle
[Fri, 21 Nov 2003 22:19:40 +0100]: Normal finde ich das allerdings nicht ;))
Doch. Unter Linux werden Threads auf Prozesse abgebildet. Somit wird die Anzahl der möglichen Threads durch KDE Prozesse verkleinert.
Ihr solltet einfach mal bedenken, dass Threads/Prozesse feste Resourcen benötigen, z.B. (AFAIR) 2 MB Stack pro Thread, unabhängig davon, wie der Kernel Threads verwaltet.
Ok, dass es soviel ist habe ich nicht bedacht. Obwohl off-topic dennoch die Frage: Wie verwaltet MS Windows dann die Threads? Angeblich soll Windows mit so vielen Threads weniger Probleme haben. Allerdings hatte der Windows-Testrechner mehr Speicher als der Linux-Testrechner. Gruß, Bernhard -- "The most reliable proof that there are extraterrestrial intelligent lifeforms out there is that nobody actually tries to get in contact with us. -- Dirk Mueller
Bernhard Walle
Ok, dass es soviel ist habe ich nicht bedacht.
C/C++ Programme können ja die Grösse des benötigten Stacks über pthread_attr_setstacksize modifizieren (aber nicht unter PTHREAD_STACK_SIZE), wie das bei Java aussieht weiss ich nicht.
Obwohl off-topic dennoch die Frage: Wie verwaltet MS Windows dann die Threads?
Da darfst du mich nicht fragen :) Philipp
On Sat, 22 Nov 2003 at 12:22 (+0100), Philipp Thomas wrote:
Bernhard Walle
[Sat, 22 Nov 2003 10:26:51 +0100]: Ok, dass es soviel ist habe ich nicht bedacht.
C/C++ Programme können ja die Grösse des benötigten Stacks über pthread_attr_setstacksize modifizieren (aber nicht unter PTHREAD_STACK_SIZE), wie das bei Java aussieht weiss ich nicht.
Folgendes habe ich hierzu gefunden (aus java(1)): -Xssn Each Java thread has two stacks: one for Java code and one for C code. The -Xss option sets the maximum stack size that can be used by C code in a thread to n. Every thread that is spawned during the execution of the program passed to java has n as its C stack size. The default units for n are bytes and n must be > 1000 bytes. To modify the meaning of n, append either the letter k for kilobytes or the letter m for megabytes. The default stack size is determined by the Linux operating system upon which the Java platform is running. Allerdings kann ich momentan problemlos von Java aus mehr als 1500 Threads erzeugen, scheint also wirklich auf die Situation anzukommen und der freie Speicher scheint ein Faktor zu sein. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean." -- Isaac Newton
On Sat, 2003-11-22 at 12:22, Philipp Thomas wrote:
Bernhard Walle
[Sat, 22 Nov 2003 10:26:51 +0100]: Ok, dass es soviel ist habe ich nicht bedacht.
C/C++ Programme können ja die Grösse des benötigten Stacks über pthread_attr_setstacksize modifizieren (aber nicht unter PTHREAD_STACK_SIZE), wie das bei Java aussieht weiss ich nicht.
Obwohl off-topic dennoch die Frage: Wie verwaltet MS Windows dann die Threads? Bis Win-3.1 gab es keine Threads ;)
Da darfst du mich nicht fragen :) Ebenfalls keine Ahnung.
Die POSIX-API (pthreads) ist allerdings OS-unabhängig, d.h. die Stack-Problematik dürfte dort genauso existieren. Die Defaultwerte sind allerdings OS-spezifisch und unterscheiden sich zwischen einzelnen OSen ganz erheblich. Ich nehme aber an, dass Win-Java-Implementierungen an POSIX vorbei implementiert sind und irgendwelche native Threads verwenden. Aber ihr solltest Euch bewusst sein, das die bisherige pthread-Implementierung unter Linux eine der grössten Schwächen von Linux darstellte. Sie ist zwar für einfache Sachen durchaus brauchbar, doch die Grenzen habt ihr ja anscheinend gerade erlebt (Das soll mit nptl anders werden, doch ... warten wir es ab.). Ansonsten können, wie bei allen anderen Resourcen-intensiven Geschichten auch, auch noch die ulimits dazwischen funken. Darüber hinaus ist muss auch Frage nach dem Sinn von mehreren Hunderten oder gar Tausenden Threads erlaubt sein. Wenn ihr Euch nicht gerade mit massiv-parallellen Algorithmen beschäftigt und/oder über die entsprechende HW verfügt, macht das in der Regel nur wenig Sinn. Ralf
Am Saturday 22 November 2003 13:14 schrieb Ralf Corsepius: [...]
Darüber hinaus ist muss auch Frage nach dem Sinn von mehreren Hunderten oder gar Tausenden Threads erlaubt sein. Wenn ihr Euch nicht gerade mit massiv-parallellen Algorithmen beschäftigt und/oder über die entsprechende HW verfügt, macht das in der Regel nur wenig Sinn.
ACK! Es wahr ja auch nur ein Test, aber bei Server Anwendungen z.B., da kann ich es mir gut vorstellen. Du schreibst ja selber, wenn die HW & Ausnutzung entsprechend gegeben ist. Oder wenn ein Programm viele kleine Dateien lesen muss, da kann man mit Threads 'ne Menge beschleunigen. Ciao Andre
Hi
Oder wenn ein Programm viele kleine Dateien lesen muss, da kann man mit Threads 'ne Menge beschleunigen.
Auch wenn nicht jede Datei auf einer eigenen Festplatte liegt? (-; Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 Politik ist, wenn viele sich streiten und keiner sich freut.
Am Saturday 22 November 2003 14:24 schrieb Bodo Kaelberer:
Oder wenn ein Programm viele kleine Dateien lesen muss, da kann man mit Threads 'ne Menge beschleunigen.
Auch wenn nicht jede Datei auf einer eigenen Festplatte liegt? (-;
Nein, nicht wirklich *g* Aber man darf auf jedenfall umgehend weiterarbeiten! Wer hat schon mehr als einen Prozessor... Der link ist auch noch ganz informativ: http://www.linuxfibel.de/limits.htm Da sag' noch einer Linux skaliert nicht :) Bye Andre
Hallo
Oder wenn ein Programm viele kleine Dateien lesen muss, da kann man mit Threads 'ne Menge beschleunigen.
Auch wenn nicht jede Datei auf einer eigenen Festplatte liegt? (-;
Nein, nicht wirklich *g* Aber man darf auf jedenfall umgehend weiterarbeiten!
Mit Verarbeitung kann es tatsächlich etwas bringen. Wenn ein Thread die naechste Datei liesst, waehrend der andere die zuvor eingelesene Datei verarbeitet. Dann spart man wahrscheinlich gegenueber einen seriellen Verarbeitung die Zeit, die fuer die Positionierung des Festplattenkopfes verloren geht. Aber ob das den Aufwand fuer die Thread-Verwaltung aufwiegt... Hmm. Schoenes Wochenende. -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 Politik ist, wenn viele sich streiten und keiner sich freut.
Hallo, On Sat, 22 Nov 2003, Andre Heine wrote:
Am Saturday 22 November 2003 13:14 schrieb Ralf Corsepius:
Darüber hinaus ist muss auch Frage nach dem Sinn von mehreren Hunderten oder gar Tausenden Threads erlaubt sein. Wenn ihr Euch nicht gerade mit massiv-parallellen Algorithmen beschäftigt und/oder über die entsprechende HW verfügt, macht das in der Regel nur wenig Sinn.
ACK!
Es wahr ja auch nur ein Test, aber bei Server Anwendungen z.B., da kann ich es mir gut vorstellen. Du schreibst ja selber, wenn die HW & Ausnutzung entsprechend gegeben ist.
http://bulk.fefe.de/scalability/ koennte interessant sein, auch wenn sich das mit etwas anderem beschaeftigt. -dnh -- Subtlety is the art of saying what you think and getting out of the way before it is understood. -- BSD fortune file
Am Saturday 22 November 2003 10:26 schrieb Bernhard Walle:
On Sat, 22 Nov 2003 at 09:40 (+0100), Philipp Thomas wrote:
Bernhard Walle
[Fri, 21 Nov 2003
[...]
Obwohl off-topic dennoch die Frage: Wie verwaltet MS Windows dann die Threads? Angeblich soll Windows mit so vielen Threads weniger Probleme haben. Allerdings hatte der Windows-Testrechner mehr Speicher als der Linux-Testrechner.
IIRC wird bei Linux derzeit noch die Geschichte mit den Threads um die Prozesse rumgebaut. Bei Windows ist das AFAIK nicht so, ich glaub' irgendwie direkter!? Für Linux gibt es auch noch andere Thread Modelle. Default sollte Posix sein. http://www.linux-magazin.de/Artikel/ausgabe/2003/04/threads/threads.html Ciao Andre
participants (7)
-
Alexander Veit
-
Andre Heine
-
Bernhard Walle
-
Bodo Kaelberer
-
David Haller
-
Philipp Thomas
-
Ralf Corsepius