重要参数
-
maxThread
:tomcat的maxThread
指的是处理业务的最大线程数,位于Connector组件的层次,在springboot中由server.tomcat.max-threads
参数决定,默认是200 -
acceptCount
:当前线程数达到maxThread的时候,等待队列的最大长度,默认为100
tomcat接收请求创建线程的过程
- 1、如果当前线程数还没达到maxThread,则新建一个线程去执行任务
- 2、如果已经达到了maxThread,但是等待队列中的任务还没有达到acceptCount,则将请求任务放入等待队列中,直到有线程空闲下来
- 3、如果线程数达到maxThread并且等待队列已满,则拒绝请求
参数设置的依据
从计算机的角度来说,一个CPU同一时间只能执行一个线程的任务,单CPU多线程只是计算机给我们开的玩笑。
一般来说,服务的瓶颈主要有两种:
- CPU
- IO等待时间
我们从这两个角度来分析maxThread
应该如何设置:
- CPU
如果不考虑IO,也就是说服务器很少去做磁盘操作或者网络请求,那maxThread
设置为与CPU数目同等的大小是最合适的,因为没有IO等待时间,CPU利用率百分百,线程与CPU数量一致,可以消除线程上下文切换带来的消耗 - IO
如果tomcat服务调用了mysql,那么会带来网络IO和磁盘IO的消耗,我们知道CPU发起IO操作的指令之后,就处于空闲状态,IO操作交给DMA处理。一般情况下我们的接口服务中不会有太多的计算,大多数瓶颈都在于数据库、磁盘、rpc服务调用的操作上,因此可以将maxThread
的值调大一些,让CPU尽可能处理更多的请求,当然也要考虑到线程上下文切换的开销,也是会消耗CPU的
总结
本文只是从理论的角度讨论了maxThread
设置的凭据,如果是CPU密集型的服务,设置线程数不宜多;如果是IO密集型,适当地上调线程数可以增加吞吐量
网友评论