【发布时间】:2014-10-09 22:20:06
【问题描述】:
我在具有 32 个内核的生产服务器上的代码中的某些地方使用了 reducers 库,以利用一些并行性。但是 Fork/Join 框架似乎对内核的使用如此之多,以至于其他进程阻塞并变得无响应。
有什么方法可以限制数量吗?在 jvm 实例上,reducers 库正在使用的内核或生成的线程?
【问题讨论】:
我在具有 32 个内核的生产服务器上的代码中的某些地方使用了 reducers 库,以利用一些并行性。但是 Fork/Join 框架似乎对内核的使用如此之多,以至于其他进程阻塞并变得无响应。
有什么方法可以限制数量吗?在 jvm 实例上,reducers 库正在使用的内核或生成的线程?
【问题讨论】:
似乎无法通过函数或配置参数调整标准减速器 forkjoin 线程池大小。您需要更改 core.reducers 本身。
来自 core.reducers 来源
(def pool (delay (java.util.concurrent.ForkJoinPool.)))
这对应于没有参数的默认 java 构造函数
ForkJoinPool() 使用默认线程工厂、无 UncaughtExceptionHandler 和非异步 LIFO 处理模式创建一个并行度等于 Runtime.availableProcessors() 的 ForkJoinPool。
而不是
ForkJoinPool(int 并行度) 创建一个具有指定并行度、默认线程工厂、无 UncaughtExceptionHandler 和非异步 LIFO 处理模式的 ForkJoinPool。
至少可以选择控制内核数量是一个很好的补充(还有一个更可配置的版本 ForkJoinPool),但目前唯一的选择是分叉 core.reducers 并更改该行到您要使用的最大核心数:
(def pool (delay (java.util.concurrent.ForkJoinPool. 28)))
【讨论】: