Accélérer le démarrage du démarrage au printemps

j'ai une application de Botte à ressort. J'ai ajouté beaucoup de dépendances (malheureusement, regarde j'ai besoin de tous d'entre eux) et le temps de démarrage est allé beaucoup. Faire un SpringApplication.run(source, args) prend 10 Secondes.

bien que ce ne soit peut-être pas beaucoup comparé à ce qui est "utilisé", je suis malheureux qu'il en faille autant, surtout parce qu'il casse le flux de développement. L'application elle-même est plutôt faible à ce point, donc je suppose la plupart du temps est liée à l'ajout dépendances, pas l'application des classes elles-mêmes.

je suppose que le problème est classpath scanning, mais je ne sais pas comment faire:

  • confirmez que c'est le problème (c.-à-d. comment "déboguer" la botte de ressort)
  • si c'est vraiment la cause, Comment puis-je la limiter, pour qu'elle soit plus rapide? Par exemple, si je sais qu'une dépendance ou un paquet ne contient rien que le ressort devrait numériser, y a-t-il un moyen de limiter cela?

je suppose que:

accélérerait les choses, mais il n'est même pas trié à ce stade. Je vois d'autres efforts dans la botte de printemps elle-même, par exemple:

Tomcat spécifiques.

cet article:

bien que visant les tests d'intégration, suggère d'utiliser lazy-init=true , cependant je ne sais pas comment appliquer cela à tous les haricots dans la botte de printemps en utilisant la configuration Java - des pointeurs ici?

toute (autre) suggestion serait la bienvenue.

50
demandé sur steady rain 2014-12-01 17:37:05

6 réponses

ressort Boot fait beaucoup d'auto-configuration qui peut ne pas être nécessaire. De sorte que vous pouvez affiner seulement auto-configuration qui est nécessaire pour votre application. Pour voir la liste complète des auto-configurations incluses, il suffit d'exécuter la journalisation de org.springframework.boot.autoconfigure en mode de débogage ( logging.level.org.springframework.boot.autoconfigure=DEBUG dans application.properties ). Une autre option est d'exécuter l'application de démarrage à ressort avec --debug option: java -jar myproject-0.0.1-SNAPSHOT.jar --debug

il y aurait quelque chose comme ça en sortie:

=========================
AUTO-CONFIGURATION REPORT
=========================

inspecter cette liste et n'inclure que les autoconfigurations dont vous avez besoin:

@Configuration
@Import({
        DispatcherServletAutoConfiguration.class,
        EmbeddedServletContainerAutoConfiguration.class,
        ErrorMvcAutoConfiguration.class,
        HttpEncodingAutoConfiguration.class,
        HttpMessageConvertersAutoConfiguration.class,
        JacksonAutoConfiguration.class,
        ServerPropertiesAutoConfiguration.class,
        PropertyPlaceholderAutoConfiguration.class,
        ThymeleafAutoConfiguration.class,
        WebMvcAutoConfiguration.class,
        WebSocketAutoConfiguration.class,
})
public class SampleWebUiApplication {

Code a été copié de ce billet de blog .

33
répondu luboskrnac 2016-10-31 05:19:12

comme décrit dans cette question/réponse, je pense que la meilleure approche est d'exclure les dépendances dont vous n'avez pas besoin au lieu d'ajouter seulement celles dont vous pensez avoir besoin.

Voir: Réduire Au Minimum Le Temps De Démarrage Du Amortisseur

en résumé:

vous pouvez voir ce qui se passe sous les couvertures et activer la journalisation de débogage aussi simple que de spécifier --debug lors du démarrage de l'application à partir de la ligne de commande. Vous pouvez également spécifier debug=true dans votre application.propriété.

aussi, vous pouvez définir le niveau de journalisation dans l'application.propriétés aussi simples que:

logging.niveau.org.cadre de printemps.web: DEBUG exploitation forestière.niveau.org.hibernation: erreur

si vous détectez un module auto-configuré que vous ne voulez pas, il peut être désactivé. Les documents pour cela peuvent être trouvés ici: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration

un exemple ressemblerait à:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
5
répondu pczeus 2017-05-23 12:34:41

la réponse la plus votée jusqu'à présent n'est pas fausse, mais elle ne va pas dans la profondeur que j'aime voir et ne fournit aucune preuve scientifique. L'équipe de démarrage de printemps a fait un exercice pour réduire le temps de démarrage pour le Boot 2.0, et le ticket 11226 contient beaucoup d'informations utiles. Il y a aussi un billet 7939 ouvert à l'ajout de renseignements sur le calendrier à l'évaluation de l'état, mais il ne semble pas avoir d'ETA spécifique.

le L'approche la plus utile et la plus méthodique pour déboguer le démarrage a été faite par Dave Syer. https://github.com/dsyer/spring-boot-startup-bench

j'ai eu un cas d'utilisation similaire aussi bien, donc J'ai pris L'approche de Dave de micro-benchmarking avec JMH et a couru avec elle. Le résultat est le démarrage de référence du projet. Je l'ai conçu de telle sorte qu'il puisse être utilisé pour mesurer le temps de démarrage pour n'importe quelle application de démarrage, en utilisant l'exécutable jar produit par bootJar (précédemment appelé bootRepackage dans Boot 1.5) tâche Grad. N'hésitez pas à utiliser et fournir de la rétroaction.

mes conclusions sont les suivantes:

  1. CPU matters. Beaucoup.
  2. démarrer la JVM avec - Xverify:aucun aide de manière significative.
  3. , à l'exclusion des autoconfigurations inutiles.
  4. Dave a recommandé l'argument JVM - XX: TieredStopAtLevel=1 , mais mes tests n'ont pas montré d'amélioration significative avec cela. En outre, -XX:TieredStopAtLevel=1 ralentirait probablement votre première demande.
  5. Il ya eu rapports de la résolution du nom d'hôte étant lente, mais je n'ai pas trouvé que ce soit un problème pour les applications que j'ai testé.
5
répondu Abhijit Sarkar 2018-09-13 13:15:27

il n'y a qu'une seule façon garantie de comprendre ce qui se passe ici, et c'est de profiler votre application, et de chercher les points chauds qui causent le problème.

je recommande D'utiliser Votrekit. Il a une très bonne intégration IDE de sorte que vous pouvez profiler votre application à partir de Eclipse ou autre. Voir ici

https://www.yourkit.com/docs/java/help/local_profiling.jsp

vous pourrez très vite voir ce qui cause le problème, puis peut poster ici pour des solutions possibles.

-1
répondu PaulNUK 2015-04-02 09:54:42

Vous pouvez essayer de ma bibliothèque FastClasspathScanner . Je ne sais pas si on peut faire marcher le ressort avec, mais il scanne le chemin de classe beaucoup plus vite que le printemps.

-1
répondu Luke Hutchison 2015-09-24 15:19:14

pour moi, on dirait que vous utilisez une mauvaise configuration. Commencez par vérifier myContainer et les conflits possibles. Pour déterminer qui utilise le plus de ressources, vous devez vérifier les cartes mémoire (voir la quantité de données!) pour chaque dépendance à un moment - et qui prend beaucoup de temps, aussi bien... (et privilèges SUDO). Au fait: testez-vous habituellement le code par rapport aux dépendances?

-3
répondu 2015-03-30 13:15:26