最佳线程数实战

对于计算密集型任务,在拥有 N 个核的 CPU 的系统上,当线程池大小为 N+1 时,通常能实现最优的利用率,(即当计算密集型任务偶尔由于页缺失故障或者其他原因而暂停时,这个额外的现线程也能够确保CPU的时钟周期不会被浪费) 

对于IO密集型任务,Java 并发编程实战中有一个公式:

Ncpu = number of CPUs 

Ucpu = target CPU utilization, 0 <= Ucpu <= 1 


-  =  ratio of wait time to compute time 

要使处理器达到期望的利用率,线程池的最优大小为: 

Nthreads = Ncpu * Ucpu * (1 + W/C) 

比如我的线上是 8C-16G-200G 的容器,Ucpu 一般水位在 60%, wait time 假设 30ms,compute time 2ms,则

线程数 = 8 * 60% *  (1 + 30/2) = 76.8,那么线程数设置 77 可能就是最佳值,具体可以根据具体压测值或者线上最佳实践来设置,这里只是个预估公式,不一定准,可以减少我们初期的试错次数。

发布了159 篇原创文章 · 获赞 350 · 访问量 55万+

猜你喜欢

转载自blog.csdn.net/wenniuwuren/article/details/103241969
今日推荐