线程池数量设置多少合适(经验值)

线程池数量
    线程数的设置需要考虑三方面的因素,服务器的配置、服务器资源的预算和任务自身的特性。具体来说就是服务器有多少个CPU,多少内存,IO支持的最大QPS是多少,任务主要执行的是计算、IO还是一些混合操作,任务中是否包含数据库连接等的稀缺资源。线程池的线程数设置主要取决于这些因素。
 如果一个请求中,计算机操作需要5ms,DB需要100ms,对于一个8核的cpu来说需要设置多少个线程
    1.可以拆分为两个线程池,cpu密集型的是n+1个线程,,IO密集型的就是n*2
    2.如果不可以拆分,就是5/(5+100),cpu的利用率是在21%,1/(5/(100+5)) *n就是168,也就是需要的线程数   

那么如何获取n的值?(也就是cpu核心数目)

int  n = Runtime.getRuntime().availableProcessors();

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

虽说最佳线程数目算法更准确,但是线程等待时间和线程CPU时间不好测量,实际情况使用得比较少,一般用经验值就差不多了

QPS说明:
QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

每秒查询率:
因特网上,经常用每秒查询率来衡量域名系统服务器的机器的性能,即为QPS。
对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。

计算关系:
QPS = 并发量 / 平均响应时间
并发量 = QPS * 平均响应时间
 

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中,线程池和阻塞队列(BlockingQueue)的选择与设置是非常关键的,因为它们直接影响了系统的并发性能和资源管理。线程池中的阻塞队列用于存储任务,当线程池中的工作线程空闲时,会从队列中取出任务执行;反之,如果任务队列满了,新提交的任务会被阻塞,直到队列中有空间。 决定队列大小的因素通常包括: 1. **系统负载**:考虑应用程序的平均请求速率以及峰值负载。如果预计请求量波动较大,可能需要较大的缓冲能力来应对高峰期。 2. **硬件限制**:比如内存大小。队列过大会消耗过多内存,影响其他部分的性能。队列过小可能导致频繁地创建和销毁线程,增加上下文切换成本。 3. **任务类型**:对于I/O密集型任务,队列可以适当大一些,因为它不需要立即处理结果;而对于计算密集型任务,队列可能需要更小,以免CPU等待IO完成。 4. **超时策略**:如果你希望在队列满时设定一个时间限制(如生产者阻塞的时间),那么队列大小应该足够容纳这个超时时间内的任务。 常用的Java阻塞队列有`ArrayBlockingQueue`、`LinkedBlockingQueue`、`PriorityBlockingQueue`等,它们的配置参数`容量`就是指队列的最大元素数量。一般来说,初始容量可以设置为核心线程数的1.5到3倍,然后根据实际情况调整。同时,也可以设置无界队列(如`LinkedList`或自定义无限大小的队列),但这样可能会导致大量内存占用。 设置合适的队列大小需要进行实际监控和测试,找到一个既满足吞吐需求又能保证系统稳定性的平衡点。如果你提供具体的应用场景或数据,我可以给出更具体的建议。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值