如何让Play框架使用机器上的所有64个核心。无论我配置什么,我都无法让我的Play webapp使用所有64个内核。我应该关注一个特定的设置吗?请帮忙!
目前,我已配置以下内容:
play {
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = WARNING
actor {
default-dispatcher = {
fork-join-executor {
parallelism-factor = 10.0
parallelism-max = 64
}
}
}
}
}
internal-threadpool-size=64
iteratee-threadpool-size=64
当我查看机器进程时,我发现只有三分之一的处理器内核被使用。我可以做任何其他设置,以便使用所有64个核心吗?
我们在一个Play控制器中的WebSocket端点处于非阻塞模式,而不是WebSocket.Async调用。为了加载测试这个WebSocket端点,我有一个简单的客户端,它使用Akka动态创建多个Actor实例。每个Actor实例都创建一个新的WebSocket连接并发送数千条消息。
通过单个WebSocket连接发送的消息数和Actor实例总数都是可配置的。这样,我就可以加载测试Play框架公开的WebSocket端点。
但无论我做什么,我都看不到服务器利用它的所有内核。这实际上减缓了我们的表现。有关Play框架中哪些配置可以调整以确保在重负载期间使用所有64个内核的任何建议?
以下是我在Play框架加载时看到的内容(来自日志文件):
play {
# merge of application.conf: 7,reference.conf: 8
akka {
# application.conf: 9
loglevel=WARNING
# application.conf: 8
"event-handlers"=[
# application.conf: 8
"akka.event.slf4j.Slf4jEventHandler"
]
# merge of application.conf: 10,reference.conf: 12
actor {
# application.conf: 11
"default-dispatcher" {
# application.conf: 13
"fork-join-executor" {
# application.conf: 15
"parallelism-factor"=2
# application.conf: 14
"parallelism-min"=8
# application.conf: 16
"parallelism-max"=256
}
# application.conf: 12
executor="fork-join-executor"
}
# reference.conf: 13
retrieveBodyParserTimeout="1 second"
}
}
}
答案 0 :(得分:1)
实际使用的线程数是并行因子* availableProcessors以min和max为界。根据文件:
“#如果您设置了”executor =“fork-join-executor”“,将使用此选项 fork-join-executor { #最小线程数将基于因子的并行数量限制为 parallelism-min = 8
# The parallelism factor is used to determine thread pool size using the
# following formula: ceil(available processors * factor). Resulting size
# is then bounded by the parallelism-min and parallelism-max values.
parallelism-factor = 3.0
# Max number of threads to cap factor-based parallelism number to
parallelism-max = 64
}
“ - http://doc.akka.io/docs/akka/2.2.3/general/configuration.html
答案 1 :(得分:0)
你告诉Akka每个处理器可以有10个线程,但是线程总数限制在64个。
您可以降低parallelism-factor
或提升parallelism-max
(显然正在进行负载测试,以确定哪个实际上对您的应用效果更好)。