如何在Play Framework中配置线程池优先级
How to configure ThreadPool priority in Playframework
我们在系统中有 2 个 ExecutionContext(Scala 2.11.4,Playframework 2.3.7)
- 主要上下文 - 用于系统操作工作(使用主要 Play ExecutionContext)。
- 管理 - 用于后端相关任务。
我在 application.configurations 中将它们分成了 2 个。
play {
akka {
akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = DEBUG
actor {
default-dispatcher = {
fork-join-executor {
parallelism-min = 20
parallelism-max = 20
}
}
}
}
}
contexts {
admin {
fork-join-executor {
parallelism-min = 30
parallelism-max = 30
}
}
}
有没有办法配置线程池的优先级?
目前无法配置线程优先级,因为该设置在许多平台上几乎没有影响,因此可以作为安慰剂。如果您开始并积极使用比 CPU 核心更多的线程,那么由此产生的竞争将代价高昂并且会浪费资源,因此您最好仔细调整您的线程池大小以适应 CPU 的可用核心]-绑定部分。
贴出来的配置例子让我疑惑:系统真的有30多核吗?否则 contexts.admin
调度员无论如何都无法从优先级排序中获利。
最后只有一种方法可以为特定任务保留 CPU 时间,那就是永远不要将这些核心用于任何其他任务(如果你写得低,会有其他方法级别的 C 代码和使用 Unix 实时优先级,但这很容易出错,而且胆小者不适合——犯错误会把你锁在系统之外)。
这意味着在一个有 24 个内核的系统上,它应该处理一些网络流量,与一些数据库交谈并处理一些数字,例如,我会为数字处理创建一个大小为 16 的固定线程池和一个线程池对于阻塞的数据库调用(根据最适合该数据库的连接数确定大小,比如 40)加上处理网络的 Play 和 Akka 的正常调度程序和其他杂项(既不阻塞也不 CPU密集的)。线程优先级不影响此图片。
我们在系统中有 2 个 ExecutionContext(Scala 2.11.4,Playframework 2.3.7)
- 主要上下文 - 用于系统操作工作(使用主要 Play ExecutionContext)。
- 管理 - 用于后端相关任务。
我在 application.configurations 中将它们分成了 2 个。
play {
akka {
akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = DEBUG
actor {
default-dispatcher = {
fork-join-executor {
parallelism-min = 20
parallelism-max = 20
}
}
}
}
}
contexts {
admin {
fork-join-executor {
parallelism-min = 30
parallelism-max = 30
}
}
}
有没有办法配置线程池的优先级?
目前无法配置线程优先级,因为该设置在许多平台上几乎没有影响,因此可以作为安慰剂。如果您开始并积极使用比 CPU 核心更多的线程,那么由此产生的竞争将代价高昂并且会浪费资源,因此您最好仔细调整您的线程池大小以适应 CPU 的可用核心]-绑定部分。
贴出来的配置例子让我疑惑:系统真的有30多核吗?否则 contexts.admin
调度员无论如何都无法从优先级排序中获利。
最后只有一种方法可以为特定任务保留 CPU 时间,那就是永远不要将这些核心用于任何其他任务(如果你写得低,会有其他方法级别的 C 代码和使用 Unix 实时优先级,但这很容易出错,而且胆小者不适合——犯错误会把你锁在系统之外)。
这意味着在一个有 24 个内核的系统上,它应该处理一些网络流量,与一些数据库交谈并处理一些数字,例如,我会为数字处理创建一个大小为 16 的固定线程池和一个线程池对于阻塞的数据库调用(根据最适合该数据库的连接数确定大小,比如 40)加上处理网络的 Play 和 Akka 的正常调度程序和其他杂项(既不阻塞也不 CPU密集的)。线程优先级不影响此图片。