Est la performance de Grails 2.0 vraiment terriblement bas?
-
27-10-2019 - |
Question
Je suis un peu novice pour le développement Web basé sur la pile JVM, mais futur projet nécessitera spécifiquement certains moteurs de WEB à base de machine virtuelle Java. Alors je commencé à chercher sur un terrain pour faire les choses rapidement et tourné pour essayer Grails. Les choses avaient l'air bien du livre, mais beeing impressionné par le temps très long démarrage (Grails run-app) j'ai décidé de tester comment fonctionne sous charge. Ici, il est:
-
test app: suivre quelques instructions ici pour faire de la terre (prend 2 minutes en supposant que vous avez déjà Grails et Tomcat installé):
_http: //grails.org/Quick+Start
-
cas de test (avec référence Apache - est livré avec Apache httpd - _http: //httpd.apache.org):
ab.exe -n 500 -c _http: // localhost: 8080 / my-projet / livre / créer
(Note: ceci est juste 2 affiche les champs d'entrée dans le conteneur de style) -
matériel: Intel i5 650 (* 4Core 3.2GHz) 8 Go de RAM et Windows Server 2003 x64
Le résultat est ..
Grails: 32 Req / s
Total transferred: 1380500 bytes
HTML transferred: 1297500 bytes
Requests per second: 32.45 [#/sec] (mean)
Time per request: 308.129 [ms] (mean)
Time per request: 30.813 [ms] (mean, across all concurrent requests)
Transfer rate: 87.51 [Kbytes/sec] received
(seulement 32 Req / Sec avec 100% de saturation du processeur, c'est une façon trop en dessous de mes attentes pour ce matériel)
... Ensuite - j'ai essayé de le comparer par exemple avec application JSF factice similaire (i a un ici: _http: //www.ibm.com/developerworks/library/j-jsf2/ - rechercher « code source avec les fichiers JAR », il y a \ jsf-example2 \ target \ jsf-example2-1.0.war à l'intérieur),
- cas de test: ab.exe -n 500 -c 10 _http: // localhost: 8080 / JSF / backend / listing.jsp
Le résultat est ..
sur JSF: 400 Req / s
Total transferred: 5178234 bytes
HTML transferred: 5065734 bytes
Requests per second: 405.06 [#/sec] (mean)
Time per request: 24.688 [ms] (mean)
Time per request: 2.469 [ms] (mean, across all concurrent requests)
Transfer rate: 4096.65 [Kbytes/sec] received
... Et enfin va factice première JSP (juste pour la référence)
Jsp: 8000 req / s:
<html>
<body>
<% for( int i = 0; i < 100; i ++ ) { %>
Dummy Jsp <%= i %> </br>
<% } %>
</body>
</html>
Résultat:
Total transferred: 12365000 bytes
HTML transferred: 11120000 bytes
Requests per second: 7999.90 [#/sec] (mean)
Time per request: 1.250 [ms] (mean)
Time per request: 0.125 [ms] (mean, across all concurrent requests)
Transfer rate: 19320.07 [Kbytes/sec] received
...
Suis-je manque quelque chose? ... et l'application Grails peut fonctionner beaucoup mieux?
PS: J'ai essayé de profilage mon application Grails en cours d'exécution avec VisualVM, mais ai boucle sans fin de messages comme ...
Profiler Agent: Redefining 100 classes at idx 0, out of total 413
...
Profiler Agent: Redefining 100 classes at idx 0, out of total 769
...
Et enfin l'application juste cessé de fonctionner après quelques minutes -. Donc, ressemble profilage Grails est pas le choix pour un bon diagnostic
Mise à jour - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tout d'abord, je dois admin, oui j'ai besoin de RTFM - à savoir « Grails run-app » est pas la bonne façon de fonctionner Grails pour la mesure du rendement. Après la compilation de WAR et le déploiement à la performance Tomcat est pas terriblement faible - il est juste faible. Les paramètres ci-dessous sont pour 1 utilisateur de la concurrence (je voulais juste vérifier ce qui est des performances MAX du cadre dans un thread et sans charge lourde) et en lisant d'autres postes connexes ici je suis venu à « http://stackoverflow.com/ Questions / 819684 / JSF et ressort-performance contre-pauvres jsp-performance » et a décidé de vérifier Apache Wicket citer -. sa performance est également inclus
Cas d'utilisation est le suivant: - ab.exe -n 500 -c 1 _http: // localhost: 8080 / ... - serveur est tomcat7 dans l'édition vFabric tcServer Dev avec 'insight' en cours d'exécution sur fond
---------------------- tcServer Plain Tomcat 7 -c 10
/Grails/book/create 77 req/sec 130 req/sec 410 req/sec
/jsf/backend/listing.jsp 133 req/sec 194 req/sec 395 req/sec
/wicket/library/ 870 req/sec 1400 req/sec 5300 req/sec
Alors ... de toute façon il y a quelque chose de mal avec Grails. J'ai fait quelques profilage à l'aide tcServer (merci Karthick) - on dirait qu'il est capable seulement de tracer des actions « à base de printemps » et stacktrace interne pour Grails est comme suit (pour 2 demandes - Note: les mesures ne sont pas stables - précision de pari i de tcServer loin de beeing parfait, mais peut être utilisé juste pour inforamtion)
Total (81ms)
Filter: urlMapping (32ms)
-> SimpleGrailsController#handleRequest (26ms)
-> Render view "/book/create" (4ms)
Render view "/layouts/main.gsp" (47ms)
Total (79ms)
Filter: urlMapping (56ms) ->
-> SimpleGrailsController#handleRequest (4ms)
-> Render view "/book/create" (38ms)
Render view "/layouts/main.gsp" (22ms)
PS:. Il peut arriver que la cause de la mauvaise performance dans Grails sont sous-jacente libs « Spring », va vérifier dans plus de détails
La solution
Êtes-vous en cours d'exécution avec l'exécution app?
http://grails.org/Deployment indique:
« Grails ne doit jamais être déployé en utilisant les Grails d'exécution du serveur commande app comme ce jeux Grails en « développement » en mode qui a des frais généraux supplémentaires. »
Autres conseils
essayer de déployer votre application échantillon tomcat. grails run-app
est uniquement pour le développement.
dans quel environnement avez-vous commencé l'application? prod? dev?
utilisez-vous échafaudage?
Je l'ai essayé sur ma machine (i7-2600K de base). une page de connexion avec 4 champs d'entrée, mises en page dynamiques et d'autres choses. J'ai 525 demandes par seconde dans l'environnement de développement plus lent.
Ouais c'est une référence par quelqu'un qui ne sait pas beaucoup sur Grails ou son environnement; d'abord, il est en cours d'exécution sur Windows pour être savent mal à la gestion des ressources qui est pourquoi la plupart web sert / app sert dans des environnements Linux fonctionne.
En second lieu, s'il utilise « ab » pour référence, alors il n'a pas sa configuration de cache proxy car après le premier coup, le reste des coups serait mis en mémoire cache et il est maintenant benchmarking son cache de ma compréhension de sa configuration.
Tout cela ressemble à l'analyse comparative d'une configuration mauvaise et une mauvaise compréhension de Grails. Aucune infraction prévue.