1

我在具有 32 个内核的生产服务器上的代码中的某些地方使用了 reducers 库,以利用一些并行性。但是 Fork/Join 框架似乎对内核的使用如此之多,以至于其他进程阻塞并变得无响应。

有什么方法可以限制没有。jvm 实例上的reducers 库正在使用的内核或生成的线程?

4

1 回答 1

2

似乎无法通过函数或配置参数调整标准减速器 forkjoin 线程池大小。你需要改变core.reducers自己。

来自 core.reducers 源

(def pool (delay (java.util.concurrent.ForkJoinPool.)))

这对应于没有参数的默认 java 构造函数

ForkJoinPool() 使用默认线程工厂、无 UncaughtExceptionHandler 和非异步 LIFO 处理模式创建一个并行度等于 Runtime.availableProcessors() 的 ForkJoinPool。

代替

ForkJoinPool(int parallelism) 创建具有指定并行度、默认线程工厂、无 UncaughtExceptionHandler 和非异步 LIFO 处理模式的 ForkJoinPool。

至少可以选择控制内核数量(还有一个更可配置的版本ForkJoinPool),这将是一个很好的补充,但目前唯一的选择是分叉 core.reducers 并将该行更改为您要使用的最大内核数:

(def pool (delay (java.util.concurrent.ForkJoinPool. 28)))
于 2014-08-16T21:16:55.970 回答