在带有 akka http 服务器的 play 框架中使用更多线程

Posted

技术标签:

【中文标题】在带有 akka http 服务器的 play 框架中使用更多线程【英文标题】:Using more threads in play framework with akka http server 【发布时间】:2021-09-18 00:53:09 【问题描述】:

我们有一个从去年开始在生产中运行的网络服务器,没有任何问题,但最近用户群激增,从那以后我们看到工作时间严重缓慢,有时我们会看到服务器无响应,因为好吧,所以这对我们来说是一个严重的问题。

我们观察到数据库端的最大利用率为最多 8 个活动连接,仅此而已。因此,我们将问题缩小到“Play 框架或 akka 服务器只允许有限的线程池来管理所有负载,从而导致瓶颈”。

作为 play 框架和 akka http 服务器的新手,我们尝试了以下各种组合的配置,但在运行时仍然没有看到增加的线程池。它始终是 8。 注意:这个“8”在具有 8 个逻辑内核的 PC 和具有 6 个内核的生产服务器上是一致的。

线程名称示例供参考:

application-akka.actor.default-dispatcher-3

下面的示例配置:

#akka.action.default-dispatcher.executor = "fork-join-executor" akka.action.default-dispatcher.executor = "thread-pool-executor"
#akka.action.default-dispatcher.throughput = 100 akka.action.default-dispatcher.thread-pool-executor.fixed-pool-size = 300
#akka.action.default-dispatcher.thread-pool-executor.core-pool-size-min = 2
#akka.action.default-dispatcher.thread-pool-executor.core-pool-size-factor = 2.0
#akka.action.default-dispatcher.thread-pool-executor.core-pool-size-max = 10
#akka.action.default-dispatcher.fork-join-executor.parallelism-max = 24
 
akka.http.host-connection-pool.max-connections = 20

【问题讨论】:

我不认为这种说法:“Play 框架或 akka 服务器只允许有限的线程池来管理所有负载,从而导致瓶颈”是一个很好的结论。 Akka 可以在非常少的物理线程上实现大量并发。而 6 核机 8 线程似乎也不算太远。 (IIRC 推荐为 1.7* 核心数,即 10。) 但是,总的来说,我认为这个问题(本质上是“为什么我的应用程序很慢”)对于 *** 来说太宽泛了。也许联系 Lightbend 以获得支持合同/咨询? (披露:Lightbend 是我的前雇主)。也许将其简化为有关连接池的特定问题。 另外,请重新发布更多配置并确保其可读性。我相信您只发布了一条线和一堆cmets。 HTTP 连接数可能与 db 连接数无关。 【参考方案1】:

您的问题非常广泛,很难给出明确的答案,但除了 Akka 线程池执行器大小可能需要在阻塞调用的情况下增加一些之外,还有一个数据库池配置:

play.db.prototype.hikaricp.maximumPoolSize = 20

我建议阅读官方文档的两个部分:

https://www.playframework.com/documentation/2.8.x/AccessingAnSQLDatabase#Using-a-CustomExecutionContext https://www.playframework.com/documentation/2.8.x/AccessingAnSQLDatabase#Configuring-the-connection-pool

【讨论】:

以上是关于在带有 akka http 服务器的 play 框架中使用更多线程的主要内容,如果未能解决你的问题,请参考以下文章

在 Play Framework 2.4.1 中打印 akka 版本

可以同时使用 Play 1.x 和 Akka 吗?

在 Play Framework 2.4 中为 Scala 实现 Akka

akka-http 发送连续的分块 http 响应(流)

每个数据库实体一个 Akka 演员?

如何在 Play 2.2.3 项目中使用 Spark 1.2.0,因为它因 NoSuchMethodError:akka.util.Helpers 而失败?