【问题标题】:Scala: corePoolSize to maximize the Actor performanceScala:corePoolSize 最大化 Actor 性能
【发布时间】:2012-06-15 22:50:33
【问题描述】:
我正在尝试基于经典的工作池模型制作一个 Scala 应用服务器。
鉴于:
- 机器有一个四核处理器
- 有一个调度器参与者,专门用于阻止网络 I/O 进行监听
- worker actor 都是非阻塞的。
为了最大限度地提高性能,corePoolSize 的最佳价值是多少?
理想情况下,当工作线程池的大小等于处理器内核的数量时,性能会最大化。
所以在这种情况下,我猜最好的值是 5(调度程序为 1,工作程序为 4),或者我可以将值设置为 4 并覆盖调度程序参与者的调度程序方法,这样它就不会与工人共享线程池。
这是正确的吗?任何建议表示赞赏。
谢谢!
【问题讨论】:
标签:
multithreading
scala
actor
【解决方案1】:
只是一些提示。
理想情况下,当工作线程池的大小等于处理器内核的数量时,性能会最大化。
不是真的。以下是如何估计可以获得最大吞吐量的线程数:
N = C * U * (1 + W/C)
其中N = number of threads、C = number of CPU cores、U = target CPU utilization rate、W/C = Waiting time to Computing time ratio(等待时间意味着 IO 等)。
但请注意,上述等式仅考虑 CPU,而 CPU 并不是唯一需要管理的资源。调整响应时间也有点不同。
老生常谈的答案是,您必须进行测试才能看到最佳选择。您可能可以使用上面的公式作为起点。另请注意,核心池大小!= 最大池大小。