我正在使用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服务器)线程池大小会影响性能吗?我没有找到任何有关其默认值的信息。有谁知道它是如何配置的?
谢谢!
答案 0 :(得分:7)
Play的默认线程配置专为使用异步API的应用程序而设计。
如果进行大量的阻塞调用(通常是“标准”JDBC数据库调用),则需要调整默认的ThreadPool,或者在另一个专门配置的ThreadPool中执行数据库调用。
要了解所有这些机制,我建议您阅读Play Framework文档的Thread Pools部分。它包含有关此主题的非常有用的信息。
答案 1 :(得分:0)
-Xmx32000m运行具有32gb堆内存的JVM。
-Xmx256m是调试模式的默认值,因此您可以更改它以匹配您希望它在服务器的RAM内存空间中扩展的程度。根据您机器的I / O速率,如果要清理很多东西,垃圾收集周期看起来像暂停,但通常约为20毫秒,根据应用的用途而不明显。