相信接触过并发系统的小伙伴们基本都使用过线程池,或多或少调整过对应的参数。以 Java 中的经典模型来说,能够配置核心线程数、最大线程数、队列容量等等参数。

确定业务属性,比如IO密集型、CPU密集型、混合型等。

参考理想化的线程计算模型算出理论值。如《Java并发编程实战》一书中的理想化模型:

辅之以压测等手段对参数进行逐步调优。

本文则推荐一款工具,它不关心任务内部是如何实现的,而是通过计算运行时的各种系统指标(包括 CPU计算时间、IO等待时间、内存占用等)来直接计算线程池参数的。我们可以直接在这些参数的基础上,再配合压测进行调优,避免盲目调参。

获取当前线程的 CPU计算时间,记为 C1

计算当前任务执行需要的内存:M1 - M0

该工具的使用方法也很简单:

把你的业务代码封装为一个函数,放到 createTask 函数中。

设定 CPU使用率的期望值、队列占用内存的期望值。

执行,等待结果输出。

下面分别展示一个CPU密集型和IO密集型的输出(我们设置的 CPU 使用率期望值为 60%,队列占用内存的期望值为 10MB ):

而队列大小与任务中使用的对象大小有关,这里的内存使用是通过计算 gc 执行前后的内存大小差异得到的(本文中的例子均为 40 B)。由于该算法内部使用 System.gc() 触发 gc。但由于 gc 不一定真的会立刻执行,所以拿到的队列结果可能不一定准确,只能作为粗略参考。

总的来说,dark_magic 这款工具以任务执行时的系统指标数据为基础,计算出比较合理的线程池参数,给我们进行后续的压测调参提供了相对比较合理的参考,值得推荐。