精华内容
下载资源
问答
  • java线程池大小设置

    2020-07-10 06:39:17
    如果是CPU密集型应用,则线程池大小设置为N+1 如果是IO密集型应用,则线程池大小设置为2N+1 这个说法到底是不是正确的呢? 其实这是极不正确的。那为什么呢? 首先我们从反面来看,假设这个说法是成立的,那我们在一...

    一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)

    • 如果是CPU密集型应用,则线程池大小设置为N+1
    • 如果是IO密集型应用,则线程池大小设置为2N+1
      这个说法到底是不是正确的呢?
      其实这是极不正确的。那为什么呢?
      首先我们从反面来看,假设这个说法是成立的,那我们在一台服务器上部署多少个服务都无所谓了。因为线程池的大小只能服务器的核数有关,所以这个说法是不正确的。那具体应该怎么设置大小呢?
      假设这个应用是两者混合型的,其中任务即有 CPU 密集,也有 IO 密集型的,那么我们改怎么设置呢?是不是只能抛硬盘来决定呢?
      在这里插入图片描述
      Little’s Law(利特尔法则)
      一个系统请求数等于请求的到达率与平均每个单独请求花费的时间之乘积
      同样,我们可以使用利特尔法则(Little’s law)来判定线程池大小。我们只需计算请求到达率和请求处理的平均时间。然后,将上述值放到利特尔法则(Little’s law)就可以算出系统平均请求数。估算公式如下
      线程池大小 = ((线程 IO time + 线程 CPU time )/线程 CPU time ) CPU数目*
      具体实践
      通过公式,我们了解到需要 3 个具体数值
      一个请求所消耗的时间 (线程 IO time + 线程 CPU time)
      该请求计算时间 (线程 CPU time)
      CPU 数目

    CPU 计算时间 = 请求总耗时 - CPU IO time
    假设该请求有一个查询 DB 的操作,只要知道这个查询 DB 的耗时(CPU IO time),计算的时间不就出来了嘛,我们看一下怎么才能简洁,明了的记录 DB 查询的耗时

    如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许合理,具体还需自行测试验证。
    但是,IO优化中,这样的估算公式可能更适合:
    最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
    因为很显然,线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
    下面举个例子:
    比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)8=32。这个公式进一步转化为:
    最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1) CPU数目

    刚刚说到的线程池大小的经验值,其实是这种公式的一种估算值

    展开全文
  • 如何决定 Web 应用的线程池大小

    千次阅读 2015-02-15 15:14:54
    在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务。通常是通过进行大量的性能测试来完成...
    在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务。通常是通过进行大量的性能测试来完成。在一个 web 应用中同时拥有多个线程池会让决定最优线程池大小的过程变得更加复杂。本文将就这个常见的问题进行一些讨论和建议。

    线程池

    web 应用中的线程池大小决定了在指定时间内能够处理的并发请求数。如果一个 web 应用接收到的请求数高于线程池大小,多出来的请求将进入队列等待,或被拒绝。
    请注意并发和并行不是一个概念。并发请求指的是正在处理中的请求数量,在某个时间点,只有其中的一小部分能够得到 CPU 执行。而并行请求指的是正在处理的请求数量,在某个时间点,所有请求都在被 CPU 执行。
    在非阻塞型 IO 应用中,比如 NodeJS,单个线程(进程)能够同时处理多个请求。多核 CPU 处理器下,通过增加线程或进程数能够处理并行请求。
    在阻塞型 IO 应用中,比如 SpringMVC,单个线程只能同时处理一个请求。要同时处理多个并发请求的话,我们必须增加线程数量。

    计算密集型应用

    在计算密集型应用中,线程池的大小应该等同于主机中 CPU 的数量。再添加更多线程将会打断请求的处理,因为线程的上下文切换也会延迟响应时间。
    非阻塞型 IO 应用将会是 CPU 密集型的,因为在请求得到处理的时候没有线程等待时间。

    IO 等待应用

    决定 IO 等待应用的线程池大小会由于依赖于下游系统的响应时间而变得更加复杂,因为一个线程在其他系统响应之前始终是阻塞的。我们不得不像《应答者模式:I/O 阻塞型应用》中讨论的那样去增加线程的数量以提高 CPU 利用率。

    利特尔法则

    利特尔法则应用于非技术领域,比如银行,以估算处理进入银行客户所需要的银行出纳柜台的数量。
    利特尔法则在一个稳定的系统中,长时间观察到的平均顾客数量 L,等于长时间观察到的有效到达速率,λ,与平均每个顾客在系统中花费的时间之乘积:L = λW
    适用于 web 应用的利特尔法则一个系统中线程的平均数量(Threads),等于 web 请求的到达速率(WebRequests per sec),与平均每个处理的响应时间(ResponseTime)的乘积
    Threads = 线程的数量
    WebRequests per sec = 一秒内能够处理的 web 请求数
    ResponseTime = 处理一次 web 请求所需要的时间
    Threads = (WebRequests/sec) X ResponseTime
    尽管上边这个公式提供了处理进入请求的线程个数,它并没有提供线程数和 CPU 核心数之间的比率信息,比如一个 x 个 CPU 的主机需要分配多少个线程。

    测试决定线程池大小

    要找出合适的线程池大小,需要在吞吐量和响应时间之间进行权衡。先以一个最小值开始测试:一个 CPU 一个线程(也就是线程池大小 = CPU 个数),应用线程池大小与下游系统平均响应时间成正比增长,直到 CPU 使用率饱和或者响应时间开始退化为止。
    下图指出了请求数、CPU 以及响应时间等指标之间的关联关系。
    CPU Vs 请求数演示了在增加 web 应用负载时的 CPU 利用率。
    响应时间 Vs 请求数图演示了增加 web 应用负载对响应时间的影响。
    绿点指出了最佳吞吐量和响应时间。
    线程池大小 = CPU 个数
    MinimumThreads

    上图描述的是 IO 等待型应用在线程数等于 CPU 数时的情况。应用的线程在等待下游系统响应时发生了阻塞。由于线程都阻塞住了,系统响应时间因请求进入等待队列而被拉长。由于所有线程都处于阻塞状态,应用开始拒绝请求,尽管 CPU 使用率还很低。
    线程池很大
    MaximumThreads

    上图描述的是 IO 等待型应用在 web 应用中创建了很多线程的情况。由于有很多数量的线程,线程的上下文切换将会很频繁。由于不必要的线程上下文切换,尽管吞吐量还没升上去的时候应用的 CPU 使用率就已经很高了。响应时间由于被请求的处理被线程的上下文切换所打断而被拉长。
    最佳线程池大小
    OptimalThreads

    上图描述的是 IO 等待型应用在 web 应用中创建了合理数量的线程的情况。CPU 得到了有效利用,具备良好的吞吐量和较少的线程上下文切换。我们可以看到由于更少的打断(上下文切换),请求处理更加有效,应用有一个良好的响应时间。

    线程池隔离

    对于大多数 web 应用而言,只有少数几种类型的 web 请求会花费比较长的处理时间。这些慢的请求处理可能会拖累所有线程,并降低整个应用的性能。
    处理这种问题的两个方案是:
    • 为慢处理的 web 请求设置在一台独立的主机;
    • 在同一个应用中为慢处理的 web 请求分配一个独立的线程池;
    决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务。通常是通过进行大量的性能测试来完成。在一个 web 应用中同时拥有多个线程池会让决定最优线程池大小的过程变得更加复杂。
    原文链接:http://venkateshcm.com/2014/05/How-To-Determine-Web-Applications-Thread-Poll-Size/
    展开全文
  • 如何合理设置线程池大小

    千次阅读 2018-08-26 11:44:51
    接着上一篇探讨线程池留下的尾巴,如何合理的设置线程池大小。 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务、IO密集型任务、混合型任务。 任务的...

    接着上一篇探讨线程池留下的尾巴,如何合理的设置线程池大小。
    要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析:

    1. 任务的性质:CPU密集型任务、IO密集型任务、混合型任务。
    2. 任务的优先级:高、中、低。
    3. 任务的执行时间:长、中、短。
    4. 任务的依赖性:是否依赖其他系统资源,如数据库连接等。

    性质不同的任务可以交给不同规模的线程池执行。

    对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了。

    若任务对其他系统资源有依赖,如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。
    当然具体合理线程池值大小,需要结合系统实际情况,在大量的尝试下比较才能得出,以上只是前人总结的规律。

    在这篇如何合理地估算线程池大小?文章中发现了一个估算合理值的公式

    最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
    
    • 1
    • 2

    比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:

    最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目
    
    • 1
    • 2

    可以得出一个结论:
    线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
    以上公式与之前的CPU和IO密集型任务设置线程数基本吻合。

    并发编程网上的一个问题
    高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?
    (1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换
    (2)并发不高、任务执行时间长的业务要区分开看:
      a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务
      b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换
    (3)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦。

    展开全文
  • Java线程池大小的设置

    千次阅读 2018-05-31 16:31:48
    一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)如果是CPU密集型应用,则线程池大小设置为N+1如果是IO密集型应用,则线程池大小设置为2N+1如果一台服务器上只部署这一个应用并且只有这一个...
    一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)
    • 如果是CPU密集型应用,则线程池大小设置为N+1
    • 如果是IO密集型应用,则线程池大小设置为2N+1

    如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许合理,具体还需自行测试验证。
    但是,IO优化中,这样的估算公式可能更适合:
    最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
    因为很显然,线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
    下面举个例子:
    比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:
    最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目


    刚刚说到的线程池大小的经验值,其实是这种公式的一种估算值。



    链接:http://ifeve.com/how-to-calculate-threadpool-size/
    展开全文
  • 一般说来,大家认为线程池的大小经验值应该这样设置:...如果是CPU密集型应用,则线程池大小设置为N+1 如果是IO密集型应用,则线程池大小设置为2N+1 转载于:https://www.cnblogs.com/tiankafei/p/10339873.html...
  • 如何合理设置Java线程池大小

    千次阅读 2019-03-21 23:07:57
    《Java并发编程实战》一书中,Brian Goetz和合著者们为线程池大小的优化提供了不少中肯的建议。这非常重要,如果线程池中线程的数量过多,最终它们会竞争稀缺的处理器和内存资源,浪费大量的时间在上下文切换上。...
  • 线程池大小设定

    2011-02-12 11:18:53
    网上看到有人说线程池大小设定原则,其主要问题就是怕设置大了影响性能。我以前也是这么认为,因为首先书上这么写的,其次是像weblogic有自调优线程池.也间接论证了需要仔细设定线程池大小。 不过有一次心血来潮,...
  • 线程池大小设置和CPU核心数的关系

    千次阅读 2019-12-28 15:57:16
    文章目录1.线程池和CPU核心数的关系2.常见概念:CPU的核心数,CPU的线程数3.是否使用线程池就一定比使用单线程高效呢? 1.线程池和CPU核心数的关系 一般说来,大家认为...(2)如果是IO密集型应用,则线程池大小...
  • 一、大小估算首先要分析应用是计算密集型还是I/O密集型还是二者皆可对于计算密集型:有N个CPU,当线程池大小为N+1,通常能实现最优利用率。对于I/O密集型,计算方式:...
  • java线程池大小设置多少合适

    万次阅读 2019-02-22 14:28:19
    虽然线程池大小的设置受到很多因素影响,但是这里给出一个参考公式: 最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目 比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间...
  • 这篇文章将涉及一个在部署Web应用产品和Web系统性能测试中都会出现的问题:如何决定Web应用的线程池大小? 线程池(Thread Pool) 在Web应用中线程池的大小决定了在任何一个时间点应用可以处理请求的并发数。如果一...
  • Java-如何合理设置线程池大小

    千次阅读 2018-09-20 13:51:34
    如何合理的设置线程池大小。  要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务、IO密集型任务、混合型任务。 任务的优先级:高、中、低。 任务的执行...
  • 线程池大小配置,很多文章建议根据CPU核心来设定,可当今的移动处理器,有时候不会全部运行,那该如何设定? 比如androidSDK的AsyncTask,所用的线程池的corePoolSize就是Runtime.getRuntime().availableProcessors()...
  • 线程池大小设定 Java线程被一对一的映射为内核线程,Java在使用线程执行程序时,需要创建一个内核线程;当Java线程被终止时,这个内核线程也会被挥手。 Executor实现了以下四种类型的ThreadPoolExecutor 在实际生产...
  • ThreadPoolExecutor线程池大小设置

    千次阅读 2018-06-06 19:52:38
    线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能...
  • 怎样确定 Web 应用程序的线程池大小 标签(空格分隔): Thread Pool Web 本文原文是 How To Determine Web Application Thread Pool Size 继续当扩展 Web 应用程序时面临的架构问题,在这篇博客中,我将...
  • 总得来说,线程池大小(上线和理想数量)由程序所处的系统和要执行的任务资源性质和程序要执行的任务类型来决定。在学习中,我们用固定的数字去测试,只能说是小demo。而在我们程序代码中往往不会...
  • 合理选择线程池大小

    2018-04-24 19:11:07
    对于多线程下的解决方案,并不是线程量越多就越好,线程池数量的设置要考虑到很多方面,首先要确认这个线程池所处理的任务是属于CPU密集型还是IO密集型或者属于混合型。对于CPU密集型一般线程池数量为CPU核数+1,+的...
  • 一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)如果是CPU密集型应用,则线程池大小设置为N+1如果是IO密集型应用,则线程池大小设置为2N+1如果一台服务器上只部署这一个应用并且只有这一个...
  • 线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能...
  • 应该如何设置线程池大小 根据IBM提供的设置建议 The optimum size of a thread pool depends on the number of processors available and the nature of the tasks on the work queue. On an N-processor system ...
  • 线程池究竟设成多大是要看你给线程池处理什么样的任务,任务类型不同,线程池大小的设置方式也是不同的。 任务一般可分为:CPU密集型、IO密集型、混合型,对于不同类型的任务需要分配不同大小的线程池。 CPU密集...
  • (2)一开始也不要设置线程池大小,默认就是10 (3)直接部署hystrix到生产环境,如果运行的很良好,那么就让它这样运行好了 (4)让hystrix应用,24小时运行在生产环境中 (5)依赖标准的监控和报警机制来捕获到...
  • 在生产环境中部署一个短路器,一开始需要将一些关键配置设置的大一些,比如timeout超时时长,线程池大小,或信号量容量 然后逐渐优化这些配置,直到在一个生产系统中运作良好 (1)一开始先不要设置timeout超时时长...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,993
精华内容 46,797
关键字:

线程池大小