在带有 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 Framework 2.4 中为 Scala 实现 Akka
如何在 Play 2.2.3 项目中使用 Spark 1.2.0,因为它因 NoSuchMethodError:akka.util.Helpers 而失败?