Performances de build Java sous Linux ?
Un matin, j’en ai eu assez d’attendre 15 min à chaque construction mon application par l’usine de développement. Sur mon Mac Book Pro, cela mets deux fois moins de temps. Je suis donc aller chez le revendeur informatique d’à coté, pour acheter un serveur tout neuf. J’installe un Linux (Ubuntu 9.10), je lance mon build, je patiente, et je constate que cela mets 11 minutes. C’est toujours plus lent que sur mon Mac Book Pro; quelle déception ! Effectivement, mon Mac Book Pro est puissant, mais le nouveau serveur contient quand même un coreI5 quad core (le plus rapide que j’ai trouvé), avec 6Go de Ram DDR3 et des disques en RAID 1 !
Pour couronner le tout, un collègue arrive et me dit : j’ai un Windows Seven 32 bits sur une clé USB, on peut essayer si tu veux … On installe, on build, 5 min 30. Ce n’est donc pas le hard qui est en cause ... S’en suit des essais sur plein de distribution linux différentes. J’ai même essayé OpenSolaris. A noter que je souhaite utiliser une distribution "out of the box", c'est à dire que sans effectuer aucune configuration particulière dessus, sans recompiler le noyau ou autre (c'est pourquoi je n'ai pas testé Gentoo). Chaque essai se déroule de la façon suivante :
- installation de l’OS
- installation de la JVM Sun JDK 6 Update 20 (64 ou 32 bits selon l'OS)
- installation de maven, d’un repository maven pré rempli, du code source
- 2 builds complets, afin de noter les temps et de faire une moyenne
Voici les résultats : Sur mon Mac Book Pro Core 2 Duo 3.06 GHz, 8Go de Ram, Disque SSD
OS | Temps de build |
---|---|
Mac OS X 10.6 | 7 min 38 |
Sur le serveur, Core I5 670 Quad Core 3.46 GHz, 6Go de Ram, Disque 500G Seagate
OS | Temps de build | Version du noyau Linux |
---|---|---|
Ubuntu server 9.10 32 bits | 11 min 29 | 2.6.31 |
Ubuntu server 9.10 64 bits | 11 min 11 | 2.6.32 |
Open Solaris 2009.06 x86 | 5 min 16 | |
Fedora 12 64 bits | 10 min 42 | 2.6.32 |
Open Suse 11.2 64 bits | 10 min 50 | 2.6.31 |
Suse Linux Entreprise Server 11 64 bits | 4 min 48 | 2.6.27 |
Ubuntu server 10.04 LTS 64 bits | 4 min 17 | 2.6.32 |
Windows Seven 32 bits | 5 min 19 |
Que constate-t-on ? : Les écarts entre les OS sont énormes !
J'ai fait quelques essais complémentaires :
Virtualisation | J'ai essayé ces mêmes distributions en environnement virtualisé sur mon Mac Book Pro, avec Virtual Box. Les temps de compilation sont sensiblement identiques quelque soit la distribution. A noter que OpenSolaris virtualisé compile un poil plus vite que Mac OS X natif ! |
Ramdisk | J’ai aussi essayé de compiler dans un Ramdisk, avec différents filesystems : pas de différences notables. Cela ne semble donc pas venir des IOs. |
64 vs 32 | Il n’y a pas de différence significative entre un build sur Ubuntu 32 avec JVM 32 et un build sur Ubuntu 64 sur JVM 64. La compression de pointeur (-XX:+UseCompressedOops) spécifiques 64 bits permet d’améliorer le temps de compilation d'une dizaine de % sur JVM 64 bits. |
Changer de JVM | J'ai essayé, sous Ubuntu 9.10 64 de builder avec une autre JVM : OpenJDK 6, JRockit 5. J'ai obtenu des temps de build sensiblement équivalent. |
Est-ce généralisable à tous les builds Java ? Probablement. Mon build n'a rien d'extraordinaire (compilation Java, compilation GWT, beaucoup de tests).
Est-ce généralisable à une application J2EE qui tourne dans un serveur d'application ? c'est possible, mais ce n'est pas prouvé. Le comportement de la JVM sur une exécution longue, contrairement à un build qui est court, peut être assez différent. A tester !
Qu’en conclure ?
- que les performances de build Java peuvent varier, sur un même hard, d’un facteur 2 selon les distributions Linux. Ce qui est énorme.
- que je ne sais toujours pas d’où ça vient. Je penche pour une différence de configuration au niveau du noyau linux, mais sans preuve.
- que faire quelques benchs avant de choisir une distribution n’est donc pas inutile.
- que faire ces benchs est très facile, toutes les distributions s’installent aujourd’hui en moins d’une demi heure.
J'ai réinstaller le serveur sous Ubuntu 10.04 LTS. Comme c'est maintenant notre usine de développement officielle, je ne peux plus l'utiliser pour faire des benchs Linux. J'aimerais cependant bien trouver d'où viennent ces différences. Je vous propose d'en débattre dans les commentaires, je ferais une synthèse si nous trouvons quelque chose.