2013-07-08 65 views
5

我正在使用Play框架2.1来开发我的应用程序。这是一个非常易于使用的框架。我能够快速开发我的应用程序。但我也遇到了一些可扩展性问题。看起来Play 2.1的运行速度并不像声称的那么快。也许这是因为我不知道调整表现。如何调整玩框架应用程序的可扩展性?

我的问题是以下内容:我有一个API登录与他/她的电子邮件地址的用户。

我使用Apache基准(ab)来使用性能。一个请求需要大约230ms。当有5个并发请求时,响应时间仍然足够快,大约为280ms。

Concurrency Level:  5 
Time taken for tests: 0.306 seconds 
Complete requests:  5 
Failed requests:  0 
Write errors:   0 
Total transferred:  3495 bytes 
Total POSTed:   1065 
HTML transferred:  3135 bytes 
Requests per second: 16.34 [#/sec] (mean) 
Time per request:  306.009 [ms] (mean) 
Time per request:  61.202 [ms] (mean, across all concurrent requests) 
Transfer rate:   11.15 [Kbytes/sec] received 
         3.40 kb/s sent 
         14.55 kb/s total 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  1 1 0.1  1  1 
Processing: 280 290 13.8 292  305 
Waiting:  278 288 13.7 291  304 
Total:  280 291 13.9 293  306 

然而,当我用100个并发请求,我得到了非常糟糕的结果。

Concurrency Level:  100 
Time taken for tests: 4.243 seconds 
Complete requests:  100 
Failed requests:  0 
Write errors:   0 
Total transferred:  69900 bytes 
Total POSTed:   21300 
HTML transferred:  62700 bytes 
Requests per second: 23.57 [#/sec] (mean) 
Time per request:  4243.058 [ms] (mean) 
Time per request:  42.431 [ms] (mean, across all concurrent requests) 
Transfer rate:   16.09 [Kbytes/sec] received 
         4.90 kb/s sent 
         20.99 kb/s total 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  1 62 31.5  83  89 
Processing: 996 3744 544.7 3902 4146 
Waiting:  995 3727 542.0 3894 4146 
Total:  1084 3806 542.6 3968 4204 

我的服务器机器:Intel i7,8核心,2.8GHz,8GB内存。我使用了默认的播放框架设置。任何人都知道如何调整游戏框架的表现?

我认为它涉及到线程池的大小。该文件表示play的默认线程池大小为#个内核。在这种情况下,预期的时间来处理所有100个请求是:

230ms * (100/8) = 2875ms 

所以,我应该加大默认线程池的大小?但该文件说,当池大小等于#个内核时,我应该获得最佳性能。

此外,将网状的(该剧的网络服务器)线程池的大小影响性能?我没有找到任何有关其默认值的信息。任何人都知道它是如何配置的?

谢谢!

+0

看来你的问题是针对可伸缩性而不是性能。关于性能,恕我直言230ms/req也不是那么快,所以我还要检查是什么原因造成的。你是否有任何线索,大部分时间都是如此后端调用,应用程序特定的计算或模板渲染? – MartinGrotzke

+1

通过运行'play start',确保您在PROD模式下进行基准测试。 DEV模式有很多自动重新加载的开销。 –

回答

6

Play的默认线程配置专为使用异步API的应用程序设计。

如果你赚了很多阻塞调用(通常情况下,“标准” JDBC数据库调用),你将需要调整默认的线程池,或者在另一个专门配置的线程池执行你的数据库调用。

要了解所有这些机制,我可以建议你读播放框架文档的Thread Pools部分。它包含有关此主题的非常有用的信息。

0

-Xmx32000m例如运行您的JVM与32GB的堆内存。

-Xmx256m是围绕默认调试模式,这样你可以改变它来匹配你要多少到您的服务器的RAM内存空间内展开。根据你机器的I/O速率,如果有很多需要清理的垃圾回收周期可能看起来像是暂停,但通常大约是20ms,并且根据应用程序的目的不明显。