La Technique ou de l'utilitaire pour minimiser Java “warm-up” de temps?
Je suis supportant Java application de messagerie requiert une latence faible (< 300 microsecondes traitement de chaque message). Cependant, notre profilage montre que le Soleil de la Machine Virtuelle Java s'exécute lentement au début, et accélère après la première 5000 messages ou plus. Les 5 000 premiers messages ont des temps de latence de 1 à 4 millisecondes. Après environ 5000 premiers, les messages suivants ont ~250 microsecondes de latence, avec parfois des valeurs aberrantes.
Il est généralement entendu que c'est un comportement typique d'une application Java. Cependant, à partir d'un point de vue commercial, il n'est pas acceptable de dire au client qu'ils doivent attendre pour la JVM de "réchauffer" avant de voir la performance de ils exigent. La demande doit être "chaud" avant le premier client message est traité
La JVM de Sun 1.6.0 mise à jour 4.
Des idées pour résoudre ce problème:
- JVM paramètres, tels que:- XX:CompileThreshold=
- Ajouter un composant de "réchauffer" l'application au démarrage, par exemple par l'envoi de faux messages" par le biais de l'application.
- Charge statique de l'application et les classes du JDK lors du démarrage de l'application, de sorte que les classes ne sont pas chargés de Pots lors du traitement des messages client.
- Une certaine utilité ou Java agent qui accomplit une ou l'autre de ces deux idées, de sorte que je n'ai pas ré-inventer la roue.
REMARQUE: Évidemment, pour cette solution, je suis à la recherche de tous les facteurs, y compris la puce arc, type de disque et de la configuration et des paramètres du système d'exploitation. Cependant, pour cette question, je veux me concentrer sur ce qui peut être fait pour optimiser l'application Java et de minimiser les temps "d'échauffement".
- Je pense que vous feriez mieux de regarder la cause sous-jacente de ce délai initial. Des outils de profilage pourrait aider.
- Envoyer 5000 faux messages sur le serveur en tant que partie de l'installation et de la procédure de démarrage.
- 5000 faux messages (même si c'était une bonne idée) sonne comme il serait ajouter 5 à 20 secondes pour le temps de démarrage de l'application.
- J'aime l'idée de 3, si c'est ce qui est vraiment la cause de la latence.
- Pouvez-vous expliquer les caractéristiques de cette applicatioon? - est-il prévu que l'application de processus de plus de ~5000 messages à chaque fois qu'il démarre? Ou ne l'app besoin pour démarrer et arrêter souvent?
- Avez-vous essayé avec une autre JVM à la JRE de Sun? J'ai vu 20 à 30% de la vitesse-ups avec un plus rapide temps de préchauffage à l'aide de BEA JRockit sur les machines Windows.
- Aussi, pouvez-vous dresser une liste de toutes les options de la JVM vous utilisez aujourd'hui? J'aime l'idée d'un l'aide d'un Profileur, mais je soupçonne que les résultats qu'il donne peut vous aider à optimiser les caractéristiques de performance du code que vous écrivez, mais pas tellement pour optimiser les effets de point d'accès ou de potentiel de classloading warm-up.
- Pour ceux qui éprouvent ce post via les moteurs de recherche, l'application de warm-up est répertorié comme une technique dans le très bon livre blanc sur la haute performance Java: cinnober.com/news/benefits-using-java-highperformance-language
- Précédent URL 404. Nouvelle URL : cinnober.com/white-papers/...
Vous devez vous connecter pour publier un commentaire.
"Warm-up" en Java est généralement environ deux choses:
(1): Plateau de chargement de classe: Ce peut être contourner par la force à se charger.
Le moyen facile de le faire est d'envoyer un faux message. Vous devez être sûr que le faux message de déclencher tous les accès aux classes. Par exemple, si vous envoyez un message vide, mais votre progrom va vérifier si le message est vide et éviter de faire certaines choses, alors cela ne fonctionnera pas.
Une autre façon de le faire est de forcer l'initialisation de classe en accédant à la classe lorsque vous programme démarre.
(2): L'optimisation en temps réel: Au moment de l'exécution, la machine virtuelle Java permettra d'optimiser certaines parties du code. C'est la principale raison pour laquelle il y a un temps de préchauffage à tous.
Pour faciliter cela, vous pouvez envoyé des tas de faux (mais regardez réel) des messages, de sorte que l'optimisation ne peut se terminer avant votre utilisateur de l'utiliser.
Un autre que vous peut aider à soulager c'est de soutenir inline comme l'utilisation privée et final, comme beaucoup que vous le pouvez. la raison en est que, la machine virtuelle n'a pas besoin de regarder pour l'héritage de la table pour voir quelle méthode pour être effectivement appelé.
Espère que cette aide.
Votre problème n'est pas de chargement de classe, mais "juste à temps" de la compilation.
Essayer
-XX:CompileThreshold=1
Qui va les obliger à Java de tout compiler la première fois qu'il l'exécute. Il va ralentir le démarrage de votre code un peu, mais pas de VM code (car qui sera compilé lorsque Java est installé). Il y a un bug ouvert pour permettre à Java compiler personnalisé Pots de la même manière et enregistrer la suite pour plus tard exécutions, qui permettrait de réduire considérablement ces coûts, mais il n'y a pas de pression pour corriger ce bug, n'importe quand bientôt.
Une deuxième option serait d'envoyer 5'000 faux messages de l'application pour "réchauffer". De vendre ce que "assurer que tout est correctement configuré".
[MODIFIER] Quelques informations de fond dans la précompilation des classes: Classe De Partage De Données
Vous pouvez essayer d'IBM version de Java depuis ici, vous pouvez ajouter des classes à la piscine partagée: Présentation de la classe de partage de données
[EDIT2] Pour répondre aux préoccupations soulevées par kittylyst: Il est vrai que ce sera rapidement remplir votre cache de code avec des méthodes qui sont utilisées qu'une seule fois. Et il pourrait même faire votre ensemble de l'application plus lente.
Si vous définissez ce paramètre sur une valeur faible, le temps de démarrage de votre application peut devenir horriblement lent. C'est parce que le JIT optimisation + exécutant le code compilé est plus cher que l'exécution du code, une fois en mode interprété.
Le principal problème ici est que le code est toujours compilé "juste à temps". Tant que vous ne pouvez pas exécuter de chaque méthode que vous avez besoin au moins une fois, l'application "hoquet" de quelques millisecondes à chaque fois qu'il rencontre quelque chose qui n'a pas été compilé avant.
Mais si vous avez la RAM, votre application est de petite taille ou vous pouvez augmenter la taille du cache de code et vous n'avez pas l'esprit de l'heure de démarrage lent, vous pouvez donner à ceci un essai. Généralement, le paramètre par défaut est assez bonne.
Il suffit d'exécuter un tas de non-op des messages via le système avant d'être ouvert pour une véritable clientèle. 10k messages est le numéro habituel.
Financière des applications (par exemple, CORRECTION), ce qui est souvent fait par l'envoi de commandes (à un prix loin de la nuit dernière près, juste au cas où) pour le marché avant qu'il s'ouvre. Ils vont tous être rejetée, mais qui n'a pas d'importance.
Si le protocole que vous utilisez est homebrew, alors la prochaine fois que vous mettez à niveau les bibliothèques pour cela, ajouter la prise en charge explicite d'un "warm-up" ou "TEST" ou "SANITYCHECK" type de message.
Bien sûr, ce ne sera probablement pas de la compilation de votre application à la logique des voies spécifiques, mais dans un décent application de messagerie, la partie traitant du trafic réseau sera presque certainement être la partie dominante de la pile, de sorte que n'a pas d'importance.
Êtes-vous en utilisant le client ou le serveur de la JVM? Essayez de démarrer votre programme avec:
Lors de l'exécution du Soleil JVM dans ce mode, le JIT compiler le bytecode en code natif plus tôt; à cause de cela, le programme va prendre plus de temps à démarrer, mais il sera exécuté plus rapidement après que.
Référence: Questions fréquemment Posées Sur le Java HotSpot VM
Citation:
Si en cours d'exécution dans la zone serveur de mode contemporain de matériel (avec 2 ou plus de cœurs par PROCESSEUR) et avec la dernière version de JDK puis option suivante peut être utilisée pour l'accélération du réchauffement:
Vieux thread, je sais, mais j'ai trouvé cela sur internet:
Maintenant vous savez quoi faire.
Semble que votre projet puisse bénéficier en temps réel des garanties:
Voir: Temps Réel Java