From: "Herve AGNOUX" <hagnoux@mail.club-internet.fr>
To: java@u-strasbg.fr
Date sent: Mon, 10 Sep 2001 07:59:02 +0200
Subject: linux et les threads
Priority: normal
Send reply to: java@u-strasbg.fr
Bonjour,
J'entends d'étranges bruits sur les threads sous linux.
Ils seraient de couleur verte... !?
Ils mangeraient des... ressources !? Certaines JDK gronderaient et
ne les aimeraient pas !?
Tout cela est TRES INQUIETANT.
En effet, alors que jusqu'à présent je négoçiais frileusement avec
un ou deux threads par appli, je me déverguonde maintenant
franchement de ce coté là. Je fais des starts, des ThreadGroups,
je lance un wait par ici, un synchronized par là, je multiplie les
joins et les notify.
Sur mon windows 95 et avec mon jdk 1.1.8, ça marche bien.
Un mage pourra-t-il me dire quels avatars je rencontrerai en portant mon
appli au pays de linux, et avec quelles potions je pourrai trouver
plusieurs vies ?
AbracadaMerci.
--
Hervé AGNOUX hagnoux@mail.club-internet.fr
Faites vos sites avec des formulaires électroniques :
http://www.diaam.com
From: Stéphan BERNARD
<stephan.bernard@clermont.cemagref.fr>
Organization: Cemagref
To: java@u-strasbg.fr
Subject: Re: linux et les threads
Date sent: Mon, 10 Sep 2001 11:05:14 +0200
Send reply to: java@u-strasbg.fr
Bonjour,
Suite à ton mail, j'ai fait un petit test sous Linux.
Avec un JDK Sun V1.3.1 et un noyau 2.4,
je me suis amusé à écrire une petite appli qui lance autant de threads
qu'on le demande, chacun faisant un compte entre 0 et 10000, et affichant
pour chaque itération : son numéro, son compteur, et le nombre de threads
instanciés.
Apparement, les threads sont natifs (donc schedulés par l'OS), un petit ps
permet de le voir rapidement. C'est problématique du fait que lorsque
cette appli java tourne avec 20 threads, elle prend 20 fois plus de temps
machine que les atres applications, donc on a un ralentissement général,
et non pas une appli java poussive avec un environnement qui fonctionne à
peu près correctement.
Côté charge, pas de problèmes à 500 threads (avec un PIII 800 - 256 Mo
Ram), et vraiment 500 threads (le compteur de threads instanciés me permet
de le vérifier), si ce n'est une lenteur du système (il faut quand même
attendre 3 secondes que le Ctrl-C prenne effet), mais pas de plantage. Il
est à noter que les threads ne sont jamais endormis (avec un sleep de 10ms
à chaque itération, j'arrive à écrire ce mail).
Au passage, il y a des trucs rigolos :
- les System.out.println ont l'air atomiques (pas constaté de mélange dans
les lignes affichées) - Même avec peu de threads (10, p.ex), ça schedule
très vite : on ne voit pas 2 lignes successives avec le même numéro de
thread.
Par contre, contrairement à ce qu'écrit Philippe DELRIEU, je n'ai jamais
constaté de pbs de garbage collecting avec le JDK 1.3.1 de Sun (par
contre, il y en a avec celui d'IBM - dommage). Pourtant je ne suis pas
toujours tendre avec la mémoire... (d'ailleurs j'ai souvent fait planter
la JVM d'IBM).
Stéphan BERNARD.
> Le 10 Sep 2001 07:59:02 +0200, Herve AGNOUX a écrit :
> > Bonjour,
> >
> > J'entends d'étranges bruits sur les threads sous linux.
> >
> > Ils seraient de couleur verte... !?
> >
> > Ils mangeraient des... ressources !? Certaines JDK gronderaient et ne
> > les aimeraient pas !?
> >
> > Tout cela est TRES INQUIETANT.
> >
> > En effet, alors que jusqu'à présent je négoçiais frileusement avec un
> > ou deux threads par appli, je me déverguonde maintenant franchement de
> > ce coté là. Je fais des starts, des ThreadGroups, je lance un wait par
> > ici, un synchronized par là, je multiplie les joins et les notify.
> >
> > Sur mon windows 95 et avec mon jdk 1.1.8, ça marche bien.
> >
> > Un mage pourra-t-il me dire quels avatars je rencontrerai en portant
> > mon appli au pays de linux, et avec quelles potions je pourrai trouver
> > plusieurs vies ?
> >
> > AbracadaMerci.
> >
> >
> > --
> > Hervé AGNOUX hagnoux@mail.club-internet.fr
> > Faites vos sites avec des formulaires électroniques :
> > http://www.diaam.com
--
Stéphan BERNARD (+33) 473 44 07 25 stephan.bernard@cemagref.fr
LISC/CEMAGREF - 24 av. des Landais, BP 50085 - 63172 Aubière Cedex
From: "Cedric Beust" <cedric@beust.com>
To: <java@u-strasbg.fr>
Subject: RE: linux et les threads
Date sent: Mon, 10 Sep 2001 07:11:33 -0700
Send reply to: java@u-strasbg.fr
> From: Philippe Delrieu [mailto:pdelrieu@cybernomade.com]
> La deusième différence est l'algorythme de gestion des threads des OS
> qui ne sont pas toujours les mêmes. Si je me souvient bien Windows est
> préemptif alors que linux non.
Windows est preemptif (avec une granularite de preemption plus fine que
Linux la derniere fois que j'avais testee).
> De part cette différence on peut avoir
> des comportements très différents. Au début des threads natifs de Java
> des personnes avaient développés des petits programmes qui démontraient
> ces différences. Leur discour était que la portabilité de Java était en
> faite illusoire.
La portabilite est mesuree par la conformance aux specifications, et celle
de la JVM sont formelles : l'ordre de preemption des threads est
indetermine, quelle que soit la plateforme.
> Comme solution il n'y en a pas vraiment car elles dépendent de l'appli.
> On ne peut que essayer de suivre quelques conseils :
> les problèmes de thread sont moins visibles en utilisant les
> greenthreads.
Quelqu'un utilise encore les green threads sur Linux ?!? Leur
developpement n'a-t-il pas ete abandonne il y a un bail ?
> Le JDK 1.3.0 a deux problèmes principaux sous Linux et Windows. Dans le
> cadre de mes applications ils ne montent pas en charge que ce soit celui
> d'IBM ou de Sun, au bout de 10 clients ils plantent.
Jamais constate' cela ici.
--
Cedric
Subject: Re: linux et les threads
From: Philippe Delrieu <pdelrieu@cybernomade.com>
To: java@u-strasbg.fr
Date sent: 10 Sep 2001 11:11:09 -0400
Send reply to: java@u-strasbg.fr
Salut
En Java il y a deux types de thread les natifs et les verts
(greenthread). Les premiers reposent sur le scheduler le l'OS alors que
dans le second c'est la machine virtuelle qui schédule les threads. Les
premiers sont dits plus performant car plus proche de l'OS.
L'implémentation des threads natifs reposant sur l'OS, ils induisent des
différences dans le comportement des machines virtuelles. La première est
le mécanisme de mapping entre thread Java et thread de l'OS. Sous Windows
les thread Java sont mappés avec les threads de l'OS alors qur sous Linux
ils sont mappés avec les process linux.
La deusième différence est l'algorythme de gestion des threads des OS qui
ne sont pas toujours les mêmes. Si je me souvient bien Windows est
préemptif alors que linux non. De part cette différence on peut avoir des
comportements très différents. Au début des threads natifs de Java des
personnes avaient développés des petits programmes qui démontraient ces
différences. Leur discour était que la portabilité de Java était en faite
illusoire.
Dans la réalité je n'ai jamais eu de problèmes. Les problèmes rencontrés
apparaissent (encore si je me souvient bien) lorsque les threads réalisent
des taches gourmandes en CPU sans accéder à des ressources. Sous Windows
les threads sont bien arrêtés et shedullés alors que sous Linux ils ne le
sont pas. Tant qu'ils ne rendent pas le mains au sheduller le thread linux
garde la main.
Comme solution il n'y en a pas vraiment car elles dépendent de l'appli. On
ne peut que essayer de suivre quelques conseils :
les problèmes de thread sont moins visibles en utilisant les
greenthreads.
Il vaut mieux utiliser des pools de threads dès que l'on commence à
travailler avec plusieurs threads.
Dans des taches longues et lourdes en consommation CPU il vaut essayer de
rendre la mains à l'OS soit en accédant à des ressources soit en appelant
wait() ou sleep().
En terme de monté en charge, stabilité, performance je ne peux que te
transmettre mes expériences entre windows et linux. D'une manière générale
je n'ai jamais eu de problème de portage des applications serveurs entre
Windows et Unix. Je n'ai fait mes tests qu'avec le JDK 1.2.X et plus. Le
JDK 1.2.2 ne m'a jamais posé de problèmes sous Windows et Linux par contre
ils utilisent les greenthread par défaut.
Après le JDK1.2.2 les JDK utilisent les threads natif par défaut.
Le JDK 1.3.0 a deux problèmes principaux sous Linux et Windows. Dans le
cadre de mes applications ils ne montent pas en charge que ce soit celui
d'IBM ou de Sun, au bout de 10 clients ils plantent. Mes tests date de 6
mois, depuis je suis passé au JDK 1.3.1 .Le deusième problème est le
fonctionnement du garbage collector (je pense) car lorque la machine
commence à être chargée, la JVM se bloque en prenant toute la CPU. Dans
mes tests elle est restée blockée plus d'une minute avant de reprendre son
exécution. Le JDK 1.3.1 je n'ai pas encore fait beaucoup de tests
approfondis mais pour l'instant le comportement me semble correcte.
En terme de performance mon expérience me montre que sous Windows la
création des thread à un faible coût mais que le passage preemptif d'un
thread à l'autre par l'OS est lourd (sur certaine application, il devient
même visible). Je pense que des paramètres de l'OS peuvent améliorer les
choses mais ne connaissant pas windows je ne peut en dire plus. Sous Linux
la création des threads est lourde par contre le schédule des threads est
performant. Le faîte qu'il ne soit pas préhentif le rends plus performant
sur la gestion des threads.
Voilà en espérant que cela pourra te servir.
Philippe Delrieu
Le 10 Sep 2001 07:59:02 +0200, Herve AGNOUX a écrit :
> Bonjour,
>
> J'entends d'étranges bruits sur les threads sous linux.
>
> Ils seraient de couleur verte... !?
>
> Ils mangeraient des... ressources !? Certaines JDK gronderaient et ne
> les aimeraient pas !?
>
> Tout cela est TRES INQUIETANT.
>
> En effet, alors que jusqu'à présent je négoçiais frileusement avec un ou
> deux threads par appli, je me déverguonde maintenant franchement de ce
> coté là. Je fais des starts, des ThreadGroups, je lance un wait par ici,
> un synchronized par là, je multiplie les joins et les notify.
>
> Sur mon windows 95 et avec mon jdk 1.1.8, ça marche bien.
>
> Un mage pourra-t-il me dire quels avatars je rencontrerai en portant mon
> appli au pays de linux, et avec quelles potions je pourrai trouver
> plusieurs vies ?
>
> AbracadaMerci.
>
>
> --
> Hervé AGNOUX hagnoux@mail.club-internet.fr
> Faites vos sites avec des formulaires électroniques :
> http://www.diaam.com
Subject: Re: linux et les threads
From: Philippe Delrieu <pdelrieu@cybernomade.com>
To: java@u-strasbg.fr
Date sent: 10 Sep 2001 12:57:14 -0400
Send reply to: java@u-strasbg.fr
Le 10 Sep 2001 11:05:14 +0200, Stéphan BERNARD a écrit :
> Par contre, contrairement à ce qu'écrit Philippe DELRIEU, je n'ai jamais
> constaté de pbs de garbage collecting avec le JDK 1.3.1 de Sun (par
> contre, il y en a avec celui d'IBM - dommage). Pourtant je ne suis pas
> toujours tendre avec la mémoire... (d'ailleurs j'ai souvent fait planter
> la JVM d'IBM).
>
Juste une petite précision. Je signalais que j'ai constaté les problèmes
de garbage colection avec le JDK 1.3.0 et non le 1.3.1. Jusqu'à present je
n'ai pas constaté de problème avec le JDK 1.3.1 mais je n'ai pas fait
beaucoup de test. Ton info sur IBM est intéressante par contre, cela
m'évitera des tests inutils.
Le compartement que tu as trouvé correspond à ce que j'ai remarqué.
N.B. : Le System.out.println appel une ressource system très lente par
définition ce qui permet au schéduler de l'OS de donner la main aux autres
thread.
Philippe Delrieu
From: "Yann" <yann.reze@wanadoo.fr>
To: <java@u-strasbg.fr>
Subject: Re: linux et les threads - autres comparaisons réperto
riées ?
Date sent: Tue, 11 Sep 2001 07:13:03 +0200
Send reply to: java@u-strasbg.fr
Bjr la liste,
Intéressant!
Savez-vous s'il existe d'autres comparaisons / étude sur Linux (Garbage
Collector, gestion graphique, etc.) répertoriées. Je travaille sous
Solaris et prévoit un portage (ou presque) vers Linux.
Y. R.
----- Original Message -----
From: "Philippe Delrieu" <pdelrieu@cybernomade.com>
To: <java@u-strasbg.fr>
Sent: Monday, September 10, 2001 6:57 PM
Subject: Re: linux et les threads
> Le 10 Sep 2001 11:05:14 +0200, Stéphan BERNARD a écrit :
>
> > Par contre, contrairement à ce qu'écrit Philippe DELRIEU, je n'ai
> > jamais constaté de pbs de garbage collecting avec le JDK 1.3.1 de Sun
> > (par
contre,
> > il y en a avec celui d'IBM - dommage). Pourtant je ne suis pas
> > toujours tendre avec la mémoire... (d'ailleurs j'ai souvent fait
> > planter la JVM
d'IBM).
> >
> Juste une petite précision. Je signalais que j'ai constaté les problèmes
> de garbage colection avec le JDK 1.3.0 et non le 1.3.1. Jusqu'à present
> je n'ai pas constaté de problème avec le JDK 1.3.1 mais je n'ai pas fait
> beaucoup de test. Ton info sur IBM est intéressante par contre, cela
> m'évitera des tests inutils.
>
> Le compartement que tu as trouvé correspond à ce que j'ai remarqué.
>
> N.B. : Le System.out.println appel une ressource system très lente par
> définition ce qui permet au schéduler de l'OS de donner la main aux
> autres thread.
>
>
> Philippe Delrieu
>
>
Date sent: Tue, 11 Sep 2001 10:32:44 +0200
From: Remi Forax <forax@univ-mlv.fr>
To: java@u-strasbg.fr
Subject: Re: linux et les threads
Send reply to: java@u-strasbg.fr
Cedric Beust wrote:
>
> > From: Philippe Delrieu [mailto:pdelrieu@cybernomade.com]
..
> > Le JDK 1.3.0 a deux problèmes principaux sous Linux et Windows. Dans
> > le cadre de mes applications ils ne montent pas en charge que ce soit
> > celui d'IBM ou de Sun, au bout de 10 clients ils plantent.
>
> Jamais constate' cela ici.
Tous les ans depuis trois ans, nous donnons comme exercice a nos
étudiants la programmation d'un serveur HTTP. Les resultats apportent
quelques surprises :
1) il ne faut pas utiliser de green thread, j'ai meme eut des cas de
famine (une thread jamais reveiller).
2) le JDK1.3.0 marche sans probleme, un des tests consistait à
exploser
le serveur avec plusieurs client, generalement, entre 2000 et 3000
threads.
3) si il n'y a pas de monté en charge, il y a de grande chance que
cela
soit un problème de synchronisation ou de wait/notify ou de
variable
déclarée volatile.
En moyenne, Plus de la moitié des projets ont ce genre de problème.
Ca marche mais ca rame beaucoup.
Bien sur, ces stats sont personnels et sur une population de personnes qui
decouvrent la prog. reseau.
>
> --
> Cedric
Remi
Subject: Re: linux et les threads
From: Philippe Delrieu <pdelrieu@cybernomade.com>
To: java@u-strasbg.fr
Date sent: 11 Sep 2001 13:18:51 -0400
Send reply to: java@u-strasbg.fr
> Tous les ans depuis trois ans, nous donnons comme exercice a nos
> étudiants la programmation d'un serveur HTTP. Les resultats apportent
> quelques surprises :
> 1) il ne faut pas utiliser de green thread, j'ai meme eut des cas de
> famine (une thread jamais reveiller).
> 2) le JDK1.3.0 marche sans probleme, un des tests consistait à
> exploser
> le serveur avec plusieurs client, generalement, entre 2000 et 3000
> threads.
> 3) si il n'y a pas de monté en charge, il y a de grande chance que
> cela
> soit un problème de synchronisation ou de wait/notify ou de
> variable
> déclarée volatile.
> En moyenne, Plus de la moitié des projets ont ce genre de problème.
> Ca marche mais ca rame beaucoup.
>
Dans mon cas à partir de 10 clients le JDK 1.3.0 génère un core dump et
cela ne vient pas d'un problème de gestion de thread par mon appli. C'est
automatique. Par contre notre application est un peu compliquée et utilise
plusieurs serveurs CORBA. Je n'ai jamais eu de problèmes avec le JDK 1.2.2
et pour l'instant le JDK 1.3.1. Isoler le problème me semble trop
fastidieux car les quelques tests que j'ai réalisés fonctionnent bien.
Philippe Delrieu
Date sent: Fri, 14 Sep 2001 23:11:12 +0200
From: Sylvie&Marc <irigoyenSylvie@wanadoo.fr>
To: java@u-strasbg.fr
Subject: Re: linux et les threads
Send reply to: java@u-strasbg.fr
je confirme que les threads linux sont natif comme le dit cedric B(pour
le verifier tapez ps ,on peut voir que les thread java sont mappés sur des
thread linux) le comportement des threads sous linux suit le comportement
des thread sous windows les deux OS implementent un systeme type round
robin pour partager le temps CPU une difference existe cependant entre les
thread Windows et linux c'est la plage des priorités, en effet les plages
de prioritées ne sont pas les mêmes sous windows et sous linux im me
semble que setPriority(3) ou set Priority(4) signifie la même chose sous
windows alors que sous linux le thread a deux prioritées differente