Ответ 1
Запускаете ли вы его с помощью run-app?
"Grails никогда не следует развертывать с помощью команды grails run-app, поскольку это устанавливает Grails в режиме" разработки ", который имеет дополнительные накладные расходы".
Я немного новичок в разработке WEB, основанный на стеке JVM, но для будущего проекта потребуется определенно некоторый движок WEB на основе JVM. Поэтому я начал изучать почву, чтобы быстро все исправить, и повернулся, чтобы попробовать Grails. Вещи хорошо смотрелись из книги, но, несмотря на очень длительное время запуска (grails run-app), я решил проверить, как это работает под нагрузкой. Вот он:
test app: следуйте инструкциям ниже, чтобы сделать это с земли (требуется 2 минуты, если у вас уже установлены Grails и Tomcat):
_http://grails.org/Quick+Start
тестовый пример (с тестом Apache - поставляется с Apache httpd - _http://httpd.apache.org):
ab.exe -n 500 -c _http://localhost: 8080/my-project/book/create
(Примечание: это только отображает 2 поля ввода в стилизованном контейнере)
аппаратное обеспечение: Intel i5 650 (4Core * 3,2 ГГц) 8 ГБ RAM и Win Server 2003 x64
Результат:..
Grails: 32 Req/Sec
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
(Только 32 Req/Sec с 100% насыщенности ЦП, это слишком низко для моих ожиданий для такого оборудования)
... Далее - я попытался сравнить его, например, с аналогичным приложением JSF-типа (я взял его здесь: _http://www.ibm.com/developerworks/library/j-jsf2/- искать "Исходный код с JAR файлами", есть \jsf-example2\target\jsf-example2-1.0.war внутри),
Результат:..
JSF: 400 Req/Sec
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
... И, наконец, идет исходный фиктивный JSP (только для справки)
Jsp: 8000 req/sec:
<html>
<body>
<% for( int i = 0; i < 100; i ++ ) { %>
Dummy Jsp <%= i %> </br>
<% } %>
</body>
</html>
Результат:
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
...
Я что-то пропустил?... и приложение Grails может работать намного лучше?
PS: Я пробовал профилировать мое приложение Grails с помощью VisualVM, но получил бесконечный цикл сообщений вроде...
Profiler Agent: Redefining 100 classes at idx 0, out of total 413
...
Profiler Agent: Redefining 100 classes at idx 0, out of total 769
...
И, наконец, приложение просто перестало работать после нескольких минут - так что, похоже, профилирование Grails не является выбором для хорошего диагноза.
Обновление - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Прежде всего, мне нужно администрировать, да, мне нужно RTFM - т.е. "grails run-app" - это не правильный способ запуска Grails для измерения производительности. После компиляции WAR и ее развертывания на производительность Tomcat это не так уж и плохо - он просто низкий. Метрики ниже для concurrency 1 пользователя (я просто хотел проверить, что такое MAX-производительность фреймворка в одном потоке и без большой нагрузки), и при чтении других связанных сообщений здесь я пришел к "http://stackoverflow. com/info/819684/jsf-and- spring -performance-vs-poor-jsp-performance" и решил проверить упомянутый там Apache Wicket - его производительность также включена.
Вариант использования: - ab.exe -n 500 -c 1 _http://localhost: 8080/... - сервер Tomcat7 в vFabric tcServer Dev edition с "проницательностью", работающей на фоне
---------------------- 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
Итак... во всяком случае с Граалем что-то не так. Я сделал некоторое профилирование с помощью tcServer (спасибо Karthick) - похоже, что он способен отслеживать только действия Spring, а внутренняя stacktrace для Grails - следующая (для 2 запросов - примечание: показатели нестабильны - я точность ставки tcServer далеко не идеальна, но может использоваться только для информации)
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: может случиться так, что основная причина плохой производительности в Grails лежит в основе ` Spring 'libs, проверит это более подробно.
Запускаете ли вы его с помощью run-app?
"Grails никогда не следует развертывать с помощью команды grails run-app, поскольку это устанавливает Grails в режиме" разработки ", который имеет дополнительные накладные расходы".
попробуйте применить пример приложения к tomcat. grails run-app
предназначен только для разработки.
в какой среде вы запустили приложение? подталкивать? DEV?
Вы используете строительные леса?
Я пробовал это на своей машине (ядро i7-2600k). страницу входа с 4 полями ввода, динамическими макетами и некоторыми другими вещами. У меня 525 запросов в секунду в более медленной среде.
Да, это контрольный пример того, кто не знает много о граале или его окружении; сначала он работает в Windows, понимая, что плохо работает в управлении ресурсами, поэтому большинство веб-сервисов/приложений обслуживаются в средах Linux.
Во-вторых, если он использует "ab" для сравнения, то у него нет настройки прокси-кеша, потому что после первого удара оставшаяся часть хитов будет кэшироваться, и теперь он сравнивает свой кеш с моим пониманием его установки.
Итак, все это похоже на бенчмаркинг плохой настройки и плохое понимание Grails. Никакое преступление не предназначено.