怎么配置tomcat,才能使得自己的服务效率更高呢? 首先,这和tomcat的使用的IO模式有关 关于Java IO模式、以及IO处理的线程模型等基础的通信框架的知识,是Java程序员的重要、必备的内功,具体请参见尼恩编著的《Netty、Zookeeper、Redis高并发实战》一书,这里不做过多的赘述。 尤其是以下三个配置项:maxConnections、maxThreads、acceptCount。 1.4.1Tomcat的高效配置Tomcat的maxConnections、maxThreads、acceptCount三大配置,分别表示最大连接数,最大线程数、最大的等待数,可以通过application.yml配置文件来改变这个三个值,一个标准的示例如下: server: tomcat: uri-encoding: UTF-8 #最大工作线程数,默认200, 4核8g内存,线程数经验值800 #操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。 max-threads: 1000 # 等待队列长度,默认100 accept-count: 1000 max-connections: 20000 # 最小工作空闲线程数,默认10, 适当增大一些,以便应对突然增长的访问量 min-spare-threads: 100 1.4.2详解:maxConnections、maxThreads、acceptCounttomcat中maxConnections、maxThreads、acceptCount的具体含义是什么呢?参考官方文档,对三者的含义说明如下: 一、accept-count:最大等待数官方文档的说明为:当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。当队列已满时,任何的连接请求都将被拒绝。accept-count的默认值为100。 二、maxThreads:最大线程数每一次HTTP请求到达Web服务,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了Web服务容器可以同时处理多少个请求。maxThreads默认200,肯定建议增加。但是,增加线程是有成本的,更多的线程,不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以,更多的线程异味着需要更多的内存。线程数的经验值为:1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800。 三、maxConnections:最大连接数官方文档的说明为: 这个参数是指在同一时间,tomcat能够接受的最大连接数。对于Java的阻塞式BIO,默认值是maxthreads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。对于Java 新的NIO模式,maxConnections 默认值是10000。 1.4.3图解:maxConnections、maxThreads、acceptCount关系用一个形象的比喻,通俗易懂的解释一下tomcat的最大线程数(maxThreads)、最大等待数(acceptCount)和最大连接数(maxConnections)三者之间的关系。 我们可以把tomcat比做一个火锅店,流程是取号、入座、叫服务员,可以做一下三个形象的类比: 整个就餐的流程,大致如下:(1)取号:如果maxConnections连接数没有满,就不需要取号,因为还有空余的餐桌,直接被大堂服务员领上餐桌,点菜就餐即可。如果 maxConnections 连接数满了,但是取号人数没有达到 acceptCount,则取号成功。如果取号人数已达到acceptCount,则拿号失败,会得到Tomcat的Connection refused connect 的回复信息。 maxConnections、maxThreads、acceptCount关系图如下__EOF__ |
|