我收集了很多元素(可以是10万或更多),处理每个元素的时间从1秒到1分不等。备注当元素进程花费1秒时,单个CPU核心被加载的时间少于100% (可能是5%或10%)。
因此,我需要以下负载平衡:
myCollection.parallelStream().forEach()启动集合处理其主要思想是创建和使用更多的线程,然后使用CPU内核进行"lite集合处理“,并在”重型“元素开始处理时减少线程。
是否可以像Java 8并行流处理期间那样设置负载平衡?
发布于 2015-02-14 14:50:04
默认情况下,并行流处理将使用常见叉连接池。这可能有许多线程与可用处理器的数量相匹配。
监视和解释CPU使用情况是一项非常重要的任务。这是复杂的事情,如超线程,省电功能,涡轮增压功能等。
发布于 2015-02-16 09:46:37
看起来你被你用来监控的任何一种工具愚弄了。没有一种“光处理”模式。当一个元素的处理只需要很短的时间周期时,它仍然在这个时间段内消耗了一个CPU的100%。您的监视工具可能会平滑这些值,例如,当您有500毫秒的满载和500毫秒的空载时,它可能会打印50%的1秒周期。但是,如果说元素已经使用了CPU的50%被处理,那将是一个完全错误的解释。
只有一种情况是,项目的处理没有完全消耗CPU,使用更多的线程可以改善核心的使用:当项目实际处理的时间很长时,即线程由于等待另一个线程或I/O操作的结果而被阻塞。您应该知道处理任务何时涉及I/O或其他线程同步(如果是这样的话,我假设您在问题中提到过)。
但是,当您一个接一个正确地处理100000个元素时,处理单个项所花费的时间并不重要,因为在一个项完成后,CPU将通过处理下一个元素来保持忙碌。因此,即使是平滑的监控工具也应该显示100%的CPU负载。如果没有,就会涉及一些阻塞,这可能是管道的后续操作或并行化框架的一般开销。然后,您必须分析I/O操作,以找到正确的策略。如果后续的I/O被证明是瓶颈,那么就无助于生成更多的线程来加速计算。
https://stackoverflow.com/questions/28513601
复制相似问题