如何调整play框架app的可扩展性?

时间:2013-07-08 22:07:57

标签: playframework scalability playframework-2.1

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

我的问题如下:我有一个API用他/她的电子邮件登录用户。

我使用Apache Benchmark(ab)来使用性能。一个请求大约需要230毫秒。当有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框架的默认设置。谁知道如何调整播放框架的性能?

我认为它与线程池大小有关。该文档称play的默认线程池大小为#core。在这种情况下,处理所有100个请求的预期时间是:

230ms * (100 / 8) = 2875ms

那么,我应该增加默认线程池的大小吗?但该文件称,当池大小等于#core时,我应该获得最佳性能。

另外,netty的(播放的Web服务器)线程池大小会影响性能吗?我没有找到任何有关其默认值的信息。有谁知道它是如何配置的?

谢谢!

2 个答案:

答案 0 :(得分:7)

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

如果进行大量的阻塞调用(通常是“标准”JDBC数据库调用),则需要调整默认的ThreadPool,或者在另一个专门配置的ThreadPool中执行数据库调用。

要了解所有这些机制,我建议您阅读Play Framework文档的Thread Pools部分。它包含有关此主题的非常有用的信息。

答案 1 :(得分:0)

例如,

-Xmx32000m运行具有32gb堆内存的JVM。

-Xmx256m是调试模式的默认值,因此您可以更改它以匹配您希望它在服务器的RAM内存空间中扩展的程度。根据您机器的I / O速率,如果要清理很多东西,垃圾收集周期看起来像暂停,但通常约为20毫秒,根据应用的用途而不明显。