设置线程池大小 · 贰白

线程池大小多少合适?

概述

通常来说,服务分为两种类型:

也叫计算密集型,当计算机完成任务的时间主要取决于CPU的速度时,计算机受CPU限制(或计算限制):CPU利用率很高,可能在100%的使用时间内持续很多秒或分钟。外围设备产生的中断可能会被缓慢处理或无限期延迟处理。

  • IO密集型

完成计算所花费的时间主要由等待I/O操作完成所花费的时间来确定。 这与CPU密集的任务相反。 当请求数据的速率低于其消耗速率时,或者换句话说,请求数据所花费的时间多于处理数据所花费的时间,就会出现这种情况。

那有没有可以落地的实践方法指导呢?Little’s Law

一个系统请求数=请求的到到达率*平均每个单独请求花费的时间

利用Little’s Law判定线程池大小,也就是

线程池大小 = (线程IO时间+线程CPU时间) / 线程CPU时间 / CPU数目

所需数值分别为:

  • 一个请求所消耗的时间

    • 线程IO时间+线程CPU时间
  • 该请求计算时间
    • 线程CPU时间
  • CPU数目

请求消耗时间

Web服务中,可以通过Filter来拦截获取该请求前后消耗的时间

1

2

3

4

5

6

7

8

9

10

11
public class  implements Filter{

public void doFilter(ServletRequest request, ServletResponse response){

long start = System.currentTimeMillis();

try{

}finally{

long cost = System.currentTimeMillis() - start;

}

}

}

CPU计算时间

CPU计算时间 = 请求总耗时 - CPU IO时间

假设该请求有一个查询DB的操作,只要查询DB的耗时,也就是CPU IO时间,就可以得出CPU计算时间。

可以通过JDK动态代理或者是CGLIB的方式添加AOP切面,来获取线程IO耗时。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
public class DaoInterceptor implements MethodInterceptor{

@override

public Object invoke(MethodInvocation invocation) throws Throwable{

StopWatch watch = new StopWatch();

watch.start();

Object result = null;

Throwable t = null;

try{

result = invocation.proceed();

}catch(Exception ex){

//handle ex

}finally{

// 得出时间

watch.stop();

}

return result;

}

}

CPU数目

1
cat /proc/cpuinfo | grep "processor" | wc -l

总结

还是需要通过压测来进行微调,以保证配置的正确性。

原文:大专栏  设置线程池大小 · 贰白

原文地址:https://www.cnblogs.com/chinatrump/p/11614932.html

时间: 2024-10-06 00:42:59

设置线程池大小 · 贰白的相关文章

线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事

线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所进行的工作的性质: IO密集型 CPU密集型 简单的分析来看,如果是CPU密集型的任务,我们应该设置数目较小的线程数,比如CPU数目加1.如果是IO密集型的任务,则应该设置可能多的线程数,由于IO操作不占用CPU,所以,不能让CPU闲下来.当然,如果线程数目太多,那么线程切换所带来的开销又会对系统的

如何设置tomcat线程池大小?

背景 在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢?接下来,我将介绍本人是怎么设计以及计算的. 目标 确定tomcat服务器线程池大小 具体方法 众所周知,tomcat接受一个request后处理过程中,会设计到cpu的时间和IO等待的时间.其中IO等待时,cpu被动放弃执行,其他线程就可以利用这段时间片进行操作. 所以我们可以采用服务器IO优化的通用规则: 线程大小 = ( (线程io时间 + 线程cpu)  / 线程c

如何合理地估算线程池大小?

本文转自:http://ifeve.com/how-to-calculate-threadpool-size/ 如何合理地估算线程池大小? 这个问题虽然看起来很小,却并不那么容易回答.大家如果有更好的方法欢迎赐教,先来一个天真的估算方法:假设要求一个系统的 TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s.那么 问题转化为: 如何设计

如何决定 Web 应用的线程池大小

在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务.通常是通过进行大量的性能测试来完成.在一个 web 应用中同时拥有多个线程池会让决定最优线程池大小的过程变得更加复杂.本文将就这个常见的问题进行一些讨论和建议. 线程池 web 应用中的线程池大小决定了在指定时间内能够处理的并发请求数.如果一个 web 应用接收到的请求数高于线程池大小,多出来的请求将进入队列

如何决定Web应用的线程池大小

线程池(Thread Pool)在Web应用中线程池的大小决定了在任何一个时间点应用可以处理请求的并发数.如果一个系统收到的请求数超过了线程池的大小,那么超出的请求要么进入等待队列要么被拒绝.请注意,并发和并行是不同的.并发请求是指在任何一个时间点,所有被处理的请求中只有只有很少一部分占用CPU(译者注:轮流使用CPU).并行是指在任何一个时间点,所有被处理的请求同时在CPU上运行.在非阻塞式(NO-Blocking)应用中(如NodeJs),一个单独的线程或进程可以并发处理多个请求.而在多核C

.Net连接字符串设置连接池大小显著提高数据库速度

在访问mysql数据库时,如果在连接字符串中设置使用连接池,同时设置连接池大小,经测试,可以显著提高访问数据库时的速度. 连接字符串: connectionStrings>    <add name="connectionstr" connectionString="Database=userDB;Data Source=localhost;User Id=root;Password=abcabc;CharSet=utf8;port=3306;Pooling=tr

发一个可伸缩线程池大小的python线程池。已通过测试。

发一个可伸缩线程池大小的线程池. 当任务不多时候,不开那么多线程,当任务多的时候开更多线程.当长时间没任务时候,将线程数量减小到一定数量. """ 可自动实时调节线程数量的线程池. """ import atexit import queue import sys import threading import time import weakref from app.utils_ydf import LoggerMixin, nb_print,

ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue):中篇中主要聊聊与keepA

ThreadPoolExecutor使用和思考-线程池大小设置与BlockingQueue的三种

工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue):中篇中主要聊聊与keepA