2012-01-12 68 views
15

对于基于JVM堆栈的WEB开发,我有点新手,但未来的项目将特别需要一些基于JVM的WEB引擎。所以我开始在一些地方寻找,以便迅速做出决定并转向试用Grails。本书看起来很不错,但是启动时间很长(grails run-app)让我留下了深刻的印象,我决定测试它是如何在负载下工作的。那就是:Grails 2.0的性能真的很低吗?

  • 测试程序:遵循几个指令这里从地面使(需要2分钟,假设你已经有了Grails和Tomcat安装):

    _http://grails.org/Quick +开始

  • 测试用例(与Apache基准 - 自带的Apache的httpd - _http://httpd.apache.org):

    ab.exe -n 500 -c _http://本地主机:8080/my-project/book/create
    (注意:这只是风格的容器内显示2个输入字段)

  • 硬件:英特尔I5 650(4Core * 3.2GHz的)8GB拉姆&赢服务器2003的x64

结果是..

的Grails: 32请求/秒

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请求/秒与CPU饱和度的100%,这是一个太下面我EXPE这样的硬件)

...接下来 - 我试图比较它与例如类似的虚拟JSF应用程序(我拿了一个在这里:_http://www.ibm.com/developerworks/library/j-jsf2/ - 寻找 “与JAR文件的源代码”,有\ JSF的例题\目标\ JSF-example2-1.0.war内),

  • 测试用例:ab.exe -n 500 -c 10 _http: //localhost:8080/jsf/backend/listing.jsp

结果是..

JSF:400请求/秒

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请求/秒:

<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:我试着用VisualVM分析我正在运行的Grails应用程序,但得到了无尽的消息循环,例如...

Profiler Agent: Redefining 100 classes at idx 0, out of total 413 
... 
Profiler Agent: Redefining 100 classes at idx 0, out of total 769 
... 

最后APP刚停下几个分钟后,工作 - 所以,貌似剖析Grails是没有良好的诊断选择。

更新 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

首先我要管理的,是的我需要RTFM - 即'grails run-app'不是运行Grails进行性能测量的正确方法。在编译WAR并将其部署到Tomcat之后,性能并没有那么低 - 只是很低。下面的度量标准是针对1个用户的并发性的(我只是想检查一个线程中的框架的MAX性能以及没有很重的负载),并且在阅读其他相关帖子时,我来到了“http://stackoverflow.com/问题/ 819684/jsf-and-spring-performance-vs-poor-jsp-performance“,并决定检查那里提到的Apache Wicket - 它的性能也包括在内。

的使用情况是: - ab.exe -n 500 -c 1 _http://本地主机:8080/... - 服务器Tomcat7中的vFabric的tcServer开发版与 '洞察力' 的背景

运行
---------------------- 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 

所以......无论如何,Grails有问题。我已经使用tcServer进行了一些分析(感谢Karthick) - 它看起来像只能跟踪基于Spring的操作,Grails的内部堆栈跟踪如下(对于2个请求 - 注意:度量标准不稳定 - 我下注精度的tcServer的远远beeing完美,但可以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:可能发生在Grails中的根本原因糟糕的表现是根本“春天”库,将在更多的细节检查。

+1

因为您知道您的Grails基准很糟糕,所以我会编辑您的第一篇文章。 – Xorlev 2012-01-12 19:58:04

回答

15

你用run-app运行它吗?

http://grails.org/Deployment状态:

发展“的Grails不应该使用Grails的运行程序命令,因为这将Grails的了在部署‘中,环境什么时候开始

+0

是的 - 我*是*运行它与'grails run-app',看到我的评论在这里的另一个答复。不过,我希望即使在Prod中也可以动态更新我的应用程序,并且它看起来像在Tomcat下更改* .gsp文件没有任何影响。所以......选择要么运行'grails run-app',要么有一个静态站点:( – 2012-01-12 18:57:39

+17

我认为如果你想在生产环境中动态更新你的代码而不需要重新部署,那么你应该找到另一个框架/平台。Grails(和大多数基于JVM的框架)并不是真正为此设计的。 – Gregg 2012-01-12 19:03:18

+8

@XtraCoder RTFM [6.2.7更改部署的应用程序](http://grails.org/doc/latest/guide/theWebLayer.html #makingChangesToADeployedApplication) – jamesallman 2012-01-12 20:03:56

4

尝试将示例应用程序部署到tomcat。 grails run-app仅供开发。

+0

_Yep,Tomcat下的Grails给出的结果稍微接近JSF应用程序--390req/sec(尽管吞吐量降低了4倍)。还是......足够好:)? - 相较于JSP我预计大约1000 REQ东西/序列是更适合这样一个简单的页面_ – 2012-01-12 18:44:25

+0

并与剖析,在控制台中的另一个消息,但同样的结果仍然没有运气 ***剖析器引擎警告:目标VM无法将类加载到工具java_lang_Long $ getLong ***最近它可能已被卸载 – 2012-01-12 18:47:06

+0

您可以尝试使用spring tcServer进行配置文件。这也可以作为STS捆绑销售 – 2012-01-12 22:15:10

2

’具有额外开销模式。”应用程序?督促?开发?

你用脚手架吗?

我试过了我的机器(核心i7-2600k)。一个包含4个输入字段的登录页面,动态布局和其他一些东西。我在慢速开发环境中每秒获得525个请求。

+0

我不知道你是什么意思开发或督促的意思。这是我的d ev工作站。脚手架? - 是的,据我了解。 – 2012-02-09 20:44:03

+1

你可以在不同的'环境'中启动grails。只需运行'grails prod run-app'进行生产(更快)或'grails run-app'进行开发。脚手架很慢,不要在生产环境中使用它。简单的说法:如果您使用它,每个请求的后台都有很多代码生成。 – thelittlebug 2012-02-11 22:47:42

2

是的,这是一个不了解Grails或他的环境的人的基准;首先,他在Windows上运行时知道资源管理不好,这就是为什么大多数Web服务/应用服务在Linux环境中运行的原因。其次,如果他使用'ab'进行基准测试,那么他没有他的代理缓存设置,因为在第一次点击后,其余的点击将被缓存,现在他正在对我的缓存进行基准测试了解他的设置。

所以这一切看起来像一个糟糕的设置和对Grails了解不够的基准。没有违法意图。