【问题标题】:How to tune the scalability of play framework app?如何调整播放框架应用程序的可扩展性?
【发布时间】:2013-07-06 09:15:54
【问题描述】:

我正在使用 Play 框架 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 的默认线程池大小是 # cores。在这种情况下,处理所有 100 个请求的预期时间是:

230ms * (100 / 8) = 2875ms

那么,我应该增加默认线程池的大小吗?但是文档说当池大小等于 # 个核心时,我应该获得最佳性能。

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

谢谢!

【问题讨论】:

  • 您的问题似乎是针对可伸缩性而不是性能。关于性能,恕我直言 230ms/req 也不是那么快,所以我还要检查这是什么原因。您是否知道大部分时间都在做什么,例如后端调用、应用特定的计算或模板渲染?
  • 通过运行play start,确保您在 PROD 模式下对 Play 进行基准测试。 DEV 模式有大量的自动重载开销。

标签: playframework scalability playframework-2.1


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    -Xmx32000m 例如用 32gb 的堆内存运行你的 JVM。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2011-06-19
      相关资源
      最近更新 更多