线上线程池配置是个小问题,但是不当的选用也可能会成为我们系统的瓶颈,甚至导致系统崩溃,因此这个问题不能忽略,且要实践出真知。
下面我们分析一波,怎么配置会让我们系统处理能力更快?
一.什么会影响系统处理能力?
首先我们几乎可以忽略队列本身占内存的情况,主要考虑多线程取队列数据竞争问题以及线程数量
1.关于线程数
- 线程数不能太少,太少了极有可能造成等待/排队时间过长
- 线程数也不能太多,占用过多内容
而线程池以及线程数的选用真正线程数的选用主要看压测,看看处理时间
2.线程池的分配方式
单一变量原则,我们可以固定我们的线程数量来进行压测看看,比如说我们固定要创建64个线程,那么可以有以下几种线程池分配方式
- 单队列多线程 1*64
- 多队列单线程 64*1
- 多队列多线程 M*N=64
3. 3种方式主要区别在哪里呢?
- 如果我们是单队列多线程,那么就存在一个多个线程去同一个队列中抢夺资源的情况
- 而多个队列单线程,则没有竞争问题,但是存在另外一个问题,如果我们某个队列放了一个非常耗时的数据,比如说50s处理完,那么分配给这个队列的请求全部进入等待队列,这样极有可能出现oom的情况。
- M*N算折中办法
二. 压测实践出真知
我们先要找出最优情况,在没有慢请求的情况下64*1的速度必然是处理速度最快的,然后我们可以进行多种情况压测,看看谁最接近我们最优情况那就是哪个配置更适合我们。
通常情况下慢查询比较多可以少队列,多线程,如果查询速度非常快,可以偏向于用多队列单线程,选择方向即少竞争,少阻塞,最终配置要看压测,这玩意很玄,想直接数学计算不太行
网友评论